关于图像类型转换(200分)

  • 主题发起人 主题发起人 yamazeki
  • 开始时间 开始时间
Y

yamazeki

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个程序中间需要转换图像类型,就是bmp,jpg,gif之间互相转换,
但是发现一些问题。程序有个功能是把图像翻转(我用的是ScanLine,一行一行
读出来,在一行一行写进区),当时用的是TBitmap类型,都好使,但是把jpg或
gif转换成TBitmap类型时,在转换就不是想像的效果了。
后来我手动用Windows画笔把jpg转换成bmp当存为256色时好使(严重失真),其他的
比如说真彩24时同样出错。
我想可能时调色板的问题,然后我在程序中这样做同样出错,下面是转换的程序:
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp: TBitmap;
Jpg: TJpegImage;
begin
Bmp:=TBitmap.Create;
Jpg:=TJpegImage.Create;
Jpg.LoadFromFile('xxxx');
Bmp.Assign(Jpg);//转换
Bmp.PixelFormat:=xxxx;//无论设成什么值都不行(图像翻转时都不对)
Jpg.free;
Bmp.free;
end;
各位高说帮我想想怎么办,如果我没说明白,大家提出来,如果分不够可以再加!!!
thank
 
你的图像已经Assign了,才来改它的PixelFormat怎么行呢?另外,你的源图是多少位的,假如
只有256色,你改成16M都还是不行呀.

procedure TForm1.Button1Click(Sender: TObject);
var
Bmp: TBitmap;
Jpg: TJpegImage;
begin
Bmp:=TBitmap.Create;
Bmp.PixelFormat:=xxxx;//改到这儿看看
Jpg:=TJpegImage.Create;
Jpg.LoadFromFile('xxxx');
Bmp.Assign(Jpg);//转换
Jpg.free;
Bmp.free;
end;
 
Any question?
 
to zhangkan:
不对,应该把
Bmp.PixelFormat:=xxxx;
放在后面。
to varphone:
把jpg转换成bmp,我用pf8bit存,但是图像失真太严重了,各位帮忙想想办法!!!
还有ScanLine只适合256色吗???
 
to 卷起千堆雪tyn:
看过你写的贴子了,你的方法对24位的非常好使,但对256色出现锯齿,不只是什么原因?
是不是要对256色和24位的分别处理?
如何知道他是256色还是24位的呢??
谢谢,再告诉我一下吧!!!
 
多人接受答案了。
 
同意zhangkan的观点~~~
你创建位图时就应该设定颜色位数:

Bmp:=TBitmap.Create;
Bmp.PixelFormat:=pf24bit;//pf8bit

然后你使用扫描线ScanLine可以进行翻转的处理~~
当然如果是真彩图,R、G、B各占一个字节,如果是256色图,就只有一个字节了。

在http://www.delphibbs.com/delphibbs/dispq.asp?lid=486743这里,我有镜像的例子。
你可以看看。

***************************************************************************

>如何知道他是256色还是24位的呢??

if Bmp.PixelFormat=pf24bit then
ShowMessage('24位图象');
if Bmp.PixelFormat=pf8bit then
ShowMessage('8位图象');

>你的方法对24位的非常好使,但对256色出现锯齿,不只是什么原因?

对于256色图象,你可以先转化为24位图象 :Bmp.PixelFormat :=pf24bit
另外操作256色图象时,你的ScanLine应该这么用 :

var
p :PByteArray;

begin
p :=Bmp.ScanLine[....];
在我上面告诉你的那个帖子里,时对24位图象的处理,用到了 p[3*I],p[3*I+1],p[3*I+2],
如果你对256色图象处理,只需要 p,p[I+1],p[I+2]就OK~~你去看看,自己改改了。
end;
 
后退
顶部