位图缩小不失真的懊恼。(48分)

  • 主题发起人 主题发起人 mosane
  • 开始时间 开始时间
M

mosane

Unregistered / Unconfirmed
GUEST, unregistred user!
我要把1024*768的截屏BMP或JPG缩小到256*192来显示,
不要求很清晰,但起码可以看到知道图片里有什么吧,
可惜直接的Bmp.Canvas.StretchDraw 失真太大了,根本只看到一块块的东西:(

今天找了一天资料,也研究尝试了很多种方法,都不理想,
下载了第三方cadodraw 解压却要密码的,难道要收费?找不到入口免费这册:(
再者,还是希望通过优秀的算法而不是第三方Control来实现,除非没有办法了,所以没有继续找控件。

请高手们不吝赐教,感激不尽。
 
我也正有此烦恼!
有高人提供过一个算法,一试,My God,比我这笨手手画还慢。
哎。
 
比较凑或的方法
SetStretchBltMode(Bmp.Canvas.Handle, HalfTone); //可以防止失真
stretchblt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height,
backbmp.Canvas.Handle, 0, 0,
backbmp.Width, backbmp.height, srccopy);
 
我发现在WORD中的图象缩小失真度比较小。是否可以考虑使用OLE将WORD文件嵌入呀?
 
我也在做这个,现在能放大,但有时出错
 
SetStretchBltMode(Bmp.Canvas.Handle, HalfTone); //可以防止失真
+
Bmp.Canvas.CopyRect
的确是个凑合的方法,


SetStretchBltMode(Bmp.Canvas.Handle, HalfTone); //可以防止失真
+
stretchblt();
很糟糕,跟Canvas.StretchDraw 没有分别
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1575813
我以前回答过,看看下面的程序吧。
X,Y是横、纵缩小比例
其中用到了扫描线,图像是24位色的。
不懂再问我吧。
procedure new;
var i,j:integer;
R,G,B:integer;
x,y:real;
px,py:integer;
p1,p2,p3,p4:longint;
begin
for i:=0 to 300-1 do
begin
py:=trunc(i*x+0.5);
for j:=0 to 400-1 do
begin
px:=trunc(j*y+0.5);
p1:=map.Canvas.Pixels[px ,py ];
p2:=map.canvas.pixels[px+1,py ];
p3:=map.canvas.pixels[px ,py+1];
p4:=map.canvas.pixels[px+1,py ];
R:=((p1 and $FF0000)+(p2 and $FF0000)+(p3 and $FF0000)+(p4 and $FF0000)) shr 18;
G:=((p1 and $FF00)+(p2 and $FF00)+(p3 and $FF00)+(p4 and $FF00)) shr 10;
B:=((p1 and $FF)+(p2 and $FF)+(p3 and $FF)+(p4 and $FF)) shr 2;
map1.Canvas.Pixels[j,i]:=(R shl 16)+(G shl 8)+B;
end;
end;
end;

 
效果最好的算法是小波(wavelet)
 
To zhu_jy:
每次都这样计算是不是很慢?而且我要连续播放,那画面不是很不连贯?

To xusong168:
小波(wavelet)?
 
小波算法是不是很复杂?
听说应用还比较广泛
但是没搞过
 
一个更严重的问题是,这样的抓屏太耗资源,连续抓全屏的时候电脑几乎动不了:(

现在在找directx的资料学习学习,诸位能帮帮我吗?
 
用JPEG2000就可以了。算法我没有,找找吧
 
JPEG2000 是一个 Control吗?

难道解决这问题只有用DirectX了?很难找到for D7的组件,:(
 
在PHP里的图形组件有一件功能就是缩小图形文件,而且支持很多格式,可以去找找看参考一下。
 
roy_toy:
用小波变换来取代传统的傅立叶变换进行图象处理是图象领域的热门,但目前找现成的用于图象处理的小波算法比较费劲。
mosane:
我有cadodraw4 for d6的,但它是cad控件,用来做位图处理恐怕未必能满足你的要求,要的话给我来信:shanghuaguo@sina.com.有没有试过imageEN?这是专门做图象处理的,我好象看到过类似的例子
 
DFW的富翁都不见了?????


位图的缩放我解决了,但很耗资源,
抓屏,缩放,格式转化,都是耗资源大户:(

听取很多先辈的意见说用DirectX会好很多,是不是这样子?
谁有DelphiX for D7吗?或给个能下的地址我,
或有DirectX SDK for Delphi7或地址或在什么地方有吗?
我帮了很久找不到,:(很急的,
谢谢,我把100分给你。
 
你不直接读取硬件缓冲区的话,根本做不到每秒10帧以上。你就不用想了
就是用小波算法,在1024*768真彩下,每秒能做到3帧就已经很不错了
 
怎么读取硬件缓冲区?
而且缩放,格式转化(BMP2JPG)也很耗资源,

请问哪里有用DelphiX抓屏的实例?
 
后退
顶部