当前位置: 首页 > 编程语言 > C#

C#学习教程:.NET-Bitmap.Save在Windows7上忽略Bitmap.SetResolutionshare

时间:2023-04-10 14:48:59 C#

.NET-Bitmap.Save在Windows7上忽略Bitmap.SetResolution印刷。保存的图像分辨率(DPI不是像素尺寸)必须设置为我们指定的值才能正确打印。我们导入的一些图片没有分辨率值(生成时错误的EXIF),所以我们不得不在写入之前纠正它们。我们使用Bitmap.SetResolution。它在XP和Windows8上运行良好,但是当我们在Windows7上写入(Bitmap.Save)图像时,它们总是使用原生分辨率元信息写入,而忽略了SetResolution。这是我们针对XP和8而不是7所做的测试。stringoriginalFile=@"D:tempimgoriginal_img.jpg";stringnewFile=@"D:tempimgnew_img.jpg";位图bitmap=(Bitmap)Image.FromFile(originalFile);位图.SetResolution(200,200);位图.Save(newFile,ImageFormat.Jpeg);图片image=Image.FromFile(newFile);intdpiX=(int)Math.Round(image.Horizo??ntalResolution,MidpointRounding.ToEven);intdpiY=(int)Math.Round(image.VerticalResolution,MidpointRounding.ToEven);Console.WriteLine("DPI为{0}x{1}",dpiX,dpiY);保存前调试总是显示SetResolution指定的正确分辨率,就是保存的图片有问题。这可能会在此处报告:http://social.msdn.microsoft.com/Forums/vstudio/en-US/62368caa-05f4-4798-9c59-5d82f881a97c/systemdrawingbitmapsetresolution-is-completely-broken-on-windows-7?forum=netfxbcl但问题似乎仍未解决。真的没有办法让它发挥作用吗?我是否必须为此使用额外的库?Hmya,这是Windows组件中的错误。Windows组总是非常不愿意修复这样的错误,重大更改被推迟到下一个Windows版本。它确实在Windows8中得到修复。请考虑您正在做的事情有多么不寻常,图像的DPI应始终由记录图像的设备设置。就像相机或扫描仪一样,它们永远不会出错。周围没有任何设备具有200点/英寸的分辨率。如果您迫切希望找到解决方法,您可以考虑修补文件本身。对于JPEG文件来说并不难,文件头中的字段很容易找到:usingSystem.IO;...publicstaticvoidSetJpegResolution(stringpath,intdpi){使用(varjpg=newFileStream(path,FileMode.Open,FileAccess.ReadWrite,FileShare.None))使用(varbr=newBinaryReader(jpg)){boolok=br.ReadUInt16()==0xd8ff;//检查标头ok=ok&&br.ReadUInt16()==0xe0ff;br.ReadInt16();//跳过长度ok=ok&&br.ReadUInt32()==0x4649464a;//应该是JFIFok=ok&&br.ReadByte()==0;ok=ok&&br.ReadByte()==0x01;//主要版本应该是1br.ReadByte();//跳过小版本bytedensity=br.ReadByte();ok=ok&&(密度==1||密度==2);if(!ok)thrownewException("不是有效的JPEG文件");如果(密度==2)dpi=(int)Math.Round(dpi/2.56);varbigendian=BitConverter.GetBytes((短)dpi);Array.Reverse(bigendian);jpg.Write(bigendian,0,2);jpg.Write(bigendian,0,2);我找到了一个可以完成这项工作的解决方法。它并不优雅,但是......不是将分辨率应用于原始图像,而是复制它并处理副本:Bitmapbitmap=(Bitmap)Image.FromFile(originalFile);位图newBitmap=newBitmap(bitmap)newBitmap.SetResolution(200,200);newBitmap.Save(newFile,ImageFormat.Jpeg);现在它可以在Windows7上运行。去看看吧。我喜欢HansPassant的想法,但它更简洁。如果有重新压缩,我不知道我所做的是否弄乱了图像。以上就是C#学习教程:.NET-Bitmap.Save忽略Windows7上Bitmap.SetResolution分享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多多付出注意——本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: