Может ли Graphics.DrawImage непреднамеренно обрезать изображение?

Я использую код, который берет растровое изображение и преобразует его в 24 BPP, чтобы я мог использовать его в программе, которая специально требует этого формата файла. Вот код:

    using (Bitmap tempImage = new Bitmap(pageToScan.FullPath))
    {
       if (tempImage.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
       {
          using (Bitmap tempImage2 = new Bitmap(tempImage.Size.Width, tempImage.Size.Height,
             System.Drawing.Imaging.PixelFormat.Format24bppRgb))
          {
             using (Graphics g = Graphics.FromImage(tempImage2))
             {
                g.DrawImage(tempImage, new Point(0, 0));
             }
             RecognizeBitmap(pageToScan, tempImage2); //Thanks to Tim on this refactoring.
          }
       }
       else
          RecognizeBitmap(pageToScan, tempImage);
    }

У меня есть два вопроса по приведенному выше коду:

  1. Я думаю, что с конкретным изображением это обрезало крайние правые 200 пикселей сразу за tempImage2. Это возможно? Как это может произойти, и как я могу это остановить? Мой друг предположил, что это может быть связано с размером используемого файла TIFF.
  2. Есть ли более быстрый способ конвертировать изображение в 24 BPP в памяти?

person Chris    schedule 15.01.2009    source источник


Ответы (1)


Лучше использовать Метод Bitmap.Clone. Это принимает PixelFormat в качестве параметра:

using (Bitmap tempImage = new Bitmap(pageToScan.FullPath))    
{           
    if (tempImage.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
    {
        Rectangle r = new Rectangle(0, 0, tempImage.Width, tempImage.Height);
        RecognizeBitmap(pageToScan, tempImage.Clone(r, PixelFormat.Format24bppRgb);          
    }
    else                  
    {
        RecognizeBitmap(pageToScan, tempImage);    
    }
}
person Stu Mackellar    schedule 15.01.2009
comment
Прохладно. Должен ли я использовать использование вокруг tempImage.Clone? - person Chris; 19.01.2009
comment
Да. Вероятно, вам следует сделать это и одновременно провести рефакторинг всего метода, чтобы избавиться от остаточного дублированного кода. - person Stu Mackellar; 19.01.2009