# farbschleier über bild legen?



## grayson (3. Feb 2005)

hallo, ich suche nach einer einfachen möglichkeit ein bild mit einem farbschleier zu belegen bzw in einem bestimmten farbton einzufärben.


----------



## hugo (4. Feb 2005)

Bin nicht gerade in der Bildbearbeitung zu Hause, aber wenn du von jedem Pixel die Farbwerte ausliest, kannst du ja zum Beispiel die Rot-Komponente immer auf 200 setzen und dann hast du einen rötlichen Farbschleier. Ist zwar nicht gerade sehr effektiv, aber ein Anfang.


----------



## grayson (10. Mrz 2005)

hmm ok, also aus nem bild nen array machen, wo die pixel drin sind also int[h*w] mit pixelgrabber --->funzt

aber wie komm ich vom array dazu wieder nen bild zu bekommen -->und zwar mit entsprechend hoch gesetzten werten für sagen wir mal rot?


----------



## Beni (10. Mrz 2005)

Du könntest auch einen "java.awt.image.RGBImageFilter" implementieren (da muss man nur eine einzige Methode überschreiben).

Dann benötigst du noch eine Methode, welche deinen Filter benutzt:

```
public static Image createImage (Image i) {
	MyFilter filter = new MyFilter(); // das ist dein Filter
	ImageProducer prod = new FilteredImageSource(i.getSource(), filter);
	Image image = Toolkit.getDefaultToolkit().createImage(prod);
	return image;
    }
```


----------



## grayson (10. Mrz 2005)

wurgs.... bildbearbeitung ist ja ein sowas von rotes tuch für mich.... hier nochmal ne genauere problembeschreibung erstmal... ::


in meinem spielchen hab ich 5 verschiedene parteien, jede mit einer entsprechenden fraktionsfarbe. als da wären :


blau, rot, gelb, lila, grün


die spielsteine die ich verwenden will, sollen allerdnings nicht in diesen farben vorliegen (das werden tausende  von dateien wenn ich alle spielsteine die eine partei haben kann auch noch in 5 verschiedenen farben halten muss) ---jaja tausende ist übertrieben  ---


daher hab ich mir überlegt, das ich beim laden der bilder eine methode brauch, der ich das geladene bild (awt.Image) und die fraktionskennung (String ) übergebe und eins zwei schwup, kommt als rückgabe mein bild raus, allerdings überzogen mit der fraktionsfarbe.



dummer weise bin ich eine absolute null wenn es darum geht etwas anderes mit bildern zu machen als zu skalieren oder von farbe in graustufen zu konvertieren (auch dazu hab ich ewig gebraucht  )

kann mir da jemand nen kleines beispiel geben ?




danke


----------



## Stefan1200 (10. Mrz 2005)

Vielleicht ein farbiges Bild per AlphaComposite drüber legen?


----------



## grayson (10. Mrz 2005)

also ich hab bis jetzt das hier : 


```
public void transformColor(Image img){
     BufferedImage bi = (BufferedImage)img;
   int height=bi.getHeight();
   int width = bi.getWidth();
   int[] colors= new int[height*width];
   DirectColorModel colorModel = (DirectColorModel) ColorModel.getRGBdefault(); 
   for(int i=0;i<height;i++){
   
       for(int a=0;a<width;a++){
          int currentRGB= bi.getRGB(i,a);
    int red=    colorModel.getRed(currentRGB);
    int blue=    colorModel.getBlue(currentRGB);
    int green=    colorModel.getGreen(currentRGB);
   
//... hier muss ich dann noch die gewünschten werte auf 200 setzen 
//... und danach natürlich den neuen wert zusammen stellen und mit bi.setRGB(i,a,neuerWert); einfügen
//... k.a. wie das gehn soll ;)
       }
       
   }
   
 }
```

soo, die methode BufferedImage.setRGB(int x,int y, int rgb)will ich verwenden.
wie bekomm ich aus den int's red, blue, green wieder nen int rgb?


----------



## grayson (10. Mrz 2005)

soo nach ein wenig basteln nun dies : 
	
	
	
	





