Benutzer mit den meisten Antworten
DataGridView/Bild Transparenz Farbe ändern

Frage
-
Hi, ich lade mit meiner c# Form derzeit ein paar Bilder mit Transparenz in ein DataGridView. Das Problem dabei ist allerdings, dass die transparenten Teile der Bilder im DataGridView als weiß erscheinen.
Ich möchte aber, dass die transparenten Teile als schwarz dargestellt werden (da die Bilder für schwarzen Hintergrund gemacht wurden), welche Einstellung ist dafür zuständig?
Ich habe das hier nach einer kurzen Suche gefunden: http://dotnet-snippets.de/dns/hintergrundfarbe-transparenter-bilder-zb-png-aendern-SID836.aspx , allerdings kann ich nirgends die Funktion ChangeBackColor finden, deshalb nehme ich an, dass ich die dortige Definition erst inkludieren muss?
Oder kann man das auch irgendwie anders umstellen? zb bei DataGridView oder beim Image selbst nachdem man es geladen hat?
Antworten
-
Hallo Z.,
> ich bin mir immer noch nicht sicher was der Code bringen soll
Ich hatte (fälschlicherweise?) vermutet, dass Dein Bild nicht wirklich transparent ist. In einem solchen Fall, würde mein Code tatsächlich Pixel 1,1 auswerten, um die Hintergrundfarbe zu ermitteln (bei uniformen Hintergründen ist das in Ordnung). Diese Hintergrundfarbe würde dann durch den weiteren Code transparent gemacht werden.
> Ist DataGridView.BackColor etwas anderes als DataGridView grid = new DataGridView(); grid.BackgroundColor ?
Was Du wahrscheinlich suchst, ist DataGridView.DefaultCellStyle.BackColor, welche standardmäßig auf weiß eingestellt ist. Das könnte u.U. erklären, warum der Hintergrund trotz (oder gerade) wegen der Transparenz weiß ist und eben nicht die von Dir eingestellte Hintergrundfarbe für das DataGridView-Steuerelement aufweist.
Über Code:
dataGridView1.DefaultCellStyle.BackColor = SystemColors.AppWorkspace; // oder Color.DarkGray, oder dataGridView1.BackgroundColor
DataGridViewCellStyle-Klasse:
http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcellstyle.aspxBitmap.MakeTransparent-Methode (Color):
http://msdn.microsoft.com/de-de/library/8517ckds.aspxGruß
Marcel
- Als Antwort markiert Zapeth Freitag, 12. August 2011 13:59
Alle Antworten
-
Hi,
ich verstehe dein Problem ehrlich gesagt nicht. Die Methode "ChangeBackColor" ist keine native .net Methode. Du musst doch einfach den Codesnippet von der Webseite kopieren und in dein Projekt einfügen. (Code von der verlinkten Seite):
using System.Drawing; /// <summary> /// Ändert die Hintergrundfarbe eines Bildes (Ideal bei Transparente PNG's) /// </summary> /// <param name="Source">Originalbild als Image</param> /// <param name="Back">Hintergrundfarbe</param> /// <returns></returns> public static Image ChangeBackColor(Image Source, Color Back) { Bitmap objBitmap = new Bitmap(Source.Width, Source.Height); using (Graphics objGfx = System.Drawing.Graphics.FromImage(objBitmap)) { objGfx.FillRectangle(new SolidBrush(Back), 0, 0, Source.Width, Source.Height); objGfx.DrawImage(Source, 0, 0); } return objBitmap; }
Viele Grüße
Holger M. Rößler
Kaum macht man es richtig, schon funktioniert es -
Danke das dachte ich mir schon, aber wo gebe ich den Code am besten hin? In Form1.cs? Und ändert dieser code wirklich nur die transparente Farbe des angegebenen Bildes in eine andere?
Außerdem habe ich in meinem Projekt die Bilder alle schon als Bitmap image = new Bitmap("..."); geladen. Bei dieser Funktion hier wird aber nochmal der Dateipfad verlangt und eine neue Bitmap geladen, oder? Oder kann ich diese Funktion gleich anstelle von Bitmap image = new Bitmap("..."); verwenden?
-
Hi,
DataGridView unterstützt Transparenz. Wenn Du z.B. DataGridView.BackColor auf schwarz einstellst und dann eine PNG-Datei mit transparentem Hintergrund einliest, wird der Hintergrund der PNG-Datei schwarz erscheinen.
Ich vermute mal, dass die weiß dargestellten Hintergrundteile deines Bildes bereits als solche im Bild selbst vorhanden sind. Wie auch immer: Du kannst selbstverständlich den Hintergrund Deines Bildes transparent machen wenn er farblich uniform ist:
string picturePath = Path.Combine(pictureDirectory, pictureFileName); Image portrait = Image.FromFile(picturePath); Bitmap portraitBmp = new Bitmap(portrait); portraitBmp.MakeTransparent(portraitBmp.GetPixel(1, 1)); Image transparentBackgroundImage = (Image)portraitBmp; portrait.Dispose();
Gruß
Marcel -
Also im DataGridView habe ich zwar schwarz nicht als Hintergrundfarbe (eher grau, also default Farbe) aber die transparenten Teile der .png Dateien werden trotzdem weiß dargestellt (sie werden auch im Windows Explorer weiß dargestellt, aber in jedem Bildbearbeitungsprogramm sind diese als transparent zu erkennen)
Und ich verstehe nicht ganz was du mit dem Code andeuten willst. Wieso sollte ich mein bereits transparentes Bild nochmal transparent machen?
edit: ich habe es jetzt mal mit dem Code der von mir geposteten Website probiert und er zeichnet tatsächlich die vorher als weiß dargestellten Teile schwarz. Allerdings ist das Bild nun etwas größer als vorher (dh es pass nun nicht mehr ganz in die Zelle). Ich kann aber nicht erkennen woran es liegt, die Breite und Höhe des geladenen Bildes sind immer noch dieselben.Außerdem wäre es mir lieber wenn die transparente Farbe mit der Hintergrundfarbe des DataGridView übereinstimmt, wie mache ich das also am besten?
@Marcel: ich bin mir immer noch nicht sicher was der Code bringen soll, schaut er sich vielleicht eine bestimmte Farbe des Bildes an (portraitBmp.MakeTransparent(portraitBmp.GetPixel(1, 1)); also pixel 1,1?) und zeichnet diese Farbe dann im Bild transparent? Das hilft mir aber immer noch nicht, da dies ja bereits transparent ist.
Ist DataGridView.BackColor etwas anderes als
DataGridView grid = new DataGridView();
grid.BackgroundColor ?
Das würde nämlich erklären wieso der Hintergrund nicht dieselbe Farbe wie die Transparenz hat, allerdings gibt es bei grid. keine Funktion mit Namen BackColor, wie kann ich diese also dann einstellen?
-
Hallo Z.,
> ich bin mir immer noch nicht sicher was der Code bringen soll
Ich hatte (fälschlicherweise?) vermutet, dass Dein Bild nicht wirklich transparent ist. In einem solchen Fall, würde mein Code tatsächlich Pixel 1,1 auswerten, um die Hintergrundfarbe zu ermitteln (bei uniformen Hintergründen ist das in Ordnung). Diese Hintergrundfarbe würde dann durch den weiteren Code transparent gemacht werden.
> Ist DataGridView.BackColor etwas anderes als DataGridView grid = new DataGridView(); grid.BackgroundColor ?
Was Du wahrscheinlich suchst, ist DataGridView.DefaultCellStyle.BackColor, welche standardmäßig auf weiß eingestellt ist. Das könnte u.U. erklären, warum der Hintergrund trotz (oder gerade) wegen der Transparenz weiß ist und eben nicht die von Dir eingestellte Hintergrundfarbe für das DataGridView-Steuerelement aufweist.
Über Code:
dataGridView1.DefaultCellStyle.BackColor = SystemColors.AppWorkspace; // oder Color.DarkGray, oder dataGridView1.BackgroundColor
DataGridViewCellStyle-Klasse:
http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcellstyle.aspxBitmap.MakeTransparent-Methode (Color):
http://msdn.microsoft.com/de-de/library/8517ckds.aspxGruß
Marcel
- Als Antwort markiert Zapeth Freitag, 12. August 2011 13:59