30

我有一张 DPI 为 72 的 JPEG 图片。我想将 72 dpi 更改为 300 dpi。

如何使用 C# 更改 JPEG 图片的分辨率?

4

5 回答 5

67

您必须将这些位复制到具有目标分辨率的新图像上,如下所示:

    using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg"))
    {
        using (Bitmap newBitmap = new Bitmap(bitmap))
        {
            newBitmap.SetResolution(300, 300);
            newBitmap.Save("file300.jpg", ImageFormat.Jpeg);
        }
    }
于 2010-12-13T09:05:31.120 回答
9

本文讨论了在不重新保存/重新压缩的情况下修改EXIF 数据SetResolution(因此会丢失信息——它实际上使用了一个“技巧”;可能有更多的直接库) 。这是在快速谷歌搜索中找到的,但我想指出您需要做的就是修改存储的 EXIF 数据。

另外:用于 EXIF 修改的 .NET lib和另一个SO 问题。当你知道好的搜索词时,谷歌就拥有了。

于 2010-12-13T09:30:36.580 回答
4

这只是按正确比例放大图像宽度和高度的问题。并非所有图像格式都支持 DPI 元标记,当它们支持时,它们告诉您的图形软件要做的就是将图像除以提供的比率。

例如,如果您将 300dpi 的图像从 Photoshop 导出为 JPEG,则在您的图片查看软件中查看时,该图像会显得非常大。这是因为 JPEG 不支持 DPI 信息,并且在保存时会被丢弃。这意味着您的图片查看器不知道图像的分割比例,而是以 1:1 的比例显示图像。

要获得缩放图像所需的比例,请参见下面的代码。请记住,这拉伸图像,就像在 Photoshop 中一样。您实际上将图像的大小增加了四倍,因此它会拉伸并可能产生伪影。

伪代码

ratio = 300.0 / 72.0   // 4.167
image.width * ratio
image.height * ratio
于 2010-12-13T08:48:07.160 回答
-1

DPI 不应存储在位图图像文件中,因为位图的大多数数据源使其毫无意义。

位图图像存储为像素。像素在任何方面都没有固有的大小。只有在渲染时——无论是显示器、打印机还是自动十字绣机——DPI 才重要。

以 100 dpi 打印的800x1000像素位图图像变成漂亮的 8x10" 照片。以 200 dpi 打印,完全相同的位图图像变成 4x5" 照片。

用数码相机捕捉图像,DPI 是什么意思?这当然不是聚焦在 CCD 成像仪上的区域的大小——这取决于距离,并且随着美国宇航局在同一视野中返回 100,000 光年、相距 200 万光年的星系图像,什么样的您是否从信息中获得了 DPI ?

不要成为位图图像的 DPI 概念的受害者——这是一个错误。位图图像没有物理尺寸(除了 RAM 或硬盘驱动器中几微米的存储空间)。它只是显示的图像或打印的图像,其物理尺寸以英寸、毫米或弗隆为单位。

于 2012-12-21T18:49:01.473 回答
-1

此代码使用合并和转换 200 dbi

  static void Main(string[] args)
        { Path string Outputpath = @"C:\Users\MDASARATHAN\Desktop\TX_HARDIN_10-01-2016_K";

            string[] TotalFiles = Directory.GetFiles(Outputpath, "*.tif", SearchOption.AllDirectories);
            foreach (string filename in TotalFiles)
            {

                Bitmap bitmap = (Bitmap)Image.FromFile(filename);

                string ExportFilename = string.Empty;
                int Pagecount = 0;
                bool bFirstImage = true;
                bitmap.SetResolution(200, 200);

                ExportFilename = Path.GetDirectoryName(filename) + "\\" + Path.GetFileName(filename)+"f";
                MemoryStream byteStream = new MemoryStream();
                Pagecount = bitmap.GetFrameCount(FrameDimension.Page);

                if (bFirstImage)
                {
                    bitmap.Save(byteStream, ImageFormat.Tiff);
                    bFirstImage = false;
                } Image tiff = Image.FromStream(byteStream);
                ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
                EncoderParameters encoderParams = new EncoderParameters(2);
                EncoderParameter parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
                encoderParams.Param[0] = parameter;
                parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
                encoderParams.Param[1] = parameter;
              //  bitmap.Dispose();
                try
                {

                    tiff.Save(ExportFilename, encoderInfo, encoderParams);
                }
                catch (Exception ex)
                {

                }
                EncoderParameters EncoderParams = new EncoderParameters(2);
                EncoderParameter SaveEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
                EncoderParameter CompressionEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
                EncoderParams.Param[0] = CompressionEncodeParam;
                EncoderParams.Param[1] = SaveEncodeParam;
                if (bFirstImage == false)
                {

                    for (int i = 1; i < Pagecount; i++)
                    {

                            //bitmap = (Bitmap)Image.FromFile(filenames);
                            byteStream = new MemoryStream();
                            bitmap.SelectActiveFrame(FrameDimension.Page, i);
                            bitmap.Save(byteStream, ImageFormat.Tiff);
                            bitmap.SetResolution(200, 200);
                            tiff.SaveAdd(bitmap, EncoderParams);

                    }

                } SaveEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
                EncoderParams = new EncoderParameters(1);
                EncoderParams.Param[0] = SaveEncodeParam;
                tiff.SaveAdd(EncoderParams);
                tiff.Dispose();
                bitmap.Dispose();
                File.Delete(filename);

            }


        }
于 2016-01-20T12:00:38.207 回答