从内存中提取图像

本文关键字:图像 提取 内存 | 更新日期: 2023-09-27 18:01:50

我的程序一直抛出这个该死的错误,我完全不知道为什么。我已经在网上搜索了,但到目前为止,我还没有找到任何真正的答案。任何帮助都会很感激。谢谢。

    private Bitmap rotateImage(Bitmap b, float angle)
    {
        //create a new empty bitmap to hold rotated image
        Bitmap returnBitmap = new Bitmap(b.Width, b.Height,System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        //make a graphics object from the empty bitmap
        Graphics g = Graphics.FromImage(returnBitmap);
        //move rotation point to center of image
        g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
        //rotate
        g.RotateTransform((int)angle);
        //move image back
        g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
        //draw passed in image onto graphics object
        b = (Bitmap)b.GetThumbnailImage(b.Width, b.Height, null, IntPtr.Zero);
        g.DrawImage(b, new Point(0, 0)); // Here is the error.
        b.Dispose();
        g.Dispose();
        return returnBitmap;
    }

编辑:错误是:"内存不足",它似乎大约。运行程序10秒后。在此之前,程序运行良好。

从内存中提取图像

在Microsoft docs for Image.GetThumbnailImage中,它声明:

回调

类型:System.Drawing.Image.GetThumbnailImageAbort

形象。GetThumbnailImageAbort委托。

注意您必须创建一个委托并传递一个引用给该委托作为回调参数,但未使用委托。

也许你应该添加那个委托。

Image.GetThumbnailImageAbort abortCallback =
    new Image.GetThumbnailImageAbort(() => false);
b = (Bitmap)b.GetThumbnailImage(b.Width, b.Height, abortCallback, IntPtr.Zero);

我不确定这是否有帮助,但您可以尝试此代码并报告错误是否仍然存在?

private Bitmap rotateImage(Bitmap b, float angle)
{
    using (var returnBitmap = new Bitmap(b.Width, b.Height,System.Drawing.Imaging.PixelFormat.Format32bppArgb))
    {
        using (var g = Graphics.FromImage(returnBitmap))
        {
            g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
            g.RotateTransform((int)angle);
            g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
            b = (Bitmap)b.GetThumbnailImage(b.Width, b.Height, null, IntPtr.Zero);
            g.DrawImage(b, new Point(0, 0)); // Is the error still present?
            return returnBitmap;
        }
    }
}