在Delphi中使用正确的颜色进行CopyRect(缩放)

ste*_*nvh 6 delphi colors

这个问题中,我询问了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;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

假色的插图是Image2.如果我不调整大小,颜色是正确的.
调整大小时如何获取源图像(JPG)的24位颜色?

编辑
Draw不是另一种选择; 我想复制源图像部分的缩放版本.

Ser*_*yuz 5

这不是因为颜色减少或错误的像素格式等引起的.你可能在复制时缩小图像并且'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;
Run Code Online (Sandbox Code Playgroud)


对于上面的源图片,输出现在变为:

在此输入图像描述

(浏览过一些'graphics.pas',VCL似乎只对8位图像使用半色调.我在这个评估中可能是错的或者是正确的,但无论如何,半色调拉伸模式没有这样的约束.)


对于任何更好的东西,我相信,你必须使用适当的图形库.

  • 您的示例仅显示锯齿条带,灰度渐变也是如此,但我的示例有假色,即原件中不存在颜色.可能是渐变对"真实"图片的影响. (2认同)