Bu, aynı şeyi yapan alternatif bir tekniktir. Kabul edilen cevap işe yarıyor, ancak alfa kanalları olan görüntülerle (PngBitmapEncoder'a geçtikten sonra bile) sorunla karşılaştım. Bu teknik, aynı zamanda daha hızlı olabilir, çünkü uyumlu piksel formatına dönüştürüldükten sonra piksellerin ham bir kopyası.
public Bitmap BitmapFromSource(System.Windows.Media.Imaging.BitmapSource bitmapsource)
{
//convert image format
var src = new System.Windows.Media.Imaging.FormatConvertedBitmap();
src.BeginInit();
src.Source = bitmapsource;
src.DestinationFormat = System.Windows.Media.PixelFormats.Bgra32;
src.EndInit();
//copy to bitmap
Bitmap bitmap = new Bitmap(src.PixelWidth, src.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var data = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
src.CopyPixels(System.Windows.Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
bitmap.UnlockBits(data);
return bitmap;
}
Bir sorun var: saydamlığı kaybedersiniz (alfa kanalı olan bir bitmap için). – sibvic