비트맵 소스와 비트맵을 변환하는 좋은 방법이 있습니까?
비트맵 소스에서 비트맵으로 변환하는 유일한 방법은 안전하지 않은 코드를 사용하는 것입니다.다음과 같이(Lesters WPF 블로그에서):
myBitmapSource.CopyPixels(bits, stride, 0);
unsafe
{
fixed (byte* pBits = bits)
{
IntPtr ptr = new IntPtr(pBits);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
width,
height,
stride,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb,ptr);
return bitmap;
}
}
반대로 하는 방법:
System.Windows.Media.Imaging.BitmapSource bitmapSource =
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
프레임워크에서 더 쉬운 방법이 있습니까?그리고 그것이 그 안에 없는 이유는 무엇입니까(그렇지 않다면)?저는 그것이 꽤 유용하다고 생각합니다.
제가 그것을 필요로 하는 이유는 WPF 앱에서 특정 이미지 작업을 수행하기 위해 AForge를 사용하기 때문입니다.WPF는 비트맵 소스/이미지 소스를 표시하려고 하지만 AForge는 비트맵에서 작동합니다.
안전하지 않은 코드를 사용하지 않고 할 수 있습니다.Bitmap.LockBits
에서 픽셀을 복사합니다.BitmapSource
곧장Bitmap
Bitmap GetBitmap(BitmapSource source) {
Bitmap bmp = new Bitmap(
source.PixelWidth,
source.PixelHeight,
PixelFormat.Format32bppPArgb);
BitmapData data = bmp.LockBits(
new Rectangle(Point.Empty, bmp.Size),
ImageLockMode.WriteOnly,
PixelFormat.Format32bppPArgb);
source.CopyPixels(
Int32Rect.Empty,
data.Scan0,
data.Height * data.Stride,
data.Stride);
bmp.UnlockBits(data);
return bmp;
}
다음 두 가지 방법을 사용할 수 있습니다.
public static BitmapSource ConvertBitmap(Bitmap source)
{
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
source.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
public static Bitmap BitmapFromSource(BitmapSource bitmapsource)
{
Bitmap bitmap;
using (var outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapsource));
enc.Save(outStream);
bitmap = new Bitmap(outStream);
}
return bitmap;
}
저한테 딱 맞습니다.
이것이 당신이 찾는 것입니까?
Bitmap bmp = System.Drawing.Image.FromHbitmap(pBits);
리소스 사전 내의 비트맵 리소스(Windows에서 자주 사용되는 Resources.resx가 아님)에 투명 배경을 설정하는 코드입니다.양식 연령).구성 요소 초기화() 전에 이 메서드를 메서드라고 합니다.위의 melvas의 게시물에는 'ConvertBitmap(비트맵 소스)' 메서드와 BitmapFromSource(비트맵 소스) 메서드가 언급되어 있습니다.
private void SetBitmapResourcesTransparent()
{
Image img;
BitmapSource bmpSource;
System.Drawing.Bitmap bmp;
foreach (ResourceDictionary resdict in Application.Current.Resources.MergedDictionaries)
{
foreach (DictionaryEntry dictEntry in resdict)
{
// search for bitmap resource
if ((img = dictEntry.Value as Image) is Image
&& (bmpSource = img.Source as BitmapSource) is BitmapSource
&& (bmp = BitmapFromSource(bmpSource)) != null)
{
// make bitmap transparent and assign it back to ressource
bmp.MakeTransparent(System.Drawing.Color.Magenta);
bmpSource = ConvertBitmap(bmp);
img.Source = bmpSource;
}
}
}
}
이것은 깔끔하고 빛보다 빠릅니다.
return Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero,
Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions() );
두 네임스페이스 간에 픽셀 데이터를 공유할 수 있습니다.변환할 필요가 없습니다.
공유 비트맵 원본을 사용합니다.https://stackoverflow.com/a/32841840/690656
언급URL : https://stackoverflow.com/questions/2284353/is-there-a-good-way-to-convert-between-bitmapsource-and-bitmap
'programing' 카테고리의 다른 글
PowerShell 어레이 초기화 (0) | 2023.05.11 |
---|---|
MongoDB 'collection'에서 모든 'documents' 가져오기 (0) | 2023.05.11 |
각도 2의 단추를 사용하여 다른 페이지로 이동합니다. (0) | 2023.05.11 |
Eclipse는 다음과 같이 말합니다. "작업 공간이 사용 중이거나 만들 수 없습니다. 다른 작업 공간을 선택하십시오."작업영역 잠금을 해제하려면 어떻게 해야 합니까? (0) | 2023.05.11 |
Pandas에서 CSV 파일을 읽을 때 UnicodeDecodeError가 발생 (0) | 2023.05.11 |