首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Delphi中使用正确颜色的CopyRect (缩放)

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

Stack Overflow用户
提问于 2011-12-03 08:38:54
回答 2查看 3.5K关注 0票数 7

这个问题中,我询问了如何正确使用CopyRect方法。我得到了一个解决问题的答案,但是现在复制的矩形的颜色是错误的(限制在256个值?)这是代码:

代码语言:javascript
运行
复制
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。如果我不调整尺寸,颜色是正确的。

调整大小时,如何获得源图像( JPG)的24位颜色?

编辑

绘制不是另一种选择;我想要复制源映像的一部分的缩放版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-03 13:41:46

这并不是因为颜色减少或像素格式错误等原因造成的。您可能是在复制时缩小图像,并且“StretchBlt”压缩图像以适应,并根据模式产生一些工件。例如,下面的128x128图像

如果不应用调整大小,则显示完全相同。但是,如果将其应用于90x100映像,则输出为

您可以更改拉伸方式以获得更好的结果:

代码语言:javascript
运行
复制
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;

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

(浏览了一些“图片.bit”后,VCL似乎只对8位图像使用半色调。我可能是错误或正确的评估,但无论如何,半色调拉伸模式没有这样的限制。)

为了更好的,我相信,你必须使用一个适当的图形库。

票数 5
EN

Stack Overflow用户

发布于 2011-12-03 09:39:46

再次编辑:

事实证明,这个问题与错误的画布(如果你不习惯的话,TImage太容易了)。尝试在我的上一个示例中保存文件,并在我分配的那个上得到一个巨大的文件。因此,我开始研究其他一些值,发现您需要使用位图画布.

代码语言:javascript
运行
复制
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;

希望那终于得到了。是的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8366547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档