请问如何快速判断一个位图适合那种压缩算法?(100分)

X

xwings

Unregistered / Unconfirmed
GUEST, unregistred user!
我们都知道 Jpg适合压缩连续色调变化的自然图象.这样失真最小.压缩率也大.但是不适合压缩
颜色数很少的位图.比如屏幕截图等等.这时候就有RLE等游长编码方法来处理比较好了.
我想问的是如果给一个位图如何快速判断出来(当然是程序判断啦)比较适合那种压缩方式.由于要快速.所以是估算.
那些统计全部象素.等等的方法都不要考虑了.
给出合理方法的我给300分. 谢谢.
 
判断一行象素或者随机取几行,或者取两条对角线之类的判断不就知道个大概了?
 
暂时不知道用什么办法好,嗬嗬,两条对角线就能判断?好像也真的太随机了吧。
 
我想也许是采样判断吧.具体如何判断比较?
 
我的想法就是取样线后,首先统计颜色数,一般照片的颜色数会超过256,且会有比较
接近的的颜色值,而屏幕截图之类的颜色不好超过256,而且颜色值跳变得很厉害(有
明显的边缘),JPG效果差的地方主要也在于这些边缘。

判断效果的好坏在于取样线的选取,我认为对角线比较简单准确。
 
有点道理.还有没有更好一点的算法?
 
判断每个灰阶的象素个数,用scanline速度很快,

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);
for i:=0 to 255 do
begin
if Gray=i then
begin
Grayclass:=Grayclass+1; //第i阶灰度象素个数加1
end;
end;

end

end;
 
huazai的方法比较慢吧.
 
有没有人能给个算法?
 
其实只要判断过程与压缩过程的时间相比很少就可以了,
将整个图形扫描一遍的时间,只要将Bmp压缩成Jpeg时间的1/10甚至还少,
我的机器上(比较慢),扫描一遍BMP(800*600)只要30ms,而压缩Jpeg要500ms.
为什么要节约这5%的时间呢?
var
p:pByteArray;
...
BMP.PixelFormat:=pf32Bit;
...
for i:=0 to BMP.Height-1 do
beign
if i mod 2=1 then continue; //减半,不要也行
p:=BMP.ScanLine;
for j:=1 to BMP.Width-1 do
begin
Pos:=j*4; Pos2:=Pos-4;
TotalRed :=TotalRed +Abs(P[Pos+2]-P[Pos2+2]);
TotalGreen:=TotalGreen+Abs(P[Pos+1]-P[Pos2+1]);
TotalBlue :=TotalBlue +Abs(P[Pos]-P[Pos2]);
end;
end;
再判断对应的TotalRed,TotalGreen,TotalBlue取一个合适的值
 
说的也对.不过如果我要5帧每秒. 30ms就大了.呀.呵呵.
算了不讨论了.
 
顶部