我有一张 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);
}
}
例如,如果您将 300dpi 的图像从 Photoshop 导出为 JPEG,则在图片查看软件中查看时,该图像会显得非常大。 这是因为 JPEG 不支持 DPI 信息,并且在保存时会被丢弃。 这意味着您的图片查看器不知道以什么比例划分图像,而是以 1:1 的比例显示图像。
要获取缩放图像所需的比例,请参阅下面的代码。 请记住,这
将会拉伸图像,就像在 Photoshop 中一样。您实际上将图像的大小扩大了四倍,因此它会拉伸并可能产生伪影。
伪代码
ratio = 300.0 / 72.0 // 4.167
image.width * ratio
image.height * ratio
更改图像的 dpi 使用 MagickImage 而不是全部。
dotnet add package Magick.NET-Q8-AnyCPU
并应用这个 -->
// You can work with filePath, stream etc. also
using var image = new MagickImage(bytesOfImage);
double targetDPI = 300;
image.Density = new Density(targetDPI, targetDPI);
var outputStream = new MemoryStream();
// Save the output image
image.Write(outputStream);
// Return the byte array of the resized image
return outputStream.ToArray();
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 才重要。
以 100 dpi 打印的 800x1000 像素位图图像会变成漂亮的 8x10" 照片。以 200 dpi 打印,
完全相同 位图图像会变成 4x5" 照片。
用数码相机拍摄图像,DPI 是什么意思? 当然不是 CCD 成像仪聚焦的区域大小 - 这取决于距离,并且 NASA 返回的星系图像直径为 100,000 光年,相距 200 万光年,在相同的视场中,什么样的星系您从THAT 信息中获得 DPI 的值吗?
不要成为位图图像 DPI 想法的受害者 - 这是一个错误。 位图图像没有物理尺寸(除了 RAM 或硬盘驱动器中几微米的存储空间)。 它只是显示的图像或打印的图像,其物理尺寸以英寸、毫米或弗隆为单位。