高手请进,bmp如何转换成jpg?我要的是从底层的转换,不是利用现有的组件转换 ( 积分: 100 )

  • 主题发起人 主题发起人 草原骏马
  • 开始时间 开始时间

草原骏马

Unregistered / Unconfirmed
GUEST, unregistred user!
不通过组件打开bmp,用文件操作。把bmp中的图像数据读出来,再用文件的形式保存成jpg。或者提供给我jpg文件的格式也可,我自己写一下。
 
斑竹帮帮忙啊!
 
{**********bmp转换成jpg***********}
function BmpToJpeg(Sou:TFileName;Des:TFileName):Boolean;
var
aBmp:TBitmap;
aJpeg:TJPEGImage;
begin
Result:=False;
aBmp:=TBitmap.Create;
aJpeg:=TJPEGImage.Create;
try
try
aBmp.LoadFromFile(Sou);
aJpeg.Assign(aBmp);
aJpeg.CompressionQuality:=100;
aJpeg.Compress;
aJpeg.SaveToFile(Des);
Result:=True;
except
Result:=False;
end;
finally
FreeAndNil(aBmp);
FreeAndNil(aJpeg);
end;
end;
 
to bjaman
这个我也了解,我要的不是这样地
有C语言的代码也行呀
 
我的问题怎么没人回呢?
 
不明白你要的到底是什么样的
 
bjaman的很对阿,lz要什么样的?
 
各位,每一种图像格式都有其特定的编码规则,按这个编码规则,不同类型的图像就可以互相转换。就是说我要的是原理,bmp怎么就转换为jpg了呢?比如:一张bmp图像,先读到内存中,去掉它的bmp头,读取它的图像数据,把这段图像数据经过jpg的压缩编码,就成了jpg的图像数据,然后再把jpg的头加上,就构成了完整的jpg图像。
现在的问题是:jpg的头是什么样的,jpg的压缩算法又是什么样的?
 
网上很多这些资料和源码,怎么不自己找找。
 
多?!哪里有,告诉我?
 
用IJG吧,自己写没那个必要,可以看看Jepg.pas,就是用IJG的,在delphi的安装光盘里,有jpeg.pas的源码,也有那个接口的源码,不过是C的,delphi里调用的OBJ文件。
如果是学习一下可以看看,自己写我认为就没必要了
 
顺便说一下,放jpeg.pas的那个地方的东西都是好东西啊,可以看看的
 
to dobug:
IJG 是什么东西呀?头一回听说,
你那里有jpeg.pas的代码吗?delphi里好像没有jpeg.pas吧,我只见过jpeg.dcu

我也不想自己写,可是我在做嵌入式的产品.没有jpegtobmp的函数,我的自己用C语言写呀
做嵌入式十分郁闷的,资源少的可怜,函数少的可怜呀.
 
嵌入式? 那转换后的jpg你又怎么可以显示?
 
jpeg.pas在delphi的安装光盘里,安装后是没有的,如果你没有delphi的安装光盘去下一个graphicsex,那里面有个jpg.pas,也有ijg的obj文件但是没有源码了,jpeg的结构是很多行raw,ijg是个很通用的接口,据说IE用的也是这个,很多嵌入式都用这个的,比如数字电视的机顶盒,但是我非常奇怪你用delphi来搞嵌入式,呵呵,

付个例子吧,我以前的demo,用的是GraphicsEx里的jpg.pas
procedure TfrmMain.bbb(AFileName: String; AThumBmp: TBitmap; AWidth,
AHeight: Integer);
var cinfo:jpeg_decompress_struct;
jerr:jpeg_error_mgr;
FileStream:TFileStream;
DestScanLine: PByteArray;
num_scanlines:integer;
i:integer;
iByte:Byte;
begin
FileStream:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyNone) ;
jerr := jpeg_std_error;
cinfo.common.err := @jerr;
jpeg_CreateDecompress(@cinfo,JPEG_LIB_VERSION, sizeof(cinfo));
jpeg_stdio_src(@cinfo, FileStream);
if jpeg_read_header(@cinfo,true)<>1 then exit;
jpeg_start_decompress(@cinfo);
AThumBmp.Width:=CInfo.output_width;
AThumBmp.Height := CInfo.output_height;
AThumBmp.HandleType :=bmDib;
AThumBmp.PixelFormat := pf24bit;
Cinfo.output_scanline:=CInfo.output_height-10;
While(cinfo.output_scanline < cinfo.output_height) do begin
DestScanLine:=AThumBmp.ScanLine[Cinfo.output_scanline];
num_scanlines:=jpeg_read_scanlines(@cinfo, @DestScanLine, 1);
end;

jpeg_finish_decompress(@cinfo);
jpeg_destroy_decompress(@cinfo);
FileStream.Free;
end;
 
to dobug
我不是用delphi作嵌入式开发,用的是EVC,但大富翁的资源多嘛,
我在网上找了一段时间了,可是还是不行,
谢谢你,我按你的说明找找看,如果你有
jpeg_decompress_struct;
jpeg_error_mgr;
的结构体定义,请给我E-mail一份,先谢一下.
我的E-mainl: mjp1234airen4385@163.com
 
做嵌入式产品,一般直接使用JPG编码芯片,让硬件来完成这个工作,软件完成是否速度跟不上?不知道你的系统将BMP转换为JPG是做什么用的。
 
to hehanyang:
我们没用专用的解码芯片,节省成本吗?
我们的CPU是很高的,接近400M,所以速度还是可以接受的
bmp到jpg是厂家提供的类库
 
我这里有一个jpegimage的源代码,也是从网上下载的,看对你有没有帮助。
http://220.173.141.7/JpgImg.zip
 
to hehanyang:
谢谢你的帮助,不管怎样,我一定会给你分的,当然你不一定是为分而来
 
后退
顶部