我有一些使用Bitmap
类创建图表的代码。然而,生成的位图的质量非常差,我怎样才能提高质量呢?请注意,我使用的是Compact Framework!
以下是我如何做各种事情的几个片段:
使用基于现有jpg的背景创建位图
Bitmap bitmap = new Bitmap(filename);
然后我从位图
创建一个Graphics
类
Graphics myG = Graphics.FromImage(bitmap);
然后我按照这样绘制图形:
myG.DrawLine(majorAxisPen, graphRect.Left, graphRect.Bottom, graphRect.Right, graphRect.Bottom);
在绘制了我需要的所有内容之后,然后保存Bitmap
,就像这样:
bitmap.Save(fileDestination, System.Drawing.Imaging.ImageFormat.Jpeg);
这是它产生的图像
答案 0 :(得分:5)
您可能会遇到两种“低质量”的来源。
每个Graphics
对象都有许多属性,用于控制可以对对象执行的操作的“质量”。特别是,您应该将SmoothingMode
设置为HighQuality
以避免线条图上出现锯齿现象。 .NET Compact Framework中不支持 。
要避免压缩伪像,则可以通过手动控制压缩,而不是使用(低质量)默认控制JPEG压缩参数ImageFormat.Jpeg
- 不幸的是,在CF这样做是不可能的不诉诸手册P /调用或第三方图书馆。有关完整.NET Framework的更广泛的代码示例,请参阅我写给类似问题的答案:How do you conver a HttpPostedFileBase to an Image?。
这是很不错的选择是使用使用PNG,不会在每次保存时间而降低品质无损图像格式 - 给你贴的例子中的简单的几何形状,这甚至不会花你一分钱在文件方面-尺寸。使用其他格式可能是您唯一的选择;由于ImageCodecInfo
不可用,因此无法在Compact Framework中自定义jpeg编码器参数。如果您真的需要Jpeg,可以尝试直接使用外部库(例如http://www.opennetcf.com/library/sdf/)或P / Invoke本机方法来访问特定于平台的编码器。
一些可能的抗锯齿方法:
答案 1 :(得分:2)
你还没有说出质量差的原因。是否有可见的JPEG工件?颜色错了吗?线条是锯齿状的吗?
不知道具体问题是什么,很难给出解决方案。
一些可能的问题/解决方案:
线条呈锯齿状:使用Graphics.SmoothingMode指定线条的渲染方式。
线条呈锯齿状:使用适合艺术线条的压缩格式:JPEG不适合艺术线条,GIF和PNG都适用。
存在压缩瑕疵:不建议重新压缩已压缩(JPEG)的图形。如果您有未压缩的源图像,请将其用作基础。
存在压缩瑕疵:指定损耗较小的JPEG级别,或使用无损压缩类型,如GIF或PNG。
答案 2 :(得分:1)
乍看之下,我会说在保存通话中检查可用的选项,我认为您可以指定Jpeg质量值以使用更高的值,或者您可以切换到像PNG那样的无损压缩。
答案 3 :(得分:0)
尝试尝试使用图形质量:
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
根据我的经验,可接受的最低质量会产生相对较小的文件。视觉质量在90%和100%之间的差异是不可见的,但文件将在90%时小到5倍。