CopyRect (масштабирование) с правильными цветами в Delphi - PullRequest
6 голосов
/ 03 декабря 2011

В этот вопрос Я спросил о правильном использовании метода 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;

enter image description here

Вставка с ложными цветами - это Image2.Цвета правильные, если я не изменяю размер.
Как получить 24-битный цвет исходного изображения (JPG) при изменении размера?

edit
Drawне является альтернативой;Я хочу скопировать уменьшенную версию части исходного изображения.

Ответы [ 2 ]

5 голосов
/ 03 декабря 2011

Это не вызвано уменьшением цвета, неправильным форматом пикселя и т. Д. Вы, вероятно, сжимаете изображение во время копирования, а StretchBlt сжимает изображение, чтобы уместить его, и в зависимости от режима создает некоторые артефакты.Например, изображение ниже 128x128enter image description here

отображается точно так же, если изменение размера не применяется.Однако, если он применяется, например, к изображению 90x100, выводenter image description here.

Вы можете изменить режим растяжения для немного лучшего результата:

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;

Для приведенного выше исходного изображения вывод теперь становится:enter image description here

(Просматривая небольшой файл graphics.pas, VCL, похоже, использует полутона только для 8-битных изображений. Я могу ошибаться или ошибаться в этой оценке, но в любом случае полутоновое растяжениережим не имеет такого ограничения.)

Я полагаю, что для чего-то лучшего вы должны использовать надлежащую графическую библиотеку.

4 голосов
/ 03 декабря 2011

Отредактировано снова:

Оказывается, проблема идет против НЕПРАВИЛЬНОГО холста (слишком легко с 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;

Надеюсь, что наконец-то понял. Иш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...