簡體   English   中英

如何更改圖像的分辨率 (DPI)?

[英]How to change resolution (DPI) of an image?

我有一張 DPI 為 72 的 JPEG 圖片。我想將 72 dpi 更改為 300 dpi。

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

您必須將這些位復制到具有目標分辨率的新圖像上,如下所示:

    using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg"))
    {
        using (Bitmap newBitmap = new Bitmap(bitmap))
        {
            newBitmap.SetResolution(300, 300);
            newBitmap.Save("file300.jpg", ImageFormat.Jpeg);
        }
    }

本文討論在不重新保存/重新壓縮的情況下修改EXIF 數據(因此會丟失信息——它實際上使用了SetResolution方法所需的“技巧”;可能有更多的直接庫)。 這是在快速谷歌搜索中找到的,但我想指出您需要做的就是修改存儲的 EXIF 數據。

另外:用於 EXIF 修改的 .NET lib和另一個SO 問題 當你知道好的搜索詞時,谷歌就擁有了。

這只是按正確的比例縮放圖像寬度和高度的問題。 並非所有圖像格式都支持 DPI 元標記,當它們支持時,它們只是告訴您的圖形軟件要做的就是將圖像除以提供的比率。

例如,如果您將 300dpi 的圖像從 Photoshop 導出為 JPEG,則在您的圖片查看軟件中查看時,該圖像會顯得非常大。 這是因為 DPI 信息在 JPEG 中不受支持,並且在保存時會被丟棄。 這意味着您的圖片查看器不知道圖像的分割比例,而是以 1:1 的比例顯示圖像。

要獲得縮放圖像所需的比例,請參閱下面的代碼。 請記住,這拉伸圖像,就像在 Photoshop 中一樣。 您實際上是將圖像的大小增加了四倍,因此它會拉伸並可能產生偽影。

偽代碼

ratio = 300.0 / 72.0   // 4.167
image.width * ratio
image.height * ratio

此代碼使用合並和轉換 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);

            }


        }

DPI 不應存儲在位圖圖像文件中,因為位圖的大多數數據源使其變得毫無意義。

位圖圖像存儲為像素。 像素在任何方面都沒有固有的大小。 只有在渲染時——無論是顯示器、打印機還是自動十字綉機——DPI 都很重要。

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

用數碼相機拍攝圖像,DPI 是什么意思? 這當然不是聚焦在 CCD 成像器上的區域的大小——這取決於距離,而且美國宇航局返回的星系圖像跨越 100,000 光年,相距 200 萬光年,在相同的視野中,是什么樣的的 DPI 你是從那個信息中得到的嗎?

不要成為位圖圖像的 DPI 想法的受害者 - 這是一個錯誤。 位圖圖像沒有物理尺寸(RAM 或硬盤驅動器中只有幾微米的存儲空間)。 它只是顯示的圖像或打印的圖像,其物理尺寸以英寸、毫米或弗隆為單位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM