C# 从BitmapImage到字节数组的转换导致内存使用率高
我有jpeg。 我将其转换为位图图像。 然后降低质量(压缩)。 然后我转换为字节数组。 我发现任务管理器中的内存升级非常快 我确信我正在尽我所能处理一切 这是我的代码:C# 从BitmapImage到字节数组的转换导致内存使用率高,c#,memory,image-processing,bitmapimage,C#,Memory,Image Processing,Bitmapimage,我有jpeg。 我将其转换为位图图像。 然后降低质量(压缩)。 然后我转换为字节数组。 我发现任务管理器中的内存升级非常快 我确信我正在尽我所能处理一切 这是我的代码: //I am calling this from within a timer set 500ms byte[] datatest = JpegXr.SaveJpegXrToBytes((Bitmap)frame.Clone(), 40f); frame.Dispose(); public static class Jpeg
//I am calling this from within a timer set 500ms
byte[] datatest = JpegXr.SaveJpegXrToBytes((Bitmap)frame.Clone(), 40f);
frame.Dispose();
public static class JpegXr
{
public static 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 bitmap; <-- leads to problems, stream is closed/closing ...
return new Bitmap(bitmap);
}
}
public static byte[] SaveJpegXrToBytes(Bitmap bitmap, float quality)
{
byte[] data = null;
var stream = new MemoryStream();
SaveJpegXr(bitmap, quality, stream);
stream.Seek(0, SeekOrigin.Begin);
data= stream.ToArray();
stream.Close();
bitmap.Dispose();
return data;
}
private static BitmapImage Bitmap2BitmapImage(Bitmap bitmap)
{
BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero, System.Windows.Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
//BitmapSource bitmapSource = Clipboard.GetImage();
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
BitmapImage bImg = new BitmapImage();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.Save(memoryStream);
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(memoryStream.ToArray());
bImg.EndInit();
memoryStream.Close();
bitmap.Dispose();
return bImg;
//return (BitmapImage)i;
//return i;
}
private static void SaveJpegXr(Bitmap bitmap, float quality, Stream output)
{
BitmapImage bitmapSource = Bitmap2BitmapImage((Bitmap)bitmap.Clone());
//var bitmapSource = bitmap.ToWpfBitmap();
var bitmapFrame = BitmapFrame.Create(bitmapSource);
var jpegXrEncoder = new WmpBitmapEncoder();
jpegXrEncoder.Frames.Add(bitmapFrame);
jpegXrEncoder.ImageQualityLevel = quality / 100f;
jpegXrEncoder.Save(output);
bitmap.Dispose();
}
}
//我在一个500毫秒的计时器内调用这个
byte[]datatest=JpegXr.SaveJpegXrToBytes((位图)frame.Clone(),40f);
frame.Dispose();
公共静态类JpegXr
{
公共静态位图BitmapImage2Bitmap(BitmapImage BitmapImage)
{
//BitmapImage BitmapImage=新的BitmapImage(新Uri(“../Images/test.png”,UriKind.Relative));
使用(MemoryStream outStream=新MemoryStream())
{
BitMapEnc=新的BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
加密保存(扩展);
System.Drawing.Bitmap Bitmap=新的System.Drawing.Bitmap(扩展);
//返回位图;您应该处理()当你使用完位图后,它将显示在位图上。这样做会降低内存使用率。您好,是的,我的错误是忘记了在这个问题中包含这行代码。这是在我的实际代码中处理的,因此这不是答案。不幸的是,我非常感谢您的时间。谢谢您无需将位图转换为位图以保存为JPEG,只需拨打电话bitmap.Save()。您应该编辑您的问题,以概述您试图实现的目标。您是否从网络摄像头抓取帧并保存它们,等等…?是的,我知道所有这些。但我的问题在这里是具体的。存在内存泄漏,我重点关注此问题。您可以使用CLR Profiler或DebugdDiag进行分析。