2010-04-16 3 views
1

Je travaille avec GDI +, l'image avec laquelle je travaille est une image 1bbp. Ce que je voudrais faire est de dessiner un rectangle sur l'image et tout sous ce rectangle sera inversé (les pixels blancs deviendront noirs et les pixels noirs deviendront blancs).Inverser la couleur 1bbp sous un rectangle

Tout l'exemple de code que j'ai vu est pour les images à l'échelle de couleurs RVB 8 bits, et je ne pense pas que les techniques qu'ils utilisent fonctionneront pour moi.

Voici le code que j'ai jusqu'à présent. C'est le contrôle parent, l'un des Epl2.IDrawableCommand sera la commande qui fait l'inversion.

public class DisplayBox : UserControl 
{ 
    (...) 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     (...) 
      using (Bitmap drawnLabel = new Bitmap((int)((float)Label.LabelHeight * _ImageScaleFactor), (int)((float)Label.LableLength *(int) _ImageScaleFactor), System.Drawing.Imaging.PixelFormat.Format1bppIndexed)) 
      { 
       using (Graphics drawBuffer = Graphics.FromImage(drawnLabel)) 
       { 
        (...) 
        foreach (Epl2.IDrawableCommand cmd in Label.Collection) 
        { 
         cmd.Paint(drawBuffer); 
        } 
        (...) 
       } 
      } 
     } 
    } 
} 
public class InvertArea : IDrawableCommand 
{ 
    (...) 
    public Rectangle InvertRectangle {get; set;} 
    public void Paint(Graphics g) 
    { 
     throw new NotImplementedExecption(); 
    } 
} 

Que dois-je mettre dans le Paint(Graphic g) pour cette commande?

+0

Avec GDI, vous pouvez utiliser la fonction SetROP2 avec R2_NOT ou R2_XORPEN pour inverser les valeurs de pixel. Je ne pense pas que GDI + ait un concept similaire. –

+0

Ce code ne s'exécute pas: "Un objet Graphics ne peut pas être créé à partir d'une image qui a un format de pixel indexé." (sur la ligne FromImage) – MusiGenesis

Répondre

5

L'astuce consiste à dessiner à nouveau la même image et à utiliser une matrice de couleurs inverts the image. Par exemple:

protected override void OnPaint(PaintEventArgs e) { 
     e.Graphics.DrawImage(mImage, Point.Empty); 
     ImageAttributes ia = new ImageAttributes(); 
     ColorMatrix cm = new ColorMatrix(); 
     cm.Matrix00 = cm.Matrix11 = cm.Matrix22 = -0.99f; 
     cm.Matrix40 = cm.Matrix41 = cm.Matrix42 = 0.99f; 
     ia.SetColorMatrix(cm); 
     var dest = new Rectangle(50, 50, 100, 100); 
     e.Graphics.DrawImage(mImage, dest, dest.Left, dest.Top, 
      dest.Width, dest.Height, GraphicsUnit.Pixel, ia); 
    } 

Où mImage était mon échantillon image 1bpp et j'inverser un rectangle 100x100 à 50,50

Questions connexes