BitmapImage를 Bitmap으로 또는 그 반대로 변환
C #에 BitmapImage가 있습니다. 이미지 작업을해야합니다. 예를 들어 그레이 스케일링, 이미지에 텍스트 추가 등
Bitmap을 받아들이고 Bitmap을 반환하는 그레이 스케일링에 대한 stackoverflow에서 함수를 찾았습니다.
따라서 BitmapImage를 Bitmap으로 변환하고 작업을 수행 한 다음 다시 변환해야합니다.
어떻게 할 수 있습니까? 이것이 최선의 방법입니까?
외국 도서관을 사용할 필요가 없습니다.
BitmapImage를 Bitmap으로 변환 :
private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
// BitmapImage bitmapImage = new BitmapImage(new Uri("../Images/test.png", UriKind.Relative));
using(MemoryStream outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
enc.Save(outStream);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
return new Bitmap(bitmap);
}
}
Bitmap을 다시 BitmapImage로 변환하려면 :
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
private BitmapImage Bitmap2BitmapImage(Bitmap bitmap)
{
IntPtr hBitmap = bitmap.GetHbitmap();
BitmapImage retval;
try
{
retval = (BitmapImage)Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return retval;
}
다음은 Bitmap을 BitmapImage로 변환하는 확장 메서드입니다.
public static BitmapImage ToBitmapImage(this Bitmap bitmap)
{
using (var memory = new MemoryStream())
{
bitmap.Save(memory, ImageFormat.Png);
memory.Position = 0;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
return bitmapImage;
}
}
BitmapImage에서 Bitmap으로 이동해야하는 경우 매우 쉽습니다.
private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
return new Bitmap(bitmapImage.StreamSource);
}
System.Windows.Interop 사용; ...
private BitmapImage Bitmap2BitmapImage(Bitmap bitmap)
{
BitmapSource i = Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
return (BitmapImage)i;
}
나는 방금 내 코드에서 위의 내용을 사용하려고 시도했으며 Bitmap2BitmapImage 함수에 문제가 있다고 생각합니다 (그리고 아마도 다른 것도 가능합니다).
using (MemoryStream ms = new MemoryStream())
Does the above line result in the stream being disposed of? Which means that the returned BitmapImage loses its content.
As I'm a WPF newbie I'm not sure that this is the correct technical explanation, but the code didn't work in my application until I removed the using directive.
Here the async version.
public static Task<BitmapSource> ToBitmapSourceAsync(this Bitmap bitmap)
{
return Task.Run(() =>
{
using (System.IO.MemoryStream memory = new System.IO.MemoryStream())
{
bitmap.Save(memory, ImageFormat.Png);
memory.Position = 0;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
return bitmapImage as BitmapSource;
}
});
}
This converts from System.Drawing.Bitmap to BitmapImage:
MemoryStream ms = new MemoryStream();
YOURBITMAP.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
BitmapImage image = new BitmapImage();
image.BeginInit();
ms.Seek(0, SeekOrigin.Begin);
image.StreamSource = ms;
image.EndInit();
Thanks Guillermo Hernandez, I created a variation of your code that works. I added the namespaces in this code for reference.
System.Reflection.Assembly theAsm = Assembly.LoadFrom("My.dll");
// Get a stream to the embedded resource
System.IO.Stream stream = theAsm.GetManifestResourceStream(@"picture.png");
// Here is the most important part:
System.Windows.Media.Imaging.BitmapImage bmi = new BitmapImage();
bmi.BeginInit();
bmi.StreamSource = stream;
bmi.EndInit();
ReferenceURL : https://stackoverflow.com/questions/6484357/converting-bitmapimage-to-bitmap-and-vice-versa
'IT TIP' 카테고리의 다른 글
UIImagePickerController가 화면을 채우지 않습니다. (0) | 2020.12.28 |
---|---|
C #은 foreach의 if 문을 기반으로 목록의 다음 항목으로 이동합니다. (0) | 2020.12.28 |
인라인 블록 요소를 중앙에 배치 할 수 있습니까? 그렇다면 어떻게해야합니까? (0) | 2020.12.28 |
Amazon RDS 데이터베이스 서버 인스턴스에서 "mysqladmin flush-hosts"명령을 실행하는 방법은 무엇입니까? (0) | 2020.12.28 |
Microsoft SQL Server Management Studio를 사용하여 데이터베이스의 모든 트리거에 대한 스크립트를 생성하는 방법 (0) | 2020.12.28 |