none
保存图片的时候,怎样才能做到不改变图像的质量。 RRS feed

  • 问题

  • 最近在学习GDI+编程,但遇到一个让我好郁闷的问题:

    我把一张图片读进内存,然后对该张图片进行旋转处理(旋转X度),进行旋转处理完毕后,再次保存该图片,但发现保存出来的图片比源图片大了很多,经对比发现:
    (源图像的位深度:1;压缩:无)(保存后的图片的位深度:32;压缩:LZW)

    问题:请问我该怎样做才能不改变源图片的质量呢?

    操作代码如下:

       //读取源图片
    
      Bitmap image = new Bitmap("H:\\a.tif");
    
    
    
       //对图片进行旋转处理
    
       Bitmap Bmp = new Bitmap(nWidth, nHeight);
    
       Bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
    
    
    
       using (Graphics g = Graphics.FromImage(Bmp))
    
       {
    
        Point[] points;
    
        /.....代码省略...../
    
       }
    
        
    
       g.DrawImage(image, points);
    
    
    
       //保存图像
    
      Bmp.Save("H:\\b.tif");
    
    
    2010年6月19日 1:27

答案

  •             // 获取编码解码器
                ImageCodecInfo ImageCodecInfo1 = null;
                ImageCodecInfo[] encoders = ImageCodecInfo.GetImageDecoders();
                foreach (ImageCodecInfo imageCodecInfo in encoders)
                {
                    if (imageCodecInfo.FormatDescription == "TIFF")
                    {
                        ImageCodecInfo1 = imageCodecInfo;
                        break;
                    }
                }
                // 保存时,设定不压缩。
                Bitmap image = new Bitmap("H:\\a.tif");
                Bitmap Bmp = new Bitmap(image.Width, image.Height, PixelFormat.Format1bppIndexed); // 设定PixelFormat
                Bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                // ...... 你的旋转处理过程
                EncoderParameters ep = new EncoderParameters(2);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionNone);
                ep.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 1L);
                Bmp.Save("H:\\b.tif", ImageCodecInfo1, ep);
    2010年7月1日 8:23

全部回复

  • 你这样试试

     /// <summary>
        /// 以逆时针为方向对图像进行旋转
        /// </summary>
        /// <param name="b">位图流</param>
        /// <param name="angle">旋转角度[0,360](前台给的)</param>
        /// <returns></returns>
        public Bitmap Rotate(Bitmap b, int angle)
        {
          angle = angle % 360;      //弧度转换
          double radian = angle * Math.PI / 180.0;
          double cos = Math.Cos(radian);
          double sin = Math.Sin(radian);
          //原图的宽和高
          int w = b.Width;
          int h = b.Height;
          int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));
          int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));
          //目标位图
          Bitmap dsImage = new Bitmap(W, H);
          System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(dsImage);
          g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
          g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
          //计算偏移量
          Point Offset = new Point((W - w) / 2, (H - h) / 2);
          //构造图像显示区域:让图像的中心与窗口的中心点一致
          Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);
          Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
          g.TranslateTransform(center.X, center.Y);
          g.RotateTransform(360 - angle);
          //恢复图像在水平和垂直方向的平移
          g.TranslateTransform(-center.X, -center.Y);
          g.DrawImage(b, rect);
          //重至绘图的所有变换
          g.ResetTransform();
          g.Save();
          g.Dispose();
          dsImage.Save("d:\\yuancd.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
          return dsImage;
        }
    
    
     private void button1_Click(object sender, EventArgs e)
        {
         
          
          Bitmap bb=new Bitmap("d:\\IMG_11547.jpg");
          Bitmap bp = Rotate(bb, 90);
          
    
        }

    努力+方法=成功
    2010年6月19日 2:11
  • 谢谢这位朋友提供的方法

    但是未能解决我的问题。

    麻烦大家帮帮慢,指教下。

    2010年6月22日 6:17
  •             // 获取编码解码器
                ImageCodecInfo ImageCodecInfo1 = null;
                ImageCodecInfo[] encoders = ImageCodecInfo.GetImageDecoders();
                foreach (ImageCodecInfo imageCodecInfo in encoders)
                {
                    if (imageCodecInfo.FormatDescription == "TIFF")
                    {
                        ImageCodecInfo1 = imageCodecInfo;
                        break;
                    }
                }
                // 保存时,设定不压缩。
                Bitmap image = new Bitmap("H:\\a.tif");
                Bitmap Bmp = new Bitmap(image.Width, image.Height, PixelFormat.Format1bppIndexed); // 设定PixelFormat
                Bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                // ...... 你的旋转处理过程
                EncoderParameters ep = new EncoderParameters(2);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionNone);
                ep.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 1L);
                Bmp.Save("H:\\b.tif", ImageCodecInfo1, ep);
    2010年7月1日 8:23
  • 楼主现在解决这问题没?我也遇到了类似的问题,我郁闷了

    程序人生

    2013年6月29日 12:25
  • .Net 內建無單色、灰階、256色繪圖。

    需先轉全彩繪圖後,再自行做遞色運算。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2013年6月29日 15:13