bmp压缩成jpg(100分)

  • 主题发起人 主题发起人 Mr-cure
  • 开始时间 开始时间
M

Mr-cure

Unregistered / Unconfirmed
GUEST, unregistred user!
我在把bmp压缩成jpg时,本来256色的bmp,总是变成了16位真彩的jpg,所以本来100k的bmp应该可以压缩成10k的jpg却变成了20k。
请问各位有没有高招可以把256色灰阶的bmp还压缩成256色灰阶的 jpg阿?

我的源代码如下:
procedure ChangeToJPG(bmpFile:string;JpgFile:string);
var
JPG:TJpegImage;
begin
BMP:=TBitMap.Create;
JPG:=TJPEGImage.Create;
BMP.LoadFromFile(bmpFile);
bmp.pixelformat := pf8bit;
JPG.Assign(BMP);
JPG.CompressionQuality:=30; //压缩率为low 30%
JPG.JPegNeeded;
// jpg.pixelformat :=jf8bit; //压缩格式为baseline 256色这句设了图片就存不了了:(
JPG.Compress;
// if fileexists(jpgFile) then
// if not (deletefile(jpgFile)) then exit;
JPG.SaveToFile(JpgFile);
BMP.Destroy;
JPG.Destroy;
end;
 
Use PixelFormat to set the pixel format of the JPEG image to 8-bit for video drivers that cannot display 24-bit.
the native format of a JPEG image is 24-bit.PixelFormat is used for decompression, that is, for reading in files.

帮助上说:TJpegImage内部的pixelformat是24bit,8bit只用于不能显示24bit的情况,而且是
读取图像捷压缩的时候
 
系统颜色为256色时估计可以。
 
不同的图片有不同的冗余度,所以不同的图片压缩的结果也有不同。
另外纵综你写的程序,存在不少隐患,下面是我写的程序,请赐教。

var
Bmp:TBitmap;
Jpg:TJpegImage;
begin
Bmp:=TBitmap.Create;
Jpg:=TJpegImage.Create;
try
Bmp.LoadFromFile(IuputFileName);
Jpg.Assign(Bmp);
Jpg.CompressionQuality:=30;
Jpg.SaveToFile(OutputFileName);
finally
Bmp.Free;
Jpg.Free;
end;
end;
 
首先你要了解这两种图片格式, BMP是以bit来计算颜色的, 所以它能构显示:
1, 2, 4, 8, 16, 24bit的彩色图片以及2, 4, 16, 256级灰度的单色图片
而JPG采用的是YUV有损压缩格式, 8*8的字节块(block)中包含2Y+U+V的信息,
所以只支持:16, 24, 32bit的彩色图片和2级灰度的单色图片

这样你就明白了为什么总是压缩成了16bit的彩色图片了吧?

其实你可以压缩成PCX格式的.
 
没办法,项目要求图片必须保存为jpg,所以压成PCX不行。

另外,我的主要问题是:

请问各位有没有高招可以把256色灰阶的bmp还压缩成256色灰阶的 jpg阿?

另外不管是不是256色灰阶,我主要想把jpg压得小一点,压缩率30%和baseline是必须参
数。不可更改。
因为数据库存的可能会有几百万张甚至更多图片,如果一张图片就20K的话,硬盘承受不了,所以我只想图片
压缩得越小越好!压到10k以内还算勉强能承受。
 
记得256的是用grayscale:boolean;
好象是灰度级的
估计只能用其他控件实现
 
那有好的控件可以实现bmp压成jpg的么?
如果有的话,麻烦给个url.
thx
 
这样行否:

把图片尺寸改小。
 
Jpeg好象不支持256色的图片格式,只有16,24,32位的格式
 
减少jpg的尺寸可以有以下方法
1,按原尺寸的1/4或1/8存储。
2, 灰度显示
3, 8Bit图片。

procedure TfrmMain.SetJPEGOptions;
var
Temp: Boolean;
begin
Temp := Image1.Picture.Graphic is TJPEGImage;
if Temp then
with TJPEGImage(Image1.Picture.Graphic) do
begin
CompressionQuality := 100;
PixelFormat := jf24Bit;//可以设为jf8Bit
Scale := jsFullSize;//可以设置为1/8,减少jpg尺寸
Grayscale := True;//灰度显示
Performance := TJPEGPerformance(Self.Performance.ItemIndex);
ProgressiveDisplay := Self.ProgressiveDisplay.Checked;
end;
Scale.Enabled := Temp;
PixelFormat.Enabled := Temp;
Colorspace.Enabled := Temp;
Performance.Enabled := Temp;
ProgressiveDisplay.Enabled := Temp
and TJPEGImage(Image1.Picture.Graphic).ProgressiveEncoding;
Image1.IncrementalDisplay := IncrementalDisplay.Checked;
end;
 
多人接受答案了。
 
后退
顶部