2010-01-13 6 views
1

Ce qui se passe, c'est que je dois dessiner un rectangle noir sur l'image. Je dois charger un tif puis montrer une blackbox dessus. J'ai été aidé avec du code, mais j'ai continuellement l'erreur: Un objet Graphics ne peut pas être créé à partir d'une image qui a un format de pixel indexé.C# rédaction dessin sur Image

J'ai donc dû le lire en format binaire, mais quand j'affiche la boîte, il redimensionne la boîte wierd. Et affiche complètement la boîte d'image dans tout le noir rien de l'image originale. Si quelqu'un pouvait m'aider là où je me trompe, ce serait génial.

Bitmap original = (Bitmap)System.Drawing.Image.FromFile(coveted, true); 
           Bitmap newImage = new Bitmap(original.Width, original.Height); 
           pictureBox1.Image = newImage; 
           using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
           { 
            using (SolidBrush brush = new SolidBrush(Color.Black)) 
            { 
             g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value)); 
            } 
           } 

Je ne sais pas comment je peux le rendre plus clair. Ce qui se passe est que j'ai un tif dans un format non pris en charge. Donc je dois le changer en Bitmap pour pouvoir dessiner un rectangle. Ensuite, j'ai besoin d'afficher cette image rédigée (l'original avec la rédaction) dans une image. Ce qui se passe avec le code ci-dessus, c'est une fois qu'il est terminé, tout ce qu'il affiche est une boîte noire sans image originale.

Je crois que j'ai couru quelque chose à propos de l'utilisation d'un bitmap à partir du flux, puis la fermeture du flux. Quelqu'un connaît-il cela?

Merci à toute l'aide des membres de la STO !! Voici le code correct pour la suppression des images si vous rencontrez l'erreur "Un objet graphique ne peut pas être créé à partir d'une image qui a un format de pixel indexé.". si on vous donne les points de départ expurgés (évidemment, vous devez faire le travail Regex à votre situation):

//Regex for pulling points from a file 
string x1 = x1 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)").Groups[2].Value; 
         string y1 = y1 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[3].Value; 
         string x2 = x2 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[4].Value; 
         string y2 = y2 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[5].Value; 
         string x3 = x3 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[6].Value; 
         string y3 = y3 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[7].Value; 
         { 
//convert string to int for redacted points 
          int x1value = Convert.ToInt32(x1); 
          int y1value = Convert.ToInt32(y1); 
          int x3value = Convert.ToInt32(x3); 
          int y3value = Convert.ToInt32(y3); 
          { 
//BEGIN Workaround for indexed pixels 
           Bitmap original = (Bitmap)System.Drawing.Image.FromFile(YOURFILE, true); 
           Bitmap newImage = new Bitmap(original); 
           pictureBox1.Image = newImage; //END Workaround for indexed pixels 
           using (Graphics g = Graphics.FromImage(pictureBox1.Image)) //start redaction 
           { 
            using (SolidBrush brush = new SolidBrush(Color.Black)) 
            { 
             g.DrawImageUnscaled(newImage, 0,0); 
             g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value)); 
            } 
           } //End Redaction 
           pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //Resized to fit into a static picturebox 
          } 
         } 
+0

« comment je peux rendre cela plus clair » -> Commençons par un-indenting le code source un peu. –

Répondre

2

Au lieu de

Bitmap newImage = new Bitmap(original.Width, original.Height); 

vous voulez

Bitmap newImage = new Bitmap(original); 

Cela rendra votre newImage commencer par le contenu d'origine. La différence sera que vous allez vous retrouver avec newImage.PixelFormat == PixelFormat.Format32bppArgb, alors que je suppose que original.PixelFormat == PixelFormat.Format1bppIndexed. Avec PixelFormat.Format32bppArgb, vous pouvez créer un objet Graphics; vous ne pouvez pas avec PixelFormat.Format1bppIndexed.

+0

A travaillé parfaitement! J'ai fait des modifications pour tous ceux qui rencontrent ce problème. –

0

Vous n'êtes pas de dessiner l'image originale sur le newImage.

Pour ce faire:

g.DrawImageUnscaled(original, 0, 0); 

Aussi, je le ferais comme suit, je pense que cela fonctionne mieux dessin dans la mémoire vive, puis le montrer à l'écran. Peut-être que je me trompe cependant.

using (Graphics g = Graphics.FromImage(newImage)) 
    { 
     g.DrawImageUnscaled(original, 0, 0); 

     using (SolidBrush brush = new SolidBrush(Color.Black)) 
     { 
       g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value)); 
      } 
    } 
pictureBox1.Image = newImage; 

Je n'ai pas testé le code ci-dessus .. bonne chance cependant.

1

Cela devrait fonctionner pour vous:

original = (Bitmap)System.Drawing.Image.FromFile(coveted, true); 
using (Graphics g = Graphics.FromImage(original)) 
{ 
    using (SolidBrush brush = new SolidBrush(Color.Black)) 
    { 
    g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value)); 
    } 
} 
pictureBox1.Image = original;