Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从BitmapImage到字节数组的转换导致内存使用率高_C#_Memory_Image Processing_Bitmapimage - Fatal编程技术网

C# 从BitmapImage到字节数组的转换导致内存使用率高

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

我有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进行分析。