我们的系统类库中定义了如下方法,用来保存图片:
  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,靠谱吗?

解决方案 »

  1.   

    Image img = Image.FromFile(FileName);
    不用Bitmap的构造方法
      

  2.   

    jpeg是有损压缩,并且不支持透明图层。
    png是无损压缩,支持透明图层。读取文件时Image img = Image.FromFile(FileName);
    ,获取Image.RawFormat,得到文件的图片格式,存的是很,使用相同的RawFormat.
      

  3.   


    牛!问下个小问题Bitmap::RawFormat == ImageFormat.Jpeg 始终为false, 非得用Bitmap::RawFormat.Equals 方法,这个咋这么奇怪,==不是调用的object.Equals 方法吗? 忘记了得补补功课了:)
      

  4.   

    @wuyazhe 
    @yuwenge谢谢你们的回复,但底层到处用的是Bitmap,如果能避免换成Image,我就尽量不改,要不然改动就太大了
      

  5.   


      bitmapStream.Position=0;
      
    //加上这句试试
      

  6.   

    Bitmap.Save(filename,ImageFormat.Bmp)
    JPEG不是无损压缩的.  
    通过文件头获取相关格式
      

  7.   


    ImageFormat没有对==运算符进行重载,但重写了Equals方法,具体你可以查MSDN
    ImageFormat 方法
      

  8.   

    抱歉,好像问题还是没解决,在我们实际项目中,当去save的时候,发现那张image的RawFormat变成了MemoryBMP, 还是不能把他存成JPEG
      

  9.   

    你可以直接保存为png。忽略原始的格式。因为任何图加载到内存中,都是bitmap的了,位图的点可以映射到设备上的一个点,用于绘制屏幕。
      

  10.   


    可以直接保存PNG格式的。
      

  11.   

    谢谢大家的解答!首先不能直接存成PNG, 因为有张图片是jpeg的读成Bitmap后,再存成PNG后文件大小由原来的2M变成了40M其次这个Bitmap在中间层已经传了很多次了,所以得不到原始文件或者原始文件的路径,目前我们唯一能操作的对象就是Bitmap。
      

  12.   

    string Picname = "ImageFormat.Png";
    string ss = Picname .Substring(Picname .LastIndexOf(".")+1);
    Picname图片名
    ss就是图片呢格式吧