1

バイト配列からの画像をトリミングしようとしています。残念ながら、cropImage 関数で OutofMemory Exception が発生します。この部分は、ファイルに書き込む方法を示しています。

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

私はそれをバイト配列から直接トリミングしました、そしてそれはちょうどうまくいきます:)私を助けるために最善を尽くしたすべての人に感謝します。

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 に答える
0

ASP.NET で System.Drawing 名前空間を使用することはお勧めしません。MSDN:

System.Drawing 名前空間内のクラスは、Windows または ASP.NET サービス内での使用はサポートされていません。これらのアプリケーション タイプのいずれかからこれらのクラスを使用しようとすると、サービス パフォーマンスの低下やランタイム例外など、予期しない問題が発生する可能性があります。サポートされている代替手段については、「Windows イメージング コンポーネント」を参照してください。

于 2012-07-13T09:18:44.163 に答える