Toon posts:

[JAVA] Transparante tekenen in een image.

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hi,

Loop al een tijdje te pruten met het volgende probleem en kom er niet uit.

Je maakt een image en begint daar vrolijk op de graphics te tekenen maar sommige stukken moeten doorzichtig zijn zodat je datgene waar je het plaatje overheen zet nog kunt zien.

Beetje crappy uitleg. Zal het proberen te verduidelijken met code..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.awt.*;
import java.applet.*;

public class test extends Applet
{
    public void paint(Graphics g)
    {
        g.setColor(Color.blue);
        g.fillRect(50, 50, 100, 100);
        Image img = createImage(100, 100);
        Graphics imgG = img.getGraphics();
        imgG.setColor(Color.red);
        imgG.fillRect(0, 0, 100, 100);
        imgG.setColor(new Color(0, 0, 0, 0));
        imgG.fillOval(10, 10, 80, 80);
        g.drawImage(img, 70, 70, null);
    }
}

Het is dus de bedoeling dat je op de plek waar de oval getekend wordt je het blauwe vierkant kunt zien. Dit is even een vlug in elkaar gebrouwen voorbeeld situatie het moet toegepast gaan worden in de vier op een rij game op deze site.

Hoop dat iemand me iets wijzer kan maken.

Alvast bedankt,

Sambal

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Als je het echt dynamisch aan moet maken: gebruik een RGBImageFilter.

Werkt als volgt. Je tekent een blauwvierkant met een witte stip, (die stip moet doorzichtig zijn), vervolgens ga je in je RGB filter de RGB waarden FF FF FF FF veranderen in 00 FF FF FF.

Wat je dan doet? Je knikkert de alpha waarde van dat witte gedeelte dan helemaal doorzichtig.

Meer is het niet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    class AlphaFlip extends RGBImageFilter {
        public RedBlueSwapFilter() {
        // The filter's operation does not depend on the
        // pixel's location, so IndexColorModels can be
        // filtered directly.
        canFilterIndexColorModel = true;
        }

        public int filterRGB(int x, int y, int rgb) {
        if((RGB & 00FFFFFF) == 00FFFFFF)
        {
            return rgb & 0x00FFFFFF;
        }
        else
        {
            return rgb;
        }
        }
    }

    Image BlauwVierkantImg;

    // vierkant blauw maken en een wit gebied er op tekenen.

    AlphaFlip filter = new AlphaFlip();
    BlauwvierkantImg = createImage(new FilteredImageSource(BlauwvierkantImg.getSource(), filter));

    //even netjes wachten zodat ie dit allemaal gedaan heeft voor je verder gaat.
    tracker.addImage(shadowImg, 1);
    try {tracker.waitForID(1);}catch (InterruptedException e){return;}

Vergeet nu alleen niet dat je de nu verkregen Image (BlauwvierkantImg) over datgene wat erdoor zichtbaar moet zijn heen moet tekenen.

Oh ja, dit hele verhaal is IE compatible ZONDER Sun's Java plug-in. En die class is dus een inline class, en de verdere statements staa bijvooebeeld in je paint()

Verwijderd

Topicstarter
tnx ga er meteen even mee aan het hobbyen.

Verwijderd

Topicstarter
:)WHOEHOE:)

Het werkt uitstekend.
Precies wat ik nodig had.

Bedankt,

Sambal

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Graag gedaan. ;)

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Oh ja, die tracker is natuurlijk een MediaTracker :)

Ik vind het ding zelf onnodig als ik er over nadenk, maar als ik het niet doe, dan tekent IE de Image af en toe niet in een implementatie die ik hier heb in een Applet. Vaag in ieder geval. Ik verwacht namelijk dat de call naar dat filter pas terugkeert op het moment dat alle pixels gefilterd zijn.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Euhm ik wil niet zeiken, maar ik zou paars (0x00ff00ff dan) transparant maken ipv wit, omdat paars minder gebruikt wordt. :9

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

Topicstarter
Dat van die tracker was wel duidelijk :) Source was zowiezo niet helemaal correct maar het ging om het idee en dat was duidelijk.

Maakt natuurlijk niet zoveel uit welke kleur je neemt als het maar een kleur is die je verder in je plaatje niet gebruikt.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op maandag 29 oktober 2001 10:46 schreef SambalW het volgende:
Dat van die tracker was wel duidelijk :) Source was zowiezo niet helemaal correct maar het ging om het idee en dat was duidelijk.

Maakt natuurlijk niet zoveel uit welke kleur je neemt als het maar een kleur is die je verder in je plaatje niet gebruikt.
Wat was er mis mee dan?
Die class had ik uit een eigen projectje gesloopt en die mix functie had ik snel even bedacht zonder te testen.



