如何对图像进行局部放大?(100分)

  • 主题发起人 主题发起人 吉花
  • 开始时间 开始时间

吉花

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
我想对Image或其他控件中的bmp文件进行
局部放大,不是对像素进行放大,而是增加像素
的放大,不知是否可能?如果可能,如何实现?
 
canvas.copyrect(derect,decanvas,srrect);
 
在Delphi中,可利用类Tcanvas的CopyRect方法实现图象的放大和缩小。其功能是
将源画布上的一个指定矩形区域(简称源矩形)内的象素,拷贝到目的画布上的一
个指定矩形区域(简称目的矩形)中。亦可称之为象素块复制。
由CopyMode属性确定拷贝的模式。在直接拷贝模式(cmSrcCopy)下,当源矩形与
目的矩形相等时,图象不变;若源矩形大于目的矩形,图象则缩小;而当源矩形小
于目的矩形时,图象便被放大(在目的矩形中扩展)。源矩形与目的矩形大小之
比,决定图象的缩放倍数。CopyRect方法声明如下:
Procedure CopyRect(const Dest: TRect; Canvas: TCanvas;
const Source: Trect);

 
我的程序是这样写的:
var drect,srect:TRect;
origin:TPoint;
begin
srect:=rect(0,0,10,10);
drect:=rect(0,0,20,20);
Image1.Canvas.CopyMode:=cmSrcCopy;
Image1.Canvas.CopyRect(drect,image2.canvas,srect);
end;

可是结果是将image1 中的左上角的一个小矩形(0,0,10,10)
中的图像变成白颜色,而image2中的图像全是白颜色,
这是怎么回事?
 
var d,s:Trect
.........
image1.Canvas.CopyRect(s,image1.canvas,d);
image1.Canvas.StretchDraw(d,image.picture.Bitmap);
 
我看了其他人的回答,似乎不是你想要的答案,你所说的不是对像素进行放大,
而是增加像素这究竟是什么意思,如果只是想显示放大后的图像,用copyrect
可以很方便的实现,否则如果想编辑放大后的图像,最好自己写程序实现,即
扫描每一个像素点,再重画,我做计算机图形学作业时就用的这种方法
 
除非是矢量图,否则不可能进行所谓"象素"放大,可以边缘差分,但如果
原图有600个像点,你不可能再平空造出更多的像点.只能单纯增减每个
像点的象素,比如1个像点原来由一个象素组成,现在由四个象素组成,
其图象就等于被放大了,放大后用3*3的样条对直方图作积和运算,
可以将马赛克消除一些,此样条许多图形学的书里都有,你可以查一下,
反证我是忘了具体数值了.
 
是这样一个问题:一张bmp图片,原始尺寸是
480X240(比如说)现在要将该图片的任意一部分
取出,并放大,理论上能否将放大部分的清晰度
增加?(如果不做任何处理,将仅仅是简单地将
选取的部分的像素放大,这样会使画面变模糊)
也就是是否一定要加额外的算法?还是有一些简单
的处理技巧即可实现。
 
如果我认为的对的话,你的意思想把原图的选定部分按现实的方式放大,而不是按简单的百分倍比进行放大,就像它自己长大一样.
我想这需要自己给出好的算法,事实上,更需要建模.就目前的图形处理软件,还没有那个能对所有图像进行这种处理的,一般要给出被处理的图像的基本特征:例如:人,房子等等.不过就简单的放大,用DELPHI的StrechDraw效果不错.

 
using api will be good

strectchblt(form1.canvas.handle,image1.width*2,image1.height*2,
image1.canvas.handle,0,0,image1.width,image1.height,srcand)

this will make the image to 200 %
 
http://www.huzhou.zj.cn/~fhb/html/czoom.html
 
无论什么算法,放大后的清晰度都不可能超过原图.
 
求出图形边缘及色差变化,插值
 
非常简单的问题,你的意思是把图象差值放大后再显示一个局部区域,具体算法太长,若需可来信.
 
sfeng:
我也想要:g622@xju.edu.cn
 
接受答案了.
 
后退
顶部