我有一张DPI为72的JPEG图片。我想将72 dpi更改为300 dpi。
如何使用C#更改JPEG图片的分辨率?
答案 0 :(得分:55)
您必须使用目标分辨率将位复制到新图像上,如下所示:
using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg"))
{
using (Bitmap newBitmap = new Bitmap(bitmap))
{
newBitmap.SetResolution(300, 300);
newBitmap.Save("file300.jpg", ImageFormat.Jpeg);
}
}
答案 1 :(得分:9)
This article讨论修改EXIF data而没有重新保存/重新压缩(因而丢失信息 - 它实际上使用了“技巧”;可能需要更多直接库)通过SetResolution
方法。这是在快速谷歌搜索中找到的,但我想指出你需要做的就是修改存储的EXIF数据。
Also: .NET lib for EXIF modification和另一个SO question。当您知道好的搜索字词时,Google就会拥有。
答案 2 :(得分:4)
只需按正确的比例缩放图像宽度和高度即可。并非所有的图像格式都支持DPI元标记,当它们发生时,它们告诉图形软件要做的就是将图像除以提供的比例。
例如,如果将300dpi图像从Photoshop导出为JPEG,则在图片查看软件中查看时图像将显得非常大。这是因为JPEG不支持DPI信息,保存时会丢弃。这意味着您的图片查看器不知道要分割图像的比例,而是以1:1的比例显示图像。
要获得缩放图像所需的比例,请参阅下面的代码。请记住,这个将拉伸图像,就像在Photoshop中一样。你基本上是图像尺寸的四倍,所以它会拉伸并可能产生伪影。
伪码
ratio = 300.0 / 72.0 // 4.167
image.width * ratio
image.height * ratio
答案 3 :(得分:-2)
DPI不应存储在位图图像文件中,因为位图的大多数数据源都会使其无意义。
位图图像存储为像素。像素在任何方面都没有固有的大小。只有在渲染时 - 无论是监视器,打印机还是自动交叉缝纫机 - DPI都很重要。
以100 dpi打印的800x1000像素位图图像变成漂亮的8x10“照片。以200 dpi打印, EXACT SAME 位图图像变成4x5”照片。
使用数码相机拍摄图像,DPI是什么意思?当然不是聚焦在CCD成像器上的区域的大小 - 这取决于距离,并且NASA返回10万光年的星系图像,相隔200万光年,在同一视场中,是什么样的你能从 THAT 信息获得DPI吗?
不要成为位图图像DPI概念的受害者 - 这是一个错误。位图图像没有物理尺寸(除了RAM或硬盘中几微米的存储空间)。它只是一个显示的图像或打印的图像,其物理尺寸以英寸,毫米或弗隆为单位。
答案 4 :(得分:-2)
此代码使用merge和convert 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);
}
}