Enne, ja inderdaad paars zou eventueel beter zijn, maar ja, 't idee is duielijk.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Op maandag 29 oktober 2001 10:46 schreef SambalW het volgende:
Maakt natuurlijk niet zoveel uit welke kleur je neemt als het maar een kleur is die je verder in je plaatje niet gebruikt.
Nee, maar paars (of roze, of hoe je het verder ook wilt noemen) wordt over het algemeen (homo-gevalletjes uitgezonderd) veel minder gebruikt dan andere kleuren.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

Topicstarter
Toegegeven kleuren die je niet veel tegenkomt zijn de betere keuze.

En wat betreft de code die niet werkte dat ging om
code:
1
2
class AlphaFlip extends RGBImageFilter {
        public RedBlueSwapFilter() {

waar ik dacht dat het dan
code:
1
2
class AlphaFlip extends RGBImageFilter {
        public AlphaFlip() {

moest wezen.
Maar goed het gaat er om dat het nu allemaal naar behoren werkt :)

Verwijderd

En als je het plaatje transparant wil maken
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.awt.image.RGBImageFilter;
import java.awt.image.DirectColorModel;

public class AlphaFilter extends RGBImageFilter
{
    private int alpha = 0;
    public AlphaFilter(int alpha)
    {
        canFilterIndexColorModel = true;
        this.alpha = alpha;
    }

    public int filterRGB(int x, int y, int rgb)
    {
        if((rgb & 0x00FF00FF) == 0x00FF00FF)
        {
            return 0;
        }

        else

        {
            int rgba = alpha << 24;
            return rgba + rgb;
        }
    }
}

Om het plaatje te filteren gebruik je
code:
1
2
3
AlphaFilter af = new AlphaFilter(128);
newImage = createImage(new FilteredImageSource(newImage.getSource(), af));
prepareImage(newImage,this);

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op maandag 29 oktober 2001 14:55 schreef SambalW het volgende:
Toegegeven kleuren die je niet veel tegenkomt zijn de betere keuze.

En wat betreft de code die niet werkte dat ging om
code:
1
2
class AlphaFlip extends RGBImageFilter {
        public RedBlueSwapFilter() {

waar ik dacht dat het dan
code:
1
2
class AlphaFlip extends RGBImageFilter {
        public AlphaFlip() {

moest wezen.
Maar goed het gaat er om dat het nu allemaal naar behoren werkt :)
Ik zei toch, Class uit een projectje geplukt :+

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op maandag 29 oktober 2001 19:15 schreef DaMike het volgende:
En als je het plaatje transparant wil maken
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.awt.image.RGBImageFilter;
import java.awt.image.DirectColorModel;

public class AlphaFilter extends RGBImageFilter
{
    private int alpha = 0;
    public AlphaFilter(int alpha)
    {
        canFilterIndexColorModel = true;
        this.alpha = alpha;
    }

    public int filterRGB(int x, int y, int rgb)
    {
        if((rgb & 0x00FF00FF) == 0x00FF00FF)
        {
            return 0;
        }

        else

        {
            int rgba = alpha << 24;
            return rgba + rgb;
        }
    }
}

Om het plaatje te filteren gebruik je
code:
1
2
3
AlphaFilter af = new AlphaFilter(128);
newImage = createImage(new FilteredImageSource(newImage.getSource(), af));
prepareImage(newImage,this);
Het is efficienter om die alpha al te shiften in je Constructor.

Stel je hebt een plaatje van 100 bij 100 pixels die allemaal doorvallen naar de "else" van je filter functie.

Verschil? 1000x "<< 24" of 1x "<< 24". Klein plaatje boeit niet zo veel, maar als je op een beetje omvangrijkere plaatjes werkt, zeker het overwegen waard.

En ik zie dat ik mijn geval ook beter had kunnen doen, zoals jij roze vervangt door 0, is hetzelfde netto resultaat als wat ik doe direct onder de "if", scheelt bij jou alleen weer een shift.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Dit hier is een multiply filter, heb ik gebruikt om een willekeurig "schaduwplaatje" te mixen met een vaste achtergrond kleur.

Je geeft een ARGB waarde op en die waarde wordt in het gefilterde plaatje "gemixed".
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class ShadowFilter extends RGBImageFilter
{
    public ShadowFilter(int aValue, int rValue, int gValue, int bValue)
    {
        // The filter's operation does not depend on the
        // pixel's location, so IndexColorModels can be
        // filtered directly.
        canFilterIndexColorModel = true;

        bgAlpha = aValue;
        bgRed   = rValue;
        bgGreen = gValue;
        bgBlue  = bValue;
    }

    public int filterRGB(int x, int y, int rgb)
    {
        return ( 0xFF000000
            | ((((((rgb & 0x00FF0000) >> 16) * bgRed)/255) & 0xFF)<< 16)
            | ((((((rgb & 0x0000FF00) >> 8) * bgGreen)/255) & 0xFF)<< 8)
            | ((((rgb & 0x000000FF) * bgBlue)/255) & 0xFF)
        );
    }

    private int bgAlpha;
    private int bgRed;
    private int bgGreen;
    private int bgBlue;
}
Pagina: 1