Я не думаю, что они будут сильно отличаться, но поскольку вам на самом деле не нужно изменять размер изображения, попробуйте использовать перегрузку DrawImage , которая не (пытается) размер:
DrawImage(bitmap,0,0);
Как я уже сказал, я сомневаюсь, что это будет иметь какое-то значение, потому что я уверен , что DrawImage проверяет Ширина и Высота растрового изображения, и если нет необходимости в изменении размера, просто вызывает эту перегрузку. (Я надеюсь, что это не мешает проходить все 12 миллионов пикселей, не выполняя никакой реальной работы).
Обновление: мои размышления неверны. с тех пор я узнал, но комментарий парней напомнил мне мой старый ответ: вы хотите указать размер назначения; даже если он соответствует размеру источника:
DrawImage(bitmap, 0, 0, bitmap.GetWidth, bitmap.GetHeight);
Причина заключается в разнице точек на дюйм между точками на дюйм bitmap
и точками на дюйм пункта назначения. GDI + выполнит масштабирование, чтобы получить изображение с правильным «размером» (то есть в дюймах)
Я узнал сам с октября прошлого года, что вы действительно хотите нарисовать "кэшированную" версию своего растрового изображения. В GDI + есть класс CachedBitmap
. Есть несколько хитростей, чтобы использовать его. Но там у меня есть бит функции (Delphi) кода, который это делает.
Предостережение заключается в том, что CachedBitmap
может стать недействительным, то есть его нельзя использовать для рисования. Это происходит, если пользователь изменяет разрешение или глубину цвета (например, удаленный рабочий стол). В этом случае DrawImage
потерпит неудачу, и вам придется заново создать CachedBitmap
:
class procedure TGDIPlusHelper.DrawCachedBitmap(image: TGPImage;
var cachedBitmap: TGPCachedBitmap;
Graphics: TGPGraphics; x, y: Integer; width, height: Integer);
var
b: TGPBitmap;
begin
if (image = nil) then
begin
//i've chosen to not throw exceptions during paint code - it gets very nasty
Exit;
end;
if (graphics = nil) then
begin
//i've chosen to not throw exceptions during paint code - it gets very nasty
Exit;
end;
//Check if we have to invalidate the cached image because of size mismatch
//i.e. if the user has "zoomed" the UI
if (CachedBitmap <> nil) then
begin
if (CachedBitmap.BitmapWidth <> width) or (CachedBitmap.BitmapHeight <> height) then
FreeAndNil(CachedBitmap); //nil'ing it will force it to be re-created down below
end;
//Check if we need to create the "cached" version of the bitmap
if CachedBitmap = nil then
begin
b := TGDIPlusHelper.ResizeImage(image, width, height);
try
CachedBitmap := TGPCachedBitmap.Create(b, graphics);
finally
b.Free;
end;
end;
if (graphics.DrawCachedBitmap(cachedBitmap, x, y) <> Ok) then
begin
//The calls to DrawCachedBitmap failed
//The API is telling us we have to recreate the cached bitmap
FreeAndNil(cachedBitmap);
b := TGDIPlusHelper.ResizeImage(image, width, height);
try
CachedBitmap := TGPCachedBitmap.Create(b, graphics);
finally
b.Free;
end;
graphics.DrawCachedBitmap(cachedBitmap, x, y);
end;
end;
cachedBitmap
передается по ссылке. Первый вызов DrawCachedBitmap
it cached version будет создан. Затем вы передаете его в последующих вызовах, например ::1040*
Image imgPrintInvoice = new Image.FromFile("printer.png");
CachedBitmap imgPrintInvoiceCached = null;
...
int glyphSize = 16 * (GetCurrentDpi() / 96);
DrawCachedBitmap(imgPrintInvoice , ref imgPrintInvoiceCached , graphics,
0, 0, glyphSize, glyphSize);
Я использую процедуру для рисования глифов на кнопках с учетом текущего DPI. То же самое могло бы быть использовано командой Internet Explorer для рисования изображений, когда пользователь работает с высоким разрешением (т.е. очень медленно рисует увеличенные изображения, потому что они используют GDI +).