C#中PNG图像的问题

9
在Visual Studio 2008中工作。我正在尝试在PNG图像上绘制并再次保存该图像。
我按照以下步骤进行操作:
private Image img = Image.FromFile("file.png");
private Graphics newGraphics;

并且在构造函数中:

newGraphics = Graphics.FromImage(img);

构建解决方案没有错误。当我尝试运行它时,我得到了这个错误:
一个图形对象无法从一个具有索引像素格式的图像中创建。
我在使用C#中的图像方面没有太多经验。这是什么意思,我该如何解决?
编辑:通过调试,Visual Studio告诉我图像具有format8bppindexed像素格式。
所以如果我不能使用Graphics类,我可以用什么呢?
编辑2:阅读完this之后,我认为在使用GDI+时最好坚持使用JPG文件,对吗?
编辑3:我的using语句:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

你使用这个方法有什么进展吗?http://www.c-sharpcorner.com/UploadFile/rrraman/graphicsObject08232007102733AM/graphicsObject.aspx - Greg
我经常使用Graphics对象来处理PNG文件。请发布你正在使用的PNG文件的链接,我们来看看出了什么问题。 - MusiGenesis
内部 GDI 使用位图,JPG 是压缩的,不适合处理原始数据。您的图像是 8bppIndexed,这是一种位图格式,其中颜色存储在调色板中而不是像素数据中。Graphics 对象无法直接修改像素值,因为那样不会改变它。您需要将其转换为 24bppRGB。 - badbod99
2个回答

13

您无法从索引图像格式(PNG、GIF等)中创建图形。您应该使用位图(文件或将图像转换为位图)。

Image img = Image.FromFile("file.png");
img = new Bitmap(img);
newGraphics = Graphics.FromImage(img);

也许我没有必要的“using”语句,但是Visual Studio无法识别该函数。 - KdgDev
根据文档,这将无法处理索引图像 http://msdn.microsoft.com/en-us/library/system.drawing.graphics.fromimage.aspx - badbod99
2
badbod99 > 你错过了这个: img = new Bitmap(img); - Guillaume
它位于System.Drawing命名空间中。http://msdn.microsoft.com/en-us/library/system.drawing.image.fromfile.aspx - badbod99

10

如果没有一个更好的支持索引PNG的PNG库,您将无法绘制到该图像,因为显然GDI+图形对象不支持索引图像。

如果您不需要使用索引PNG,则可以捕获该错误并使用第三方实用程序将输入转换为常规RGB PNG。

编辑:

我找到了这个链接http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html,它提供了一种在图像上绘制的方法,但它不会影响原始图像,只会影响您可以保存(Save())的副本。

如果链接失效:

Bitmap bm = (Bitmap) System.Drawing.Image.FromFile("Fci-h.jpg",true);
Bitmap tmp=new Bitmap (bm.Width ,bm.Height );
Graphics grPhoto = Graphics.FromImage(tmp);
grPhoto.DrawImage(bm, new Rectangle(0, 0, tmp.Width , tmp.Height ), 0, 0, tmp.Width , tmp.Height , GraphicsUnit.Pixel);

GDI+不支持从它们创建图形上下文,这对于OP具有相同的效果。无论如何,这里有一个不错的链接提供解决方法: http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html - Ron Warholic
那篇博客做到了。谢谢。 - KdgDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接