# Farbe invertieren?



## Guest (24. Jul 2004)

Hallo, 

ich habe Objekte die gezeichnet werden und selber ihre Farbe kennen, nachdem zum Bsp ein Kreis gezeichnet wurde möchte ich in dessen Mitte etwas schreiben. Dazu soll die Farbe invertiert werden. 

Aber wie kann ich das ganz simpel machen?

Die Farbe der Objekte speichere ich in der Form color=Color.WHITE;

Fr(D)ank


----------



## Beni (24. Jul 2004)

Sowas sollte gehen:

```
Color color = ...
color = new Color( 255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue() );
```


----------



## Guest (21. Jun 2007)

Liefert mir leider -1 zurück.


----------



## The_S (21. Jun 2007)

Anonymous hat gesagt.:
			
		

> Liefert mir leider -1 zurück.



??? Das ist unmöglich :lol:


----------



## Guest (21. Jun 2007)

Angenommen ich habe folgende Klasse:


```
import java.awt.Color;
import java.awt.image.BufferedImage;

public class InvertImage
{

  public BufferedImage transformImage(BufferedImage src)
  {
   int width = src.getWidth();
   int height = src.getHeight();
   BufferedImage dest = new BufferedImage(width, height, src.getType());
   for (int x = 0 ; x < width ; ++x)
   {
     for (int y = 0 ; y < height ; ++y)
     {
       int rgbValue = src.getRGB(x, y);
       Color color = new Color(rgbValue);
       int red = 255 - color.getRed();
       int green = 255 - color.getGreen();
       int blue = 255 - color.getBlue();
       color = new Color (red, green, blue);
       dest.setRGB(x,y,color.getRGB());
     }
   }
   return dest;
  }
}
```

Folgendes BufferedImage übergebe ich der Klasse:


```
BufferedImage bi; 
  Graphics2D big2;
  
  Graphics g;
  
  public Zeichenpanel ()
  {
    bi = new BufferedImage( 1250, 1074, BufferedImage.TYPE_INT_ARGB );
    big2 = bi.createGraphics();
    big2.setColor(Color.BLACK);
  }
```
Es wird also auf dem BufferedImage zuerst gespeichert und anschließend als JPG (invertiert durch die Klasse InvertImage) abgespeichert.

Der Klasse InvertImage übergebe ich also das BufferedImage, auf dem vorher gezeichnet wurde.
An Pixel (0,0) ist die Farbe weiß (durch Debuggen getestet).
Folglich haben alle int-Variablen red, green, blue jeweils den Wert 255.
Dadurch erstelle ich mir eine neue Farbe:
color = new Color(255, 255, 255);
Als "Farbwert" von color.getRGB erhalte ich -1. Dadurch kann das "neue" BufferedImage kein richtigen Farbwert erhalten. Selbst wenn ich das BufferedImage vorher im Malprogramm "bemalt" habe, ist mir nach der Speicherung das Bild in einem kompletten Rot-Ton.


----------



## Der Müde Joe (21. Jun 2007)

x++ sicher mal und nicht ++x bei deinen Schleifen


----------



## Guest (21. Jun 2007)

```
import java.awt.Color; 
import java.awt.image.BufferedImage; 

public class InvertImage 
{ 

  public BufferedImage transformImage(BufferedImage src) 
  { 
   int width = src.getWidth(); 
   int height = src.getHeight(); 
   BufferedImage dest = new BufferedImage(width, height, src.getType()); 
   for (int x = 0 ; x < width ; x++) 
   { 
     for (int y = 0 ; y < height ; y++) 
     { 
       int rgbValue = src.getRGB(x, y); 
       Color color = new Color(rgbValue); 
       int red = 255 - color.getRed(); 
       int green = 255 - color.getGreen(); 
       int blue = 255 - color.getBlue(); 
       color = new Color (red, green, blue); 
       dest.setRGB(x,y,color.getRGB()); 
     } 
   } 
   return dest; 
  } 
}
```
Hab ich so befolgt. Leider noch genau der gleiche Fehler.


----------



## Guest (21. Jun 2007)

Da ich übrigens die Invertierung für die Speicherung von PNGs nicht verwende, da dies für dieses Format nicht relevant ist, funktioniert die Abspeicherung fehlerfrei. Das BufferedImage muss also korrekt sein.


----------



## Der Müde Joe (21. Jun 2007)

funkt wunderbar


