stdole.StdPicture sauber abspeichern

14/01/2008 - 17:04 von Thomas Mueller | Report spam
Hallo @all,

ich versuche gerade für eine Übersicht von Images, die in Visual Studio (
2005/2008 ) für CommandControls verwendet werden können eine Übersicht zu
erstellen. Für diese Übersicht initialisiere ich mit ein Picture vom Typ
"stdole.StdPicture" und versuche es dann mit transparenten hintergrund
abzuspeichern. Mein Code dazu sieht so aus (ist nur ein Ausschnitt):

...
CommandBarButton commandBarButton = tempCommand.AddControl(commandBar, 1) as
CommandBarButton;

stdole.StdPicture picture = commandBarButton.Picture;

using (Image image = Support.IPictureDispToImage(picture))
{
using (Bitmap myBitmap = new Bitmap(image,16,16))
{
myBitmap.MakeTransparent();

myBitmap.Save(@"C:\imageII.png", ImageFormat.Png);
}
}
Leider ist das Ergebins alles andere als befriedigend. Wie man an dem
folgenden Bild sehen kann, ist das Smiley ziemlich ausgefranzt dargestellt.

http://farm3.static.flickr.com/2154...a759_o.png

Der Hintergrund wird nur teilweise transparent gezeichnet. Bei manchen
Images werden aber durch die Transparenz schwarze Schrift-Teile im Image
transparent gezeichnet. Was zur Folge hat, das man die Schrift nicht mehr als
Schrift sondern nur noch als Klumpen erkennt.
Nun muss ich noch dazu erwàhnen, das es in dem Object commandBarButton noch
eine eigenschaft mit dem Namen Mask gibt. Diese Maske ist praktisch der
Deckel für das Image, der Visual Studio anzeigt, in welchem Bereich das Image
transparent, und in welchem es nicht Transparent gezeichnet werden soll. Das
geschieht mit der Farbe Schwarz.
Visual Studio zeichnet mit beiden werten das Image in einer sehr sehr guten
Qualitàt. Siehe dieses Bild:

http://farm3.static.flickr.com/2308...e271_o.png

Nur noch mal zur Verdeutlichung der Ausgangssituation. Ich zeichne oder
erstelle das Image das in Visual Studio verwendet wird nicht selbst. Visual
Studio holt sich dieses Image aus einer eigenen DLL. Ich gebe nur über einen
Index an, welches Image verwendet werden soll. Somit kann ich die das Image
nicht beeinflussen. Für mich ist es wichtig das ich das Image in der
richtigen Art mit .NET abspeicher, damit es nicht so ausgefranzt ausschaut.
beim Speichern denke ich, mache ich einfach noch Fehler?!

Kann mir da jemand auf die Sprünge helfen?

Besten Dank
Thomas Mueller
 

Lesen sie die antworten

#1 Frank Dzaebel
14/01/2008 - 21:06 | Warnen spam
Hallo Thomas,

[...]
using (Bitmap myBitmap = new Bitmap(image,16,16))
{ myBitmap.MakeTransparent();
[...]
Leider ist das Ergebins alles andere als befriedigend.



Das liegt wohl hauptsàchlich an dem MakeTransparent().
Die Methode nimmt als transparente Farbe einfach die
des untersten linken Pixels des Bildes:
Dadurch sind quasi alle Farbpunkte dieser Farbe
danach transparent (das ist natürlich alles andere als
sauber und dient eigentlich nur heuristischen Zwecken).
Bei einem guten Icon müsstest Du ein Antialiasing auf
die Hintergrundfarbe einbauen oder einen sauberen
Alphakanal haben.
Ggf. mal checken, ob Du Dir diesen Alpha-Kanal
des PNG/BMP nicht zerhauen hast.
evtl. -> myBitmap.PixelFormat = PixelFormat.Alpha oder
Canonical, etc. testen.

Was ist genau Dein Ziel (vielleicht in einem Satz) ?


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen