Это не вызвано уменьшением цвета, неправильным форматом пикселя и т. Д. Вы, вероятно, сжимаете изображение во время копирования, а StretchBlt сжимает изображение, чтобы уместить его, и в зависимости от режима создает некоторые артефакты.Например, изображение ниже 128x128
отображается точно так же, если изменение размера не применяется.Однако, если он применяется, например, к изображению 90x100, вывод
.
Вы можете изменить режим растяжения для немного лучшего результата:
var
Bmp: TBitmap;
begin
Image1.Picture.LoadFromFile(SomeJPGimage);
Bmp := TBitmap.Create;
try
Bmp.Assign(Image1.Picture.Graphic);
SetStretchBltMode(Image2.Canvas.Handle, HALFTONE); // <- here
with Bmp do
Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);
finally
Bmp.Free;
end;
end;
Для приведенного выше исходного изображения вывод теперь становится:
(Просматривая небольшой файл graphics.pas, VCL, похоже, использует полутона только для 8-битных изображений. Я могу ошибаться или ошибаться в этой оценке, но в любом случае полутоновое растяжениережим не имеет такого ограничения.)
Я полагаю, что для чего-то лучшего вы должны использовать надлежащую графическую библиотеку.