2011-09-09 4 views
2

Comment créer un fichier PNG si j'ai deux fichiers JPG séparés avec l'image et le canal alpha?Créer un fichier PNG avec JPG et AlphaChannel en C#

JPG Image + JPG Mask -> PNG avec transparence

J'ai essayé des solutions WPF:

image.OpacityMask = new ImageBrush (new BitmapImage (uriMask)); 

et System.Drawing.

Image bmpMask = Image.FromFile (maskFilePath); 
gfxNewImage.SetClip ( Graphics.FromImage (bmpMask)); 

mais j'ont des problèmes avec les deux (fond noir, ou noir complet)

Toute idée ou un exemple?

ThankYou

+0

Si ce n'est pas clair, l'image Masque.jpg est une image avec des valeurs de blanc à noir. –

Répondre

2

Ok Supposons que vous avez un Picute JPEG et Png image avec canal alpha. Vous devriez le faire que, et cela ne fonctionnera que si ces 2 images sont de la même taille.

Bitmap jpegFile = new Bitmap("JpegFile.jpg"); 
Bitmap alphaFile = new Bitmap("Png.jpg"); 

for(int i=0;i<jpegFile.Width;i++) 
{ 
    for(int j=0;j<jpegFile.Height;j++) 
    { 
     Color withAlpha = jpegFile.GetPixel(i,j); 
      withAlpha.A = alphaFile.GetPixel(i,j).A; 
     jpegFile.SetPixel(withAlpha); 
    } 
} 
+0

Ok, je vais essayer. Dans mon cas j'ai 2 JPG mais je vais choisir la valeur grise comme Alpha. Je vous remercie. –

+0

@Mario Morales cet algorithme fonctionne, mais vous devez faire attention quand vous l'implémentez, car si vous gérez avec beaucoup de grandes images, vous devriez trouver un moyen de le faire en Multithread ou si possible de l'optimiser. – Burimi

+0

Cela fonctionne avec quelques changements: Vous avez besoin d'une image de destination 32bpp 'Bitmap outImage = nouveau Bitmap (jpegFile.Width, jpegFile.Height, PixelFormat.Format32bppArgb);' et créer une couleur parce que 'Color.A' n'est pas inscriptible' Color avecAlpha = Color.FromArgb (alphaFichier.GetPixel (i, j) .R, jpegFichier.GetPixel (i, j)); ' –

1

essayer ces paramètres pour objet Grafics:

using (var g = Graphics.FromImage(bmpMask)) 
{ 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    g.DrawImage(source, 0, 0, width, height); 
} 
+0

Il ne fonctionne pas 'SmoothingMode' ou' InterpolationMode' ne semble pas lié à la transparence. –