2009-06-19 3 views
1

Existe-t-il un moyen de manipuler l'alpha d'une image en utilisant alpha d'une autre image? Supposons que j'ai une image et que je veuille modifier son alpha départ opaque à gauche et totalement transparent à droite, actuellement je dessine une autre image avec LinearGradientBrush et initialise alpha de l'image originale de la deuxième image en boucle pixel par pixel, y at-il d'une autre manière dans Gdiplus, un masque d'image, ou un mélange d'alpha de deux images? Conclusion: il semble qu'il n'y ait aucun moyen dans GDI + de fusionner deux images, seul moyen semble être le chemin manuel en itérant à travers les pixels.Gdiplus masque l'image d'une autre image

Répondre

2

Je pense que vous avez raison en ce que vous devez faire ce pixel par pixel. J'ai également cherché un moyen plus «pur» de le faire, mais c'est ce que j'ai fini avec:

public enum ChannelARGB 
    { 
     Blue = 0, 
     Green = 1, 
     Red = 2, 
     Alpha = 3 
    } 

    public static void transferOneARGBChannelFromOneBitmapToAnother(
     Bitmap source, 
     Bitmap dest, 
     ChannelARGB sourceChannel, 
     ChannelARGB destChannel) 
    { 
     if (source.Size!=dest.Size) 
      throw new ArgumentException(); 
     Rectangle r = new Rectangle(Point.Empty, source.Size); 
     BitmapData bdSrc = source.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
     BitmapData bdDst = dest.LockBits(r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 
     unsafe 
     { 
      byte* bpSrc = (byte*)bdSrc.Scan0.ToPointer(); 
      byte* bpDst = (byte*)bdDst.Scan0.ToPointer(); 
      bpSrc += (int)sourceChannel; 
      bpDst += (int)destChannel; 
      for (int i = r.Height * r.Width; i > 0; i--) 
      { 
       *bpDst = *bpSrc; 
       bpSrc += 4; 
       bpDst += 4; 
      } 
     } 
     source.UnlockBits(bdSrc); 
     dest.UnlockBits(bdDst); 
    } 
+0

c'est ce que je fais déjà :( –

Questions connexes