关于图像缩放和伪彩技术 (200分)

  • 主题发起人 主题发起人 arcore
  • 开始时间 开始时间
A

arcore

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟正做图像处理的应用,遇到点问题,请大家帮帮忙!
前几天关于图像的亮度、灰度、对比度、保和度的调节的问题,小弟已经解决。现在
主要是要解决图像缩放和伪彩技术两个方面的问题。伪彩技术小弟还没有实现的构想,请
有这方面资料的朋友帮帮忙。先看一看小弟关于图像缩放的解决方法吧。以前我实现缩放
的方法是:把Image1的Stretch设为True,Parent.DoubleBuffered设为True,AutoSize设
为False,动态更改Width和Heigth就成了。这样的解决方法效果还不错,但它并没有实际
的更改图像的高度和宽度。所以,小弟就不得不另想它法,查了一些资料,写出了代码,
但效果却不怎么好,它的代码如下:
==============================================================================
procedure TLImaEditF.ScrollBar1Change(Sender: TObject);
var
NewWidth, NewHeight : integer;
BitMap : TBitMap;
SrcRect, DstRect : TRect;
begin
Label3.Caption := IntToStr(ScrollBar1.Position);//显示缩放百分比的Label;
BitMap := TBitMap.Create;
try
BitMap.Assign(Image1.Picture.BitMap);

NewWidth := StrToInt(FloatToStr(Int(FSrcImageWidth * ScrollBar1.Position / 100)));
NewHeight := StrToInt(FloatToStr(Int(FSrcImageHeight * ScrollBar1.Position / 100)));
Image1.Visible := False;
Shape1.Visible := False;//显示在Image四周的一个红色方框
SrcRect := Rect(0, 0, BitMap.Width, BitMap.Height);
DstRect := Rect(0, 0, NewWidth, NewHeight);
Image1.Picture.Bitmap.Width := NewWidth;
Image1.Picture.Bitmap.Height := NewHeight;
Image1.Width := NewWidth;
Image1.Height := NewHeight;
// Image1.Picture.Bitmap.Canvas.CopyMode := cmSrcCopy;
// Image1.Picture.Bitmap.Canvas.CopyRect(DstRect, Bitmap.Canvas, SrcRect);

// SetStretchBltMode(Image1.Picture.Bitmap.Canvas.Handle,HALFTONE);
// StretchBlt(Image1.Picture.Bitmap.Canvas.Handle,0,0,Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height,
// BitMap.Canvas.Handle,0,0,BitMap.Width,BitMap.Height,SRCCOPY);

Image1.Canvas.StretchDraw(DstRect, BitMap);

ChangeImagePos;//自定义过程,功能是当图像大小改变以后,改变Image的位置,使其
//在窗口中居中;
SetImageFrame; //自定义过程,功能是设置一个Shape的大小和位置,在Image周围显示
//一个红色方框;

Image1.Visible := True;
Shape1.Visible := True;
finally
BitMap.Free;
end;
end;
==============================================================================
从上面的代码中可以看出,小弟试过几种方法,但效果都相差不大,都有同一个问
题:如果用TScrollBar的LargeChange(我设它为50)进行缩放,就没有问题;如果用
SmallChange(我设它为10)进行缩放,则效果简单是一团糟。请大家帮我看一看代码中有
没有错的地方,可不可以改改。如果有现面的实现方法,也请指出,谢谢。
另:也请有现实图像伪彩技术资料的朋友帮帮忙,解决一下图像的伪彩技术。
 
补充说明一下:ScrollBar的范围是100 - 300,SmallChange是10,LargeChange是50。
 
