CopyRect (масштабирование) с правильными цветами в Delphi
на этот вопрос Я спросил о правильном использовании метода CopyRect. Я получил ответ, который исправил мою проблему, но теперь цвета скопированного прямоугольника неправильны (ограничены 256 значениями?). Это код:
var
  Bmp: TBitmap;
begin
  Image1.Picture.LoadFromFile(SomeJPGimage);
  Bmp := TBitmap.Create;
  try
    Bmp.Assign(Image1.Picture.Graphic);
    with Bmp do
      Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);
  finally
    Bmp.Free;
  end;
end;

вставка с ложными цветами-Image2. Цвета правильные, если я не изменяю размер.
Как получить 24-битный цвет исходного изображения (JPG), когда изменение размера?
редактировать
Draw не является альтернативой; я хочу скопировать масштабированную версию части исходного изображения.
2 ответов
Это не вызвано из-за уменьшения цвета или неправильного pixelformat и т. д.. Вы, вероятно, уменьшаете изображение во время копирования, и "StretchBlt" сжимает изображение, чтобы вписаться, и в зависимости от режима создает некоторые артефакты. Например, ниже 128x128 image 
отображается точно так же, если не специально. Однако при его применении на изображения 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;
для вышеуказанного изображения источника выход теперь становится:
(просмотрев немного графики.pas', VCL, похоже, использует полутон только для 8-битных изображений. Я могу ошибаться или быть прав в этой оценке, но в любом случае режим растяжения полутона не имеет такого ограничения.)
для чего-нибудь лучшего, я считаю, вы должны использовать правильная графическая библиотека.
раз редактировалось:
оказывается, проблема идет против неправильного холста (слишком легко с TImage, если вы к нему не привыкли). Попытался сохранить файлы на моем последнем образце и получил огромный файл на том, который я назначил. Поэтому я начал изучать некоторые другие значения и обнаружил, что вам нужно работать с растровым холстом...
var
  BMP: TBitmap;
  MyClipRect: TRect;
begin
  if OpenDialog1.Execute then
     begin
       Image1.Picture.LoadFromFile(OpenDialog1.FileName);
       Bmp := TBitmap.Create;
       try
         Bmp.Assign(Image1.Picture.Graphic);
         myClipRect.Left := (Bmp.Width div 2);
         myClipRect.Top := (Bmp.Height div 2);
         myClipRect.Right := (Bmp.Width);
         myClipRect.Bottom := (Bmp.Height);
         with Image2.Picture.Bitmap do
           begin
             Width := Bmp.Width div 2;
             Height := Bmp.Height div 2;
             Canvas.CopyRect(Canvas.ClipRect, Bmp.Canvas, MyClipRect);
           end;
         Image2.Picture.SaveToFile('image2.bmp');
      finally
        Bmp.Free;
      end;
   end;
end;
надеемся, что, наконец, получил его. Оййй.
