2009-12-07 4 views
4

J'ai un bitmap source qui est 1x1 et j'essaie de prendre cette image et de la dessiner sur une nouvelle image bitmap. Le bitmap source est tout rouge, mais pour une raison quelconque, le nouveau bitmap se termine par un dégradé (voir image). En utilisant le code ci-dessous, le nouveau bitmap ne devrait-il pas être complètement rouge? D'où vient le blanc/alpha?Les couleurs de dessin de l'image C# sont incorrectes

alt text http://www.binaryfortress.com/Temp/Error.jpg

private void DrawImage() 
{ 
    Bitmap bmpSOURCE = new Bitmap(1, 1, PixelFormat.Format32bppArgb); 
    using (Graphics g = Graphics.FromImage(bmpSOURCE)) 
    { 
     g.Clear(Color.Red); 
    } 

    Bitmap bmpTest = new Bitmap(300, 100, PixelFormat.Format32bppArgb); 
    using (Graphics g = Graphics.FromImage(bmpTest)) 
    { 
     g.CompositingMode = CompositingMode.SourceCopy; 
     g.CompositingQuality = CompositingQuality.AssumeLinear; 
     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     g.PageUnit = GraphicsUnit.Pixel; 
     g.PixelOffsetMode = PixelOffsetMode.None; 
     g.SmoothingMode = SmoothingMode.None; 

     Rectangle rectDest = new Rectangle(0, 0, bmpTest.Width, bmpTest.Height); 
     Rectangle rectSource = new Rectangle(0, 0, 1, 1); 
     g.DrawImage(bmpSOURCE, rectDest, rectSource, GraphicsUnit.Pixel); 
    } 

    pictureBox1.Image = bmpTest; 
} 
+2

Avez-vous essayé de changer le InterpolationMode? –

Répondre

7

Ce n'est pas une bonne façon de remplir une zone avec une couleur. Une meilleure approche serait de déterminer la couleur du pixel dans l'image source et utiliser cette couleur pour remplir la cible.

Bitmap source = // get the source 

Color color = source.GetPixel(1, 1); 

Bitmap target = // get the target  

target.Clear(color); 

Néanmoins, le problème est probablement le InterpolationMode, car cela est ce qui est utilisé lors du redimensionnement des images. Essayez d'utiliser Low au lieu de HighQualityBicubic.

g.InterpolationMode = InterpolationMode.Low; 
+0

Je n'utilise pas ceci pour remplir une zone avec une couleur, c'est juste un petit programme pour montrer le problème. J'ai essayé différents paramètres InterpolationMode, et le seul qui fonctionne est NearestNeighbor. Cela résout le problème, mais je suis toujours confus quant à savoir pourquoi l'image de destination n'est pas tout rouge? Pourquoi aurait-il mélangé au hasard le rouge avec le blanc? –

+3

@Jon: 'InterpolationMode' détermine le comportement lors de la mise à l'échelle des images, ce que vous faites ici. GDI n'impose pas (par défaut) les images simplement en copiant ou en supprimant des pixels sur des intervalles fixes, car cela donne généralement des résultats de faible qualité. Au lieu de cela, il interpole les nouveaux pixels en utilisant divers algorithmes, le spécifique étant déterminé par la valeur de 'InterpolationMode'. Voir http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.interpolationmode.aspx pour plus d'informations. –

+0

Excellent, merci! –

0

J'ai trouvé cette solution pour votre problème:

g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
g.CompositingQuality = CompositingQuality.HighQuality; 
g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
Questions connexes