我们的系统类库中定义了如下方法,用来保存图片:
internal void WriteBitmap(Bitmap value)
{
MemoryStream bitmapStream = new MemoryStream();
value.Save(bitmapStream, System.Drawing.Imaging.ImageFormat.Png);
this.WriteStream(bitmapStream);
bitmapStream.Close();
}现在遇到个问题,有张原始文件格式为jpg的2M大小的图,用bitmap读进来的后变成了40M大小,在保存的时候如果用上面的方法存成png格式,那么就会占用40M的空间,如果用Jpeg去存,可以存回成2M的。我想问的是,有什么高效率的方法来判断一个Bitmap我们到底应该用什么格式来存,并且保证不会有数据丢失。
判断Image.PixelFormat,靠谱吗?
internal void WriteBitmap(Bitmap value)
{
MemoryStream bitmapStream = new MemoryStream();
value.Save(bitmapStream, System.Drawing.Imaging.ImageFormat.Png);
this.WriteStream(bitmapStream);
bitmapStream.Close();
}现在遇到个问题,有张原始文件格式为jpg的2M大小的图,用bitmap读进来的后变成了40M大小,在保存的时候如果用上面的方法存成png格式,那么就会占用40M的空间,如果用Jpeg去存,可以存回成2M的。我想问的是,有什么高效率的方法来判断一个Bitmap我们到底应该用什么格式来存,并且保证不会有数据丢失。
判断Image.PixelFormat,靠谱吗?
不用Bitmap的构造方法
png是无损压缩,支持透明图层。读取文件时Image img = Image.FromFile(FileName);
,获取Image.RawFormat,得到文件的图片格式,存的是很,使用相同的RawFormat.
牛!问下个小问题Bitmap::RawFormat == ImageFormat.Jpeg 始终为false, 非得用Bitmap::RawFormat.Equals 方法,这个咋这么奇怪,==不是调用的object.Equals 方法吗? 忘记了得补补功课了:)
@yuwenge谢谢你们的回复,但底层到处用的是Bitmap,如果能避免换成Image,我就尽量不改,要不然改动就太大了
bitmapStream.Position=0;
//加上这句试试
JPEG不是无损压缩的.
通过文件头获取相关格式
ImageFormat没有对==运算符进行重载,但重写了Equals方法,具体你可以查MSDN
ImageFormat 方法
可以直接保存PNG格式的。
string ss = Picname .Substring(Picname .LastIndexOf(".")+1);
Picname图片名
ss就是图片呢格式吧