1

我正在尝试裁剪来自字节数组的图像。不幸的是,我在cropImage 函数中得到了OutofMemory 异常。这部分展示了我如何将其写入文件。

System.IO.MemoryStream ms = new System.IO.MemoryStream(strArr);

System.Drawing.Rectangle oRectangle = new System.Drawing.Rectangle();
oRectangle.X = 50;
oRectangle.Y = 100;
oRectangle.Height = 180;
oRectangle.Width = 240;

System.Drawing.Image oImage = System.Drawing.Image.FromStream(ms);
cropImage(oImage, oRectangle);
name = DateTime.Now.Ticks.ToString() + ".jpg";
System.IO.File.WriteAllBytes(context.Server.MapPath(name), strArr);
context.Response.Write("http://local.x.com/test/" + name);

这部分是我的裁剪图像功能,很明显它在做什么..

private static System.Drawing.Image cropImage(System.Drawing.Image img, System.Drawing.Rectangle cropArea)
{
    System.Drawing.Bitmap bmpImage = new System.Drawing.Bitmap(img);
    System.Drawing.Bitmap bmpCrop = bmpImage.Clone(cropArea,
    bmpImage.PixelFormat);
    return (System.Drawing.Image)(bmpCrop);
}

这就是我构建我的 strArr 的方式

System.IO.Stream str = context.Request.InputStream;
int strLen = Convert.ToInt32(str.Length);
byte[] strArr = new byte[strLen];
str.Read(strArr, 0, strLen);
string st = String.Concat(Array.ConvertAll(strArr, x => x.ToString("X2"))); // try 4
4

2 回答 2

0

不建议在 ASP.NET 中使用 System.Drawing 命名空间。MSDN:

不支持在 Windows 或 ASP.NET 服务中使用 System.Drawing 命名空间中的类。尝试从这些应用程序类型之一中使用这些类可能会产生意想不到的问题,例如服务性能下降和运行时异常。有关受支持的替代方法,请参阅 Windows 映像组件。

于 2012-07-13T09:18:44.163 回答
0

我直接从字节数组中裁剪它,它只是工作:) 感谢所有尽力帮助我的人。

public byte[] CropImage(int x, int y, int w, int h, byte[] imageBytes)
    {
        using (MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
        {
            ms.Write(imageBytes, 0, imageBytes.Length);
            System.Drawing.Image img = System.Drawing.Image.FromStream(ms, true);
            Bitmap bmpCropped = new Bitmap(w, h);
            Graphics g = Graphics.FromImage(bmpCropped);

            Rectangle rectDestination = new Rectangle(0, 0, bmpCropped.Width, bmpCropped.Height);
            Rectangle rectCropArea = new Rectangle(x, y, w, h);

            g.DrawImage(img, rectDestination, rectCropArea, GraphicsUnit.Pixel);
            g.Dispose();

            MemoryStream stream = new MemoryStream();
            bmpCropped.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            return stream.ToArray();
        }
    }
于 2012-08-13T09:27:52.543 回答