createImage() z przezroczystym tlem??

0

Witam

Pisze swoj modul do obslugi czcionek, gdzie czcionka jest rysowana na dynamicznie utworzonym obrazku za pomoca:
img = Image.createImage(x, y);

Kiedy tak przygotuje sobie Image jego tlo jest automatycznie biale - a mi zalezy na tym aby bylo przezroczyste.. Da sie to jakos zrobic czy jednyna metoda jest trzymanie gdzies na boku obrazka przez.png, ktory byl by caly przezroczysty ??

Pozdrawiam :)

0

Po prostu stwórz obrazek, w formacie z kanałem alfa (np. ARGB) i składnik ten ma być w każdym pikselu równy 1 (albo zero jeżeli pokręciłem). Ładowanie obrazka PNG robi dokładnie to samo. Tworzy obiekt BufferedImage z kanałem alfa, w którym większość lub wszystkie piksele są całkowicie przezroczyste.

0
Olamagato napisał(a)

Po prostu stwórz obrazek, w formacie z kanałem alfa (np. ARGB) i składnik ten ma być w każdym pikselu równy 1 (albo zero jeżeli pokręciłem). Ładowanie obrazka PNG robi dokładnie to samo. Tworzy obiekt BufferedImage z kanałem alfa, w którym większość lub wszystkie piksele są całkowicie przezroczyste.

Ja wczytam obraz za pomoca Image.createImage("/obraz.png") - to jest on typu immutable - i nie moge wtedy powiazac go z kontekstem graficznym Graphics.

Kiedy w NetBeans wpisze BufferedImage - to IDE mi tego nie rozpoznaje :/ Projekt jest na MidP1 (nie wiem czy to tego wina.)

A jak przy pomoce Image.createImage(x, y) - wymusic by np biale piksele byly przezroczyste ??

0

To, że jest to projekt na komórkę być może dużo zmienia...
Cześć klas może nie istnieć lub być zmodyfikowana.
Musisz jednak pamiętać, że referencja do Image, to referencja do klasy abstrakcyjnej. Pod nią zawsze kryje się jakiś konkretny obiekt konkretnej klasy.
Trzeba po prostu stworzyć pusty nowy obrazek z przezroczystością i nadać wszystkim pikselom tę właściwość. Metoda renderująca powinna renderować czcionkę bez atrybutu przezroczystości. W ten sposób otrzymasz tekst w konkretnym kolorze na przezroczystym tle.
Poza tym w projektach na komórki jeszcze nie grzebałem, ale jeżeli odpowiada im większość standardowego JDK, to Image jakby nie ma, ani nie dziedziczy metody createImage().

Poza tym jeżeli chciałbyś z nieprzezroczystego obrazka stworzyć przezroczysty przez wycięcie kawałka z tego pierwszego, to chyba jedyną skuteczną metodą jest stworzenie obrazka z atrybutem przezroczystości i odrysowanie na nim kawałka obrazka nieprzezroczystego (zwykle przez drawImage()). Nawet jeżeli jest jakaś gotowa metoda konwertująca, to najprawdopodobniej właśnie tak będzie ona działać.

0
Olamagato napisał(a)

To, że jest to projekt na komórkę być może dużo zmienia...
Cześć klas może nie istnieć lub być zmodyfikowana.
Musisz jednak pamiętać, że referencja do Image, to referencja do klasy abstrakcyjnej. Pod nią zawsze kryje się jakiś konkretny obiekt konkretnej klasy.
Trzeba po prostu stworzyć pusty nowy obrazek z przezroczystością i nadać wszystkim pikselom tę właściwość. Metoda renderująca powinna renderować czcionkę bez atrybutu przezroczystości. W ten sposób otrzymasz tekst w konkretnym kolorze na przezroczystym tle.
Poza tym w projektach na komórki jeszcze nie grzebałem, ale jeżeli odpowiada im większość standardowego JDK, to Image jakby nie ma, ani nie dziedziczy metody createImage().

Poza tym jeżeli chciałbyś z nieprzezroczystego obrazka stworzyć przezroczysty przez wycięcie kawałka z tego pierwszego, to chyba jedyną skuteczną metodą jest stworzenie obrazka z atrybutem przezroczystości i odrysowanie na nim kawałka obrazka nieprzezroczystego (zwykle przez drawImage()). Nawet jeżeli jest jakaś gotowa metoda konwertująca, to najprawdopodobniej właśnie tak będzie ona działać.

Tak duzo to zmienia bo J2ME dla MidP1 to nie ani J2SE ani nie Java 2 ;)...
Z widza jaka posiadam na ten moment wiem, ze wprost nie mozna stworzyc przezroczystego obrazka i po nim malowac (jest to mozliwe w MidP2 tam za pomoca metody img.getRGB i potem Image.createRGBImage) no ale... ehh

0

No nie można, ale to chyba nie jest duży problem, skoro 99% telefonów na rynku obsługuje MIDP 2? Nawet moja stara 3- letnia Nokia za 20 zł (w abonamencie) miała MIDP-2.

0

Więc jeśli użycie MIDP 2.0 nie jest dla Ciebie problemem, to dorzucam metodę:

public Image getTransparent(int width, int height) {
  int[] alpha = new int[width*height];
  for (int i=0; i < alpha.length; i++)  alpha[i]=16711680;
  return Image.createRGBImage(alpha, width, height, true);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1