伪彩色:
procedure TMainForm.PesudocolorClick(Sender: TObject); //伪彩色处理
var
p: PByteArray;
x, y: Integer;
Bmp: TBitmap;
Gray: byte;
begin
Bmp := TBitmap.Create;
Bmp.Assign(ChildForm.Image1.Picture.Bitmap);
Bmp.PixelFormat := pf24Bit;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x
* 3]
* 0.11);
if gray < 63 then
begin
//伪彩色处理的算法
p[x * 3 + 2] := 0;
p[x * 3 + 1] := 254 - 4 * gray;
p[x * 3] := 255;
end;
if (64 <= gray) and (gray < 127) then
begin
p[x * 3 + 2] := 0;
p[x * 3 + 1] := 4 * gray - 254;
p[x * 3] := 510 - 4 * gray;
end;
if (128 <= gray) and (gray < 191) then
begin
p[x * 3 + 2] := 4 * gray - 510;
p[x * 3 + 1] := 255;
p[x * 3] := 0;
end;
if (192 <= gray) then
begin
p[x * 3 + 2] := 255;
p[x * 3 + 1] := 1022 - 4 * gray;
p[x * 3] := 0;
end;

end;
end;

ChildForm.Image1.Picture.Bitmap.Assign(Bmp);
end;
end;
另外图象缩放:
SetStretchBltMode(Bmp.Canvas.Handle, HalfTone); //可以防止失真
stretchblt();
失真较小!


 
huazai:
你关于图像缩放的方法,在我上面的代码里面已经有了,效果差不多,还是要失
真的,失真也还不小呢。
你关于伪彩的方法我试过了,效果还可以。不过,伪彩技术是可以选择配色方案
的,你有没有好的建议?
 
我手头有一个ImageSeeSourceCode.zip,其中有ImageEditor源代码,我觉得不错,不知你用过没有
 
linsb:我手头上没有这个东西,可否M一份过来?

arcore@163.com,十分感谢!
 
可否给我一份?
ztiger_11@163.com
 
不失真的缩放算法要自己写,用StretchDraw之类的方法是不可能有好的效果的: 比如,
截取屏幕,包含文字信息的,StretchDraw后根本看不清楚文字。
 
伪彩色?就是 16 位色还是别的什么?PixelFormat就是设置图象格式。
你的缩放 Save 到文件后用 ACDSee 之类的软件看看它有没有变化。
只为视觉上的缩放,就不用这么复杂。
你的算法在视觉上也是只缩不放的,用 jpegImage 比用 bitmap 缩起来效果好。
不知我有没有看清楚。
 
pengyt:截屏和缩放有什么关系呢?你有什么好的方法,可否告之?谢谢。

小雨哥:伪彩技术是指把一幅灰度图加上自定义的颜色,产生比较好的视觉效果,因为
人的视觉对彩色的东西较敏感。但它也不只是简单的把灰度图转换成彩色图,而是要选
择配色方案,让用户自定义配色方案的。至于缩放技术,如果只是视觉上的缩放,设置
Image的Stretch设为True,Parent.DoubleBuffered设为True,AutoSize设为False,动
态更改Width和Heigth就成了,我以前用过这种方法,校果很好。但它没有改变图像本身
的大小。我的缩放比例是100% - 300%,肯定不是只缩不放的。
 
我说的截屏是因为截取的屏幕图象上包含有文字信息,而这些
文字用StretchDraw之类的方法缩小后根本看不清楚
 
linsb:可否给我一份,多谢!
 
老大,能把伪彩的代码发一份给我吗?
 
arcore先生:能把您的图像处理原码(如亮度调整等等)给我来一份码,谢谢了。
 
缩放可以参考graphicex中的各种平滑缩放算法,插值用的较多
 
zhoufujin:
我用的是FastBmp组件,你可以在网上下载到这个组件的。

huazai:
graphicex我手上没有,你手头上有吗?可否Mail我一份?arcore@163.com。
谢谢了。
 
哦? 你也用FastLib吗? 我也有一份。 不过我从来没用过。 呵呵。
我主要是抄它里面的各种特效算法代码, 加以优化和改造后用到我自己的控件里。.
 
FastBmp还是非常好的
 

Similar threads

D
回复
0
查看
911
DelphiTeacher的专栏
D
D
回复
0
查看
868
DelphiTeacher的专栏
D
D
回复
0
查看
840
DelphiTeacher的专栏
D
I
回复
0
查看
612
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部