```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Test {
	public BufferedImage image;
	
	
	public Test(){
		image= openImage("test.jpeg"); 
		seperateColor();
	}
	
	
	public synchronized BufferedImage openImage(String fileName){
		
		try{
			FileInputStream fis = new FileInputStream(new File(fileName));
			InputStream is = new BufferedInputStream(fis);
			BufferedImage newImage = ImageIO.read(is);
		
			is.close();			
			return newImage;
	
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}
	
    public Color getColor(int i, int j) {
        return new Color(image.getRGB(i, j));
    }	
	/*seperate the Color Channels
	 *
	 */
	public void seperateColor(){
		
		int imageWidth = image.getWidth();
		int imageHeight = image.getHeight();
		
		BufferedImage changedImage = new BufferedImage(imageWidth,imageHeight,BufferedImage.TYPE_INT_ARGB);
		Color color;
		
		for (int x = 0; x < imageWidth; x++) {
           for (int y = 0; y < imageHeight; y++) {
               
               color = getColor(x, y);
               
               int r = 255- color.getRed();
               int g = 255-color.getGreen();
               int b = 255-color.getBlue();
               
               changedImage.setRGB(x, y,   (new Color(r, g, b)).getRGB());

           }
       }      
       new FrameRGB(changedImage, "aaaRED.jpg");
	}
	
	public static void main(String[] args){
		new Test();
	}
	
	
	class FrameRGB extends JFrame{
		
		public BufferedImage imageBuffer;
		public String name;
		
		public FrameRGB(BufferedImage image, String name){
	        setTitle("ColorSeperation"); 			
	 
	        
	 
	        int imageWidth  = image.getWidth(); 
	        int imageHeight = image.getHeight(); 
	 
	        imageBuffer = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB); 
	 		imageBuffer.getGraphics().drawImage(image, 0, 0, null); 
	        
	  
	 		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        setSize(imageWidth, imageHeight); 
	        setResizable(false); 
	        setVisible(true); 
	        
	        this.name=name;        
	        
//			saveImage();
		}
		
		
		public void paint(Graphics g){
			 g.drawImage(imageBuffer, 0, 0, this);
			 
		}	
	}

}
```

alter...sehr alter code von mir leicht modifiziert


----------



## Fenixx (22. Jun 2007)

Deine Version funktioniert so leider nicht bei mir. Ich habe die Sache jetzt aber anders gelöst.


```
public static BufferedImage invertImage (BufferedImage image)
  {
    
    int width = image.getWidth();
    int height = image.getHeight();
    BufferedImage changedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
    for (int x = 0 ; x < width ; ++x)
    {
      for (int y = 0 ; y < height ; ++y)
      {
        //Wert holen
        int argb = image.getRGB(x,y);
        //Decodieren
        int red = (argb >> 16) & 0xff;
        int green = (argb >> 8) & 0xff;
        int blue = argb & 0xff;
        int alpha = (argb >> 24) & 0xff;
        
        //Manipulation: Wertumkehrung
        //Muss Wert zwischen 0 und 255 sein
        red = 255 - red;
        green = 255 - green;
        blue = 255 - blue;
        //Transparenzwert
        alpha = 255 - alpha;
        
        //Codierung
        argb = (alpha << 24) | (red << 16) | (green << 8) | blue;
        //Setzen der Farbe
        changedImage.setRGB(x,y,argb);
      }
    }
    return changedImage;
  }
```

Wenn der User jetzt beispielsweise etwas schwarz zeichnet, erhalte wird dies in JPG tatsächlich schwarz dargestellt. Allerdings tauchen hierbei Probleme mit der Transparenz auf. Der "weiße" Hintergrund wird rötlich dargestellt.
Meine Frage: Wie muss ich die Transparenz invertieren? Manipuliere ich diese nicht, so findet keine richtige Invertierung statt.


----------



## thE_29 (22. Jun 2007)

Wie sieht für dich ne invertierte Transparenz aus?


----------



## Illuminu (22. Jun 2007)

möchte mal behaupten er will seinen "weiß-transparenten"-HG auch weiterhin weiß/transparent behalten. oder schwarztransparent, wobei alle anderen farben invertiert werden sollen.


----------



## Der Müde Joe (22. Jun 2007)

Fenixx hat gesagt.:
			
		

> Deine Version funktioniert so leider nicht bei mir



 :?: 

Sollte aber ...bei mir steht 1.4 ganz oben, Hast wohl kaum was älteres darauf laufen.
Hast du die Namen der Datei die eingelesen wird geändert??


----------



## Der Müde Joe (22. Jun 2007)

Fenixx hat gesagt.:
			
		

> JPG tatsächlich schwarz dargestellt. Allerdings tauchen hierbei Probleme mit der Transparenz auf.



Mit JPEG ist das sehr gut möglicht.

JPEG hat KEINE Transparenz.
(also auch keine Invertierte)


----------



## Marco13 (22. Jun 2007)

Mal ganz pragmatisch: Man könnte auch einfach den RGB-Wert *invertieren*. Darum ging es doch, oder?
int rgbInv = ~rgb;
Naja. Geht auch mit 255-r ....


----------

