[英]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.