Обрезать графический объект? - PullRequest
0 голосов
/ 25 октября 2011

Мне нужно сделать две вещи с изображением: изменить его размер и обрезать.

Я изменяю размеры следующим образом:

nonResizedImage = new Bitmap(imagePath);
Bitmap scaled = new Bitmap(preCropWidth, preCropHeight);
using (Graphics scaledGraphics = Graphics.FromImage(scaled)) 
{ // scale image to the sizeo f the image the user cropped on
    scaledGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    scaledGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
    scaledGraphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    scaledGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    scaledGraphics.Clear(ColorTranslator.FromHtml("#FFFFFF"));
    scaledGraphics.DrawImage(nonResizedImage, 0, 0, preCropWidth, preCropHeight);
}

Теперь мне нужно обрезать изображение. Я нашел функцию, которая делает это:

static byte[] Crop(string Img, int Width, int Height, int X, int Y)
{
    try
    {
        using (SD.Image OriginalImage = SD.Image.FromFile(Img))
        {
            using (SD.Bitmap bmp = new SD.Bitmap(Width, Height))
            {
                bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution);

                using (SD.Graphics Graphic = SD.Graphics.FromImage(bmp))
                {
                    Graphic.SmoothingMode = SmoothingMode.AntiAlias;
                    Graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    Graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    Graphic.DrawImage(OriginalImage, new SD.Rectangle(0, 0, Width, Height), X, Y, Width, Height, SD.GraphicsUnit.Pixel);
                    MemoryStream ms = new MemoryStream();
                    bmp.Save(ms, OriginalImage.RawFormat);
                    return ms.GetBuffer();
                }
            }
        }
    }

    catch (Exception Ex)
    {
        throw Ex;
    }
}

Но для этого требуется изображение на входе. Таким образом, я могу сохранить вывод своего кода изменения размера на диск, а затем снова прочитать его, чтобы выполнить обрезку, но это кажется излишне неэффективным. Хотя я не очень разбираюсь в манипуляциях с изображениями в c #.

Как мне обрезать scaledGraphics у меня, без предварительного сохранения на диск?

1 Ответ

1 голос
/ 25 октября 2011

Одной из перегрузок для нового растрового изображения является ширина, высота, графический объект. Вы должны иметь возможность просто передать графический объект и затем создать растровое изображение из этого. Как то так

  static byte[] Crop(Graphics g, int Width, int Height, int X, int Y)
  {
      try
       {
          using (Bitmap bmp = new Bitmap(Width, Height, g))
          { 
           ...
          }
        }
        ......
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...