2009-10-26 20 views
7

Trabajando en Visual Studio 2008. Estoy tratando de dibujar en una imagen PNG y guardar esa imagen nuevamente.Problema con imágenes PNG en C#

hago lo siguiente:

private Image img = Image.FromFile("file.png"); 
private Graphics newGraphics; 

Y en el constructor:

newGraphics = Graphics.FromImage(img); 

La construcción de la solución da ningún error. Cuando trato de ejecutarlo, me sale esto:

un objeto gráfico no se puede crear de una imagen que tiene un formato de píxeles indexada.

No tengo mucha experiencia con el uso de imágenes en C#. ¿Qué significa esto y cómo puedo remediar esto?

EDITAR: a través de la depuración, Visual Studio me dice que la imagen tiene un format8bppindexed Formato de píxel.

Entonces, si no puedo usar la clase Graphics, ¿qué debo usar?

EDIT2: Después de leer this, creo que es seguro suponer que mejor me quedo con los archivos JPG cuando trabajo con GDI +, ¿no?

Edit3: mis utilizando enunciados:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Windows.Forms; 
+0

Ha habido suerte con este método? http://www.c-sharpcorner.com/UploadFile/rrraman/graphicsObject08232007102733AM/graphicsObject.aspx – Greg

+0

Utilizo archivos PNG con el objeto Graphics todo el tiempo. Publique un enlace al archivo PNG que está utilizando, y veremos qué le pasa. – MusiGenesis

+0

Internamente GDI funciona con mapas de bits, JPG está comprimido y no es realmente genial tener una imagen comprimida para trabajar con los datos sin formato. Su imagen es 8bppIndexed, este es un formato de mapa de bits donde los colores se almacenan en la paleta, no los datos de píxeles. Los objetos Graphics no pueden modificar los valores de píxeles directamente, ya que eso no lo cambiará. Necesita convertirlo a 24bppRGB – badbod99

Respuesta

9

Sin una mejor biblioteca PNG que soporta PNG que está de suerte tratando de llamar a esa imagen porque, evidentemente, el GDI + objeto gráfico no soporta imágenes indexadas indexado.

Si no necesita usar PNG indexados, podría atrapar ese error y convertir su entrada a RGB PNG normales utilizando una utilidad de terceros.

edición:

encontré este enlace http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html que le da un método para dibujar en la imagen, sin embargo, no afectará a la original, sólo una copia se puede ahorrar() si usted requiere.

En caso de que el enlace se cae:

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); 
+0

GDI + no admite la creación de un contexto de gráficos a partir de ellos que tenga el mismo efecto para el OP. De todos modos, aquí hay un enlace decente para una solución alternativa: http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html –

+0

Esa publicación de blog lo hizo. Gracias. – KdgDev

12

no se puede crear un gráfico de un formato de imagen indexada (PNG, GIF, ...). Debe usar un mapa de bits (archivo o convierta su imagen en un mapa de bits).

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

De hecho, el enlace está muerto allí. – KdgDev

+0

Quizás no tenga la declaración "using" necesaria, pero Visual Studio no reconoce esa función. – KdgDev

+0

¿Qué función? – Guillaume

Cuestiones relacionadas