```
public Image transformColor(Image img, String faction) {
        BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
        bi.createGraphics().drawImage(img, 0, 0, null);
        int height = bi.getHeight();
        int width = bi.getWidth();
        int[] colors = new int[height * width];
        PixelGrabber grabber = new PixelGrabber(img, 0, 0, img.getWidth(null), img.getHeight(null), colors, 0, img.getWidth(null));
        try {
            grabber.grabPixels();
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (int i = 0; i < colors.length; i++) {
            System.err.println("ArrayIndex: " + i);
            DirectColorModel colorModel = (DirectColorModel) ColorModel.getRGBdefault();
            int red = colorModel.getRed(colors[i]);
            int blue = colorModel.getBlue(colors[i]);
            int green = colorModel.getGreen(colors[i]);
            if (faction.trim().equals("marik")) {
                red = 200;
                blue = 200;
            } else if (faction.trim().equals("steiner")) {
                blue = 200;
            } else if (faction.trim().equals("kurita")) {
                red = 200;
            } else if (faction.trim().equals("liao")) {
                green = 200;
            } else if (faction.trim().equals("davion")) {
                red = 200;
                green = 200;
            }

            Color result = new Color(red, green, blue);
            colors[i] = result.getRGB();
            bi.setRGB(0, 0, width, height, colors, 0, width * height */was dieser parameter bedeuten soll.... k.a.
laut javadoc steht da "@param scansize the scanline stride" ----> was is los? /*);

        }

	
        return bi;
    }
```


blöder weise bekomm ich immer eine Exception :


java.lang.ArrayIndexOutOfBoundsException: 3200
	at java.awt.image.BufferedImage.setRGB(BufferedImage.java:919)
	at util.ImageLoader.transformColor(ImageLoader.java:149)
	at util.ImageLoader.loadUnitMapImage(ImageLoader.java:55)
	at client.DeployDialog$ComboBoxRenderer.getListCellRendererComponent(DeployDialog.java:159) //in der zeile steht:

   bi.setRGB(0, 0, width, height, colors, 0, width * height);


----------



## Sky (10. Mrz 2005)

So kannst Du das Bild ändern, im gezeigtem Fall wird ein Blau-Schimmer angezeigt:


```
bi = ImageIO.read( new File( FILENAME) );
for ( int i = 0; i < bi.getWidth(); i++ ) {
  for ( int j = 0; j < bi.getHeight(); j++ ) {
    int rgb = bi.getRGB(i, j);
    Color c = new Color(rgb);
    int newRGB = new Color( c.getRed(), c.getGreen(), 200 ).getRGB();
    bi.setRGB(i, j, newRGB);
  }
}
```


----------



## grayson (10. Mrz 2005)

ok, ok danke für die tipps, es geht jetzt in die richtug die ich mir vorstelle, bis auf eines :

da mein spielsteinbild ja ein rechteck ist, hab ich png bilder genommen, wegen der transparenz um den spielstein ringsrum ---> sonst sieht man ja das spielfeld nimma.

nun habe ich mir meiner methode natürlich den effekt, das mein ganzes bild also das ganze rechteck ein gleichfarbiges quadrat wird.

welchen farb / alphawert hat den ein transparenter pixel ?

bzw wie muss ich die abstimmung der farben machen, damit mein spielstein kein einfarbiger umriss wird sondern der schimmer je nach vorheriger farbe gelegt wird?


----------



## grayson (11. Mrz 2005)

hey sky, danke für deinen tipp, damit geht es, bis auf einen hässlichen schwarzen rand (die bereiche die transparent sein sollen.....) hast noch ne ahnung wie ich das auch noch hin bekomm?


----------



## Sky (11. Mrz 2005)

grayson hat gesagt.:
			
		

> hey sky, danke für deinen tipp, damit geht es, bis auf einen hässlichen schwarzen rand (die bereiche die transparent sein sollen.....) hast noch ne ahnung wie ich das auch noch hin bekomm?



Transparente Stellen werden bei mir irgendwie nur weiss angezeigt... aber vielleicht mache auch ich das was falsch!?


----------



## grayson (11. Mrz 2005)

naja, soweit ich das verstanden habe wird ein bild meist mit einer transparenten farbe schwarz oder weiss und dem alphawert 0 oder 100 dazu abgespeichert und diese werte als "transparent" bestimmt
daher kann es schon sein, das du bilder mit weissem rand hast und ich mit schwarz 

das problem ist vielmehr: wie bekommt man den weg? ich hab jetzt schon versucht mit wilden If abfragen die transparenten pixel raus zu filtern, aber das beste was ich hin bekommen hab, war das der schwarze rand sich mit eingefärbt hat.......


vieleicht hat ja da noch wer ne idee?!?


----------

