本帖最后由 cde32 于 2012-11-14 14:48:55 编辑

解决方案 »

  1.   

    图像大小和dpi
    如果先要改变图片的大小,jpeg图片还可以对图片质量进行压缩 /// <summary>
            /// jpeg图片压缩
            /// </summary>
            /// <param name="sFile"></param>
            /// <param name="outPath"></param>
            /// <param name="flag">压缩质量</param>
            /// <returns></returns>
            public static bool GetPicThumbnail(string sFile, string outPath, int flag)
            {
                System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
                ImageFormat tFormat = iSource.RawFormat;            //以下代码为保存图片时,设置压缩质量  
                EncoderParameters ep = new EncoderParameters();
                long[] qy = new long[1];
                qy[0] = flag;//设置压缩的比例1-100  
                EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
                ep.Param[0] = eParam;
                try
                {
                    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo jpegICIinfo = null;
                    for (int x = 0; x < arrayICI.Length; x++)
                    {
                        if (arrayICI[x].FormatDescription.Equals("JPEG"))
                        {
                            jpegICIinfo = arrayICI[x];
                            break;
                        }
                    }
                    if (jpegICIinfo != null)
                    {
                        iSource.Save(outPath, jpegICIinfo, ep);//dFile是压缩后的新路径  
                    }
                    else
                    {
                        iSource.Save(outPath, tFormat);
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
                finally
                {
                    iSource.Dispose();
                    iSource.Dispose();
                }
            }    }
      

  2.   

    图像大小和dpi博客里:
    bmpTarget = TiffManager.KiSharpen(bmpTarget, (float)0.7);
    这句是什么意思?在这出错了!出错提示:
    CS0103: The name 'TiffManager' does not exist in the current context
      

  3.   

    bmpTarget = TiffManager.KiSharpen(bmpTarget, (float)0.7);这句话是tiff格式图片处理的,可以忽略
      

  4.   

    可是下面这句是位深度设置的,还是有“TiffManager”,该怎样处理:
    bmpTarget = TiffManager.ConvertTo1bbpIndexed(bmpTarget, (float)0.8);
      

  5.   

       bmpTarget.SetResolution(fTargetHorResolution, fTargetVerResolution);
    主要是这一句,这个就是设置dpi的,设置完成后查看图片的高级属性图片的dpi已经改变了
    dpi的数值不会影响到图片的本身大小,应该是打印时候的一个参数来使用的。
    如果想要改变图片的大小,jpeg图片可以通过我给你的那个方法来设置压缩比
      

  6.   

    这就是说,没有办法改变png格式的分辨率和位深度?
    我搜索过,这样用SetResolution确实只能改变名义上的属性数值,对分辨率没有影响,是不是用的不对?而且PixelFormat.Format32bppPArgb也不知道具体用法。
      

  7.   

    你的分辨率指的是什么?图片的高和宽?
    位深度指的又是什么?
    SetResolution改变就是图片的dpi
      

  8.   

    分辨率指的是水平和垂直dpi,但是m_Bitmap.SetResolution(8, 8);只能改变名义上的分辨率。这些你看看图片属性就知道了,位深度也一样!
    Bitmap截图默怎样设置这两个参数?
      

  9.   

    什么叫做名义上的分辨率?我的属性里已经改变了呀,你要改变的是什么?你说的不是这个dpi?
    以下是截图代码
     /// <summary>
            /// 根据范围从原始图像中截取
            /// </summary>
            /// <param name="sourceImage"></param>
            /// <param name="cutRectangle"></param>
            /// <returns></returns>
            public Bitmap CutImageByRectangle(Bitmap sourceImage, Rectangle cutRectangle)
            {
                Bitmap resultBitmap = new Bitmap(cutRectangle.Width, cutRectangle.Height);
                using (Graphics g = Graphics.FromImage(resultBitmap))
                {
                    Rectangle resultRectangle = new Rectangle(0, 0, cutRectangle.Width, cutRectangle.Height);
                    Rectangle sourceRectangle = new Rectangle(cutRectangle.X, cutRectangle.Y, cutRectangle.Width, cutRectangle.Height);
                    g.DrawImage(sourceImage, resultRectangle, sourceRectangle, GraphicsUnit.Pixel);
                }
                return resultBitmap;
            }
      

  10.   

    我在主贴说了SetResolution貌似无效。你把dpi设成100和10对比一下,尽管图片名义上的属性变了,但是图片的体积大小和清晰度一点也没变!10dpi应该能看出马赛克了,可这些10dpi甚至3dpi的图片依旧十分清晰——真正的dpi没有变!
    还有,网上也有介绍改变位深度的文章,你给我的例子是变成1——变成黑白的!可我运行不了那段代码,总出错!
      

  11.   

    使用此方法,可为新创建的位图设置所需的分辨率。更改图像的分辨率不会更改其物理大小。
    这是msdn给的解释
    之前给你的那个方法是没有问题的,能够压缩问价你的大小。如果你要做马赛克的效果,可以通过其他方式实现
    马赛克
    另外如果有条件可以尝试把dpi改变后打印出来,看看这个参数是不是用开控制打印时的dpi的
      

  12.   

    bitmap的SetResolution  改变的DPI值只有在打印的时候才能体现出来,和图像的大小和位深没有任何关系。
      

  13.   

    什么“名义上的分辨率”,那就是分辨率,是你自己把分辨率理解错了
    分辨率是用来联系图片的像素尺寸和物理尺寸的,只有需要在二者之间转化的时候才能体现出作用。比如,扫描仪在扫描的时候需要记录下原件的物理尺寸,怎么记录呢,就是记录下自己生成图片时使用的分辨率。打印机在打印图片的时候是按照图片的物理尺寸打印,打印机怎么知道图片的物理尺寸是多少呢?这个时候就需要借助分辨率信息把像素尺寸转化为物理尺寸。而电脑上大部分程序忽略图片的分辨率信息,如实地显示图片文件的每一个像素,也就是是按照图片的像素大小在显示。所以不管你怎么改分辨率,在电脑上看图片的“大小”不会变。当然有些印刷设计相关的软件是会模拟“物理尺寸”显示的,比如PhotoShop。顺便说一下,.NET中的Graphics.DrawImage的最简单重载也是按照“物理尺寸”在绘制,所以有时候你会发觉他画出来的图片的大小和图片在其他软件,比如图片浏览器,中的大小不一致。如果你单纯地改变分辨率信息,意味着改变图片的物理尺寸。分辨率调高,物理尺寸变小,打印出来图片变小,清晰度变高;分辨率调低,物理尺寸变大,打印出来图片变大,清晰度变低。如果你想要改变分辨率而不影响图片的物理尺寸,那你还得改变图片的像素尺寸。增大分辨率,需要补充更多的像素;减小分辨率,需要删除掉一些多余的像素。至于怎么补充,怎么删除,有很多不同的算法。ps有这个功能,好像就提供了几种不同的算法供选择。
      

  14.   

    谢谢各位的耐心解释!
    在PS上反复对比,明白SetResolution改变的DPI是什么效果了。
    可是下面这句是设置位深度的:
    bmpTarget = TiffManager.ConvertTo1bbpIndexed(bmpTarget, (float)0.8); 
    报错了!该怎样设置位深度呢?
      

  15.   

    Bitmap bmp = new Bitmap(@"G:\图片\古巷.jpg");
                bmp.SetResolution(96,96);