是的,是的……我看过与这个问题相关的其他帖子,是的……我已经用谷歌搜索过了。
但到目前为止,我无法得到我需要的结果。
我正在加载以 300 dpi 拍摄的大图像,我需要调整它的大小。
我知道......我知道...... dpi 是相对的,并不重要......重要的是像素尺寸:
DPI 本质上是打印图像时对应于一英寸的像素数,而不是在屏幕上查看图像时的像素数。因此,通过增加图像的 DPI,您不会增加屏幕上图像的大小。您只会提高打印质量。
尽管存储在图像的 EXIF 中的 DPI 信息有些无用,但它给我带来了问题。
我正在调整大小的图像丢失了原始 exif信息,包括水平和垂直分辨率 (dpi),因此它默认保存为 96 dpi。可能的原因是只有 JPEG 和其他格式可以保存元数据信息。
最终图像结果应该是这样的:275x375 at 300dpi 相反是这样的:275x375 at 96dpi
您可以争辩说它们是相同的,我同意,但是我们有一个用于加载这些图像的 corel 绘图脚本,并且由于此 dpi 信息不同,它会将其以不同的大小放置在文档上。
这是我用于调整大小的内容:
public System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, int width, int height)
{
Bitmap result = new Bitmap(width, height);
// set the resolutions the same to avoid cropping due to resolution differences
result.SetResolution(image.HorizontalResolution, image.VerticalResolution);
//use a graphics object to draw the resized image into the bitmap
using (Graphics graphics = Graphics.FromImage(result))
{
//set the resize quality modes to high quality
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//draw the image into the target bitmap
graphics.DrawImage(image, 0, 0, result.Width, result.Height);
}
//return the resulting bitmap
return result;
}
这可以很好地完成工作,但会丢失 EXIF 信息。
将 SetResolution 设置为 SetResolution(300, 300) 不起作用!
我查看了读取和更改图像的 EXIF 信息,并尝试过:
public void setImageDpi(string Filename, string NewRes)
{
Image Pic;
PropertyItem[] PropertyItems;
byte[] bDescription = new Byte[NewRes.Length];
int i;
string FilenameTemp;
System.Drawing.Imaging.Encoder Enc = System.Drawing.Imaging.Encoder.Transformation;
EncoderParameters EncParms = new EncoderParameters(1);
EncoderParameter EncParm;
ImageCodecInfo CodecInfo = GetEncoderInfo("image/jpeg");
// copy description into byte array
for (i = 0; i < NewRes.Length; i++) bDescription[i] = (byte)NewRes[i];
// load the image to change
Pic = Image.FromFile(Filename);
foreach (PropertyItem item in Pic.PropertyItems)
{
if (item.Id == 282 || item.Id == 283)
{
PropertyItem myProperty = item;
myProperty.Value = bDescription;
myProperty.Type = 2;
myProperty.Len = NewRes.Length;
Pic.SetPropertyItem(item);
Console.WriteLine(item.Type);
}
}
// we cannot store in the same image, so use a temporary image instead
FilenameTemp = Filename + ".temp";
// for lossless rewriting must rotate the image by 90 degrees!
EncParm = new EncoderParameter(Enc, (long)EncoderValue.TransformRotate90);
EncParms.Param[0] = EncParm;
// now write the rotated image with new description
Pic.Save(FilenameTemp, CodecInfo, EncParms);
// for computers with low memory and large pictures: release memory now
Pic.Dispose();
Pic = null;
GC.Collect();
// delete the original file, will be replaced later
System.IO.File.Delete(Filename);
// now must rotate back the written picture
Pic = Image.FromFile(FilenameTemp);
EncParm = new EncoderParameter(Enc, (long)EncoderValue.TransformRotate270);
EncParms.Param[0] = EncParm;
Pic.Save(Filename, CodecInfo, EncParms);
// release memory now
Pic.Dispose();
Pic = null;
GC.Collect();
// delete the temporary picture
System.IO.File.Delete(FilenameTemp);
}
那也没有用。
我尝试在此过程中稍后查看和更改 DPI(282 和 283)的 EXIF 信息:
Encoding _Encoding = Encoding.UTF8;
Image theImage = Image.FromFile("somepath");
PropertyItem propItem282 = theImage.GetPropertyItem(282);
propItem282.Value = _Encoding.GetBytes("300" + '\0');
theImage.SetPropertyItem(propItem282);
PropertyItem propItem283 = theImage.GetPropertyItem(283);
propItem283.Value = _Encoding.GetBytes("300" + '\0');
theImage.SetPropertyItem(propItem283);
theImage.Save("somepath");
但是程序崩溃说找不到属性。
如果该属性不存在,显然我无法添加它:
PropertyItem 不打算用作独立对象。PropertyItem 对象旨在供从 Image 派生的类使用。PropertyItem 对象用于检索和更改现有图像文件的元数据,而不是创建元数据。因此,PropertyItem 类没有定义的 Public 构造函数,并且您不能创建 PropertyItem 对象的实例。
我被困住了......我需要的只是一个调整大小的图像,将 dpi 设置为 300,它不应该那么难。
非常感谢任何帮助。谢谢