在这个问题中,我询问了如何正确使用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。如果我不调整尺寸,颜色是正确的。
调整大小时,如何获得源图像( JPG)的24位颜色?
编辑
绘制不是另一种选择;我想要复制源映像的一部分的缩放版本。
发布于 2011-12-03 13:41:46
这并不是因为颜色减少或像素格式错误等原因造成的。您可能是在复制时缩小图像,并且“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;
对于上面的源图片,输出现在变成:
(浏览了一些“图片.bit”后,VCL似乎只对8位图像使用半色调。我可能是错误或正确的评估,但无论如何,半色调拉伸模式没有这样的限制。)
为了更好的,我相信,你必须使用一个适当的图形库。
发布于 2011-12-03 09:39:46
再次编辑:
事实证明,这个问题与错误的画布(如果你不习惯的话,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;
希望那终于得到了。是的。
https://stackoverflow.com/questions/8366547
复制相似问题