PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SWT & PNG & Transparenz


HellHorse
2004-07-13, 21:53:14
Hi

Im Moment arbeite ich mich gerade in SWT ein. Ist wie Swing, nur mühsamer. :D
Zu den mühsameren Sachen gehört das erstellen von Icons mit Transparenz.
Für GIFs habe ich es hingekriegt, aber für PNGs will es nicht.

private void createToolBar() {
ToolBar toolBar = new ToolBar(this.shell, SWT.FLAT | SWT.HORIZONTAL);

String[] pngIcons = new String[]{"icons/stock_save.png",
"icons/stock_save_as.png",
"icons/stock_export.png",
"icons/stock_revert.png"};

String[] gifIcons = new String[]{"icons/stock_save.gif",
"icons/stock_save_as.gif",
"icons/stock_export.gif",
"icons/stock_revert.gif"};

ToolItem item;
for (int i = 0; i < pngIcons.length; ++i) {
item = new ToolItem(toolBar, SWT.PUSH);
ImageData data = new ImageData(this.getClass().getClassLoader().getResourceAsStream(pngIcons[i]));
ImageData mask = data.getTransparencyMask();
Image icon = new Image(this.display, data, mask);
item.setImage(icon);
item.setToolTipText(pngIcons[i]);
}

for (int i = 0; i < gifIcons.length; ++i) {
item = new ToolItem(toolBar, SWT.PUSH);
ImageData data = new ImageData(this.getClass().getClassLoader().getResourceAsStream(gifIcons[i]));
ImageData mask = data.getTransparencyMask();
Image icon = new Image(this.display, data, mask);
item.setImage(icon);
item.setToolTipText(gifIcons[i]);
}
}

Wie das ganze aussieht:
http://web.green.ch/marschall/pics/alphaicons.gif
Links die PNGs mit schwarzem Rand statt Transparenz, rechts die GIFs mit Transparenz. Der weisse Rand muss sein, er entstand bei der Konversion von PNG zu GIF.

Ideen?

PH4Real
2004-07-14, 18:33:30
Hmm... also bei klappte das mit den transparenten PNGs.

Hatte die PNG mit IrfanView erzeugt bzw. die Transparenzfarbe festgelegt und schliesslich zum Beipspiel so auf ein ApplicationWindows gepackt:


protected Control createContents(Composite parent) {
getShell().setImage(new Image(Display.getCurrent(),"icons/14_layer_novisible.png"));
.
.
.
}

HellHorse
2004-07-14, 19:55:34
Original geschrieben von PH4Real
Hmm... also bei klappte das mit den transparenten PNGs.

Hatte die PNG mit IrfanView erzeugt bzw. die Transparenzfarbe festgelegt und schliesslich zum Beipspiel so auf ein ApplicationWindows gepackt:


protected Control createContents(Composite parent) {
getShell().setImage(new Image(Display.getCurrent(),"icons/14_layer_novisible.png"));
.
.
.
}

Will nicht.
Die Icons sind runtergeladene Gnome/GTK/Ximian-Icons.
Mal Irfanview drüberjagen.
Aber eigentlich mag ich mich nicht um so Kleinkram wie Transparenzfarbe kümmern.

HellHorse
2004-07-14, 21:20:01
Update:
Wenn ich mit IrfanView die Transparenzfarbe (schwarz) festlege, geht es zwar. Aber schwarze Breiche werden auch transparent statt schwarz zu bleiben. :(
Zudem stellt IrfanView die Transparenz gleich wie SWT schwarz dar.

Wie es jetzt aussieht
http://web.green.ch/marschall/pics/alpahicons1.png
in der Mitte neu mit festgelegter Transparenzfarbe.

Wie es aussehen sollte (Browser Link auf originale Icons):
http://primates.ximian.com/~tigert/new_stock_project/icons/stock_save.pnghttp://primates.ximian.com/~tigert/new_stock_project/icons/stock_save_as.pnghttp://primates.ximian.com/~tigert/new_stock_project/icons/stock_export.pnghttp://primates.ximian.com/~tigert/new_stock_project/icons/stock_revert.png
schwarzer Rand und leichter Schatten

Ich würde nichts sagen, wenn nicht Firefox, GIMP und Swing sie alle korrekt darstellen würden, was aber der Fall ist.

Update:
Sogar der IE stellt sie brauchbar dar.

HellHorse
2004-07-18, 13:49:37
Scheint ein bekannter Bug zu sein:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=35040
Seit über einem Jahr :(

PH4Real
2004-07-18, 21:30:19
Das was Du beschrieben hast stimmt... wollte ein paar Icons vom KDE Crystal Theme einfügen und habe genau das gleiche Problem :(.

Es ist zwar nicht der riesen Bug, aber dass er schon ein Jahr existiert, wirft nicht gerade ein gutes Licht auf das Quality Management.

PS: Wenn Du mit der JFace Library arbeitest und Du versuchen solltest benutzerdefinierte Actions einzubinden, verwende nicht die neuste 3.0 Library... die ist auch buggy und wirft beim Auslösen des Ereignisses eine richtige schöne RuntimeException aus. Mit der alten 2.1 ist das kein Problem. Der Bug ist auch bekannt und die haben wohl ein Test Tool von IBM vergessen rauszunehmen, so dass er die Klassen nicht findet:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=67050

HellHorse
2004-07-18, 22:04:35
Ich arbeite mit 3.0 final
Original geschrieben von PH4Real
https://bugs.eclipse.org/bugs/show_bug.cgi?id=67050
Hatte ich auch, einfach osgi.jar (liegt Eclipse bei) dem CLASSPATH hinzufügen und gut ist.

SWT javadoc ist ja nicht gerade der Hammer, aber JFace ist noch schlimmer :(