.NET CF Bitmap类质量很差

时间:2011-01-31 14:43:23

标签: c# .net graphics compact-framework

我有一些使用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);

这是它产生的图像 Poor quality image

4 个答案:

答案 0 :(得分:5)

您可能会遇到两种“低质量”的来源。

  1. 对图形对象的实际绘制可能是低质量的 - 即您绘制的线条可能是别名(像素化)。
  2. 当您将图形输​​出到流时,低质量可能是jpeg编码的副作用。
  3. 每个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倍。