2010-09-04 3 views
0

Je tente de créer un masque d'écrêtage sur un PNG avec un canal alpha en copiant les valeurs alpha de mon PNG sur une autre image de même taille. Tout en utilisant LockBits puis UnlockBits. Il semble que ma chaîne soit correctement définie mais je ne la vois pas utilisée dans les opérations de dessin suivantes. Dans une tentative de simplifier les choses autant que possible, j'ai utilisé pratiquement la même logique pour définir uniquement la valeur du canal rouge dans une seule image, mais après avoir enregistré l'image, encore une fois, pas de changement. Si je parcours le code, le canal rouge valide est correctement défini. Voici ce code simplifié. Tout commentaire ou aide est apprécié.GDI + LockBits/Alpha

 var image = Image.FromFile(@"C:\imaging\image.jpg"); 
     image.LoadRed(); 
     image.Save(@"C:\imaging\output.jpg"); 

    // image.jpg and output.jpg are the same. 
    // I would expect output to be washed over with lots of red but it isn't 

    public static void LoadRed(this Image destination) 
    { 
     var destinationBitmap = new Bitmap(destination); 

     const int blueChannel = 0; 
     const int greenChannel = 1; 
     const int redChannel = 2; 
     const int alphaChannel = 3; 

     var rec = new Rectangle(Point.Empty, destination.Size); 

     var destinationData = destinationBitmap.LockBits(rec, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

     unsafe 
     { 
      byte* destinationPointer = (byte*)destinationData.Scan0.ToPointer(); 

      destinationPointer += redChannel; 

      for (int i = rec.Width * rec.Height; i > 0; i--) 
      { 
       *destinationPointer = 255; 
       destinationPointer += 4; 
      } 
     } 

     destinationBitmap.UnlockBits(destinationData); 
    } 

Répondre

2

Votre problème est lié au fait que vous créez une nouvelle instance Bitmap en utilisant l'image donnée à votre méthode d'extension en tant que paramètre. Une fois la méthode terminée, vous sauvegardez l'image originale, pas l'image modifiée.

Modifiez votre méthode d'extension pour qu'elle fonctionne sur les types de System.Drawing.Bitmap.

+1

Ah oui. Je l'ai juste compris! Je me suis cassé la tête sur celui-ci et off pour quelques jours. J'étais sur le point de supprimer la question mais vous gagnez! +1! – andleer

+0

Heureux d'entendre que ça marche enfin;) –