C # winforms: graphics.DrawImage проблема - PullRequest
8 голосов
/ 21 апреля 2010

У меня действительно странная проблема с методом Graphics.DrawImage.

У меня есть элемент управления PictureBox в элементе управления Panel с Свойство AllowScroll = true . Программа разрезает изображение на мелкие детали в зависимости от выбранной пользователем области.

Я загружаю изображение 300x547 и выбираю область (красный прямоугольник):

альтернативный текст http://img341.imageshack.us/img341/8796/63796391.png

Программа правильно обрезает изображение:

альтернативный текст http://img689.imageshack.us/img689/6459/69242903.png

Затем я загружаю другое изображение 427x640:

альтернативный текст http://img34.imageshack.us/img34/7950/56727000.png

и затем, как результат, я вижу, что изображение не обрезается должным образом. Каждый файл img.jpg имеет правильную ширину и высоту, но нарисованное изображение слишком маленькое: альтернативный текст http://img641.imageshack.us/img641/1977/25643796.png

вот фрагмент кода - он сохраняет выбранную пользователем область растрового изображения:

  Image OriginalIMG= (Image)((PictureBox)panel1.Controls["picBox"]).Image.Clone()
  Bitmap bmp = new Bitmap(selectedAreaRECT.Width, selectedAreaRECT.Height);
  Graphics g = Graphics.FromImage(bmp);

  g.DrawImage(OriginalIMG, 0,0, selectedAreaRECT, GraphicsUnit.Pixel);
  g.Save();
  g.Dispose();

  bmp.Save(AppDomain.CurrentDomain.BaseDirectory + @"\Temp\" + "img1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Как видите, код для img1.jpg одинаковый с изображения A и с изображения B. Я пытаюсь решить эту глупую проблему слишком долго, я не знаю, в чем причина этой проблемы. Я пробовал разные перегрузки метода DrawImage, но безуспешно

EDIT

Решено! значение DPI по умолчанию для System.Drawing.Bitmap = 96, если я открываю изображение с DPI! = 96, возникает описанная выше проблема. Чтобы избавиться от этого, мне нужно было использовать метод SetResolution:

Bitmap result = new Bitmap(width, height);
result.SetResolution(OriginalIMG.HorizontalResolution, OriginalIMG.VerticalResolution);

это решает проблему :) Спасибо всем за помощь! :)

1 Ответ

3 голосов
/ 21 апреля 2010

Я бы попробовал: (Под редакцией)

  g.DrawImage(
    OriginalIMG,
    new Rectangle( Point.Empty, bmp.Size ),
    selectedAreaRECT.X, selectedAreaRECT.Y,
    selectedAreaRECT.Width, selectedAreaRECT.Height, 
    GraphicsUnit.Pixel);

чтобы понять, имеет ли это значение.

Хотя это не имеет ничего общего с вашей проблемой: вы забываете .Dispose () некоторые вещи, и я не уверен, почему вы должны .Clone () изображение.

...