Image verändern

Status
Nicht offen für weitere Antworten.

Kaladial

Bekanntes Mitglied
moin

ich hab nen BufferedImage
in diesem BufferedImage ist ein grauwert bild abgespeichert

Code:
BufferedImage img = new BufferedImage(breite, hoehe, BufferedImage.TYPE_BYTE_GRAY);

nun möchte ich aber die oberen farben (247-255)
eine andere farbe zuweisen ...

247 = blau
248 = rot
usw

mein chef meinte man kann das bild irgendwie idizieren und dann die farbpalette verändern...
aber wir haben beide keinen plan wie das geht ...

weis das jemand und kann mir bitte fix helfen ?

thx Kala
 

Quaxli

Top Contributor
Vielleicht ein blöder Vorschlag: Wie wäre es wenn Du ein neues Image als RGB anlegst und das Ganze pixelweise rüberkopierst und dabei die gewünschten Änderungen vornimmst?

Soweit ich sehen kann, gibt es in BufferedImage keine Methode setColorModel, daher würde ich vermuten, daß Du um eine Kopieraktion nicht herum kommst.

Sicher bin ich aber nicht.
 

Kaladial

Bekanntes Mitglied
jojo ich habs auf die pixel umkopier variante gemacht ... is halt nicht so schnell aber geht noch ... naja chef meinte halt nur das das irgendwie geht und da wollt ich ma wissen ob sich damit jemand auskennt und mir da weiter helfen kann ...

aber scheint ja net der fall zu sein :)
 

Verjigorm

Top Contributor
Kaladial hat gesagt.:
jojo ich habs auf die pixel umkopier variante gemacht ... is halt nicht so schnell aber geht noch ... naja chef meinte halt nur das das irgendwie geht und da wollt ich ma wissen ob sich damit jemand auskennt und mir da weiter helfen kann ...

aber scheint ja net der fall zu sein :)


also ich hab grad n etwa dasselbe am Dienstag gemacht und das geht in Millisekunden, selbst bei nem großen Bild
ich poste mal das "Testprogramm"
Musst eigentlich nur den Pfadnamen zum Bild ändern und weiter unten die Farbveränderungen anpassen (zwischen den 2Sternenreihen)

(ich hoffe das ist, was du suchst ^^)

edit: muss natürlich auf Grauwerte angepasst werden ...

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Image 
{
	private BufferedImage image = null;
	private BufferedImage output = null;
	/**
	 * 
	 */
	public Image() 
	{
		File img = new File("src/sis.jpg");
		try {
			image = ImageIO.read(img);
			output = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
			Graphics2D g = output.createGraphics();
			g.drawImage(image, 0, 0, null);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new MyFrame();
	}
	
	class MyFrame extends JFrame
	{
		private static final long serialVersionUID = -3747611725211459710L;
		
		private MyFrame()
		{
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			JPanel panel = new MyPanel();
			setResizable(false);
			add(panel);
			pack();
			setVisible(true);
		}
		
		
		class MyPanel extends JPanel
		{
			private static final long serialVersionUID = 5843567844273616352L;
			
			public MyPanel() 
			{
				setPreferredSize(new Dimension(output.getWidth(), output.getHeight()));
			    change();
			}
			
			private void change()
			{
			    for( int x = 0, w = output.getWidth(); x<w; x++ )
			    {
			    	for( int y = 0, h = output.getHeight(); y<h; y++ )
			        {
			    		int pixel = output.getRGB( x, y );
			    		
			    		int red = (pixel >> 16) & 0xFF,

			    		green = (pixel >> 8) & 0xFF,

			    		blue = (pixel) & 0xFF;

			    		//System.out.println( "R=" + red + " G=" + green + " B=" + blue );
/********************************************************************************/
			    		//Farbwertveränderungen
			    		if(red >= 200)
			    			red = 255;
			    		
			    		if(green >= 200)
			    			green = 255;
			    		
			    		if(blue >= 200)
			    			blue = 255;
			    		
			    		int darkerRGB = new Color(red, green, blue).getRGB();

			    		//System.out.println(pixel + " -> " + darkerRGB);
			    		output.setRGB( x,y, darkerRGB );
/*********************************************************************************/
			        }
			    }
	    		repaint();
			}
			
			@Override
			protected void paintComponent(Graphics g) 
			{
				if(output != null)
					g.drawImage(output, 0, 0, this);
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		new Image();
	}
}
 

Marco13

Top Contributor
Kann gut sein, dass es nochmal merklich schneller wird, wenn man
int darkerRGB = new Color(red, green, blue).getRGB();
durch ein passendes "ZusammenShiften + VerORen" von red, green und blue macht...
 

Kaladial

Bekanntes Mitglied
Code:
public static ImageIcon Lade_BildOverlay(int cam){
		Socket sock=null;
		BufferedOutputStream out=null;
		BufferedInputStream in=null;
		String[] rueck;
		int hoehe;
		int breite;
		byte[] bild;
		boolean erg=false;
		ImageIcon ico1=null;
		String ip=Cam.getIP(cam);
		int port=Cam.getPort(cam);
		try { 
			breite = Cam.getBildBreite(cam); 
			hoehe = Cam.getBildHoehe(cam);
			int b_groesse = breite*hoehe;
			bild = new byte[b_groesse];

			//if(erg_snap){

			
			sock = new Socket(ip, port); //Hier die Domain eintragen
			out = new BufferedOutputStream(sock.getOutputStream());
			in = new BufferedInputStream(sock.getInputStream());
			
			DataInputStream dis = new DataInputStream(in);
			
			String uebergabe1 = "getlastresult\n";
			out.write(uebergabe1.getBytes());    
			out.flush();
			String return_wert="";
			int semikolon=0;
			byte data[] = new byte[1];
			boolean end=true;
			while(end){
				dis.readFully(data);
				if(new String(data).compareToIgnoreCase(";")==0){
					semikolon++;	
					return_wert=return_wert+new String(data);
					if(semikolon==7){
						end=false;
					}
				}else{
					return_wert=return_wert+new String(data);
				}
			}		

			StringTokenizer st = new StringTokenizer(return_wert, ";");
			int count=0;
			int anz_obj=0;
			while (st.hasMoreTokens()){
		    	String token=st.nextToken();
		    	count++;
		    	if(count==1){
		    		Cam.setCamUhrzeit(token, cam);
		    	}
		    	if(count==2){
		    		Cam.setCamMessZeit(Integer.parseInt(token), cam);
		    	}
		    	if(count==3){
		    		Cam.setCamStatus(token, cam);
		    	}
		    	if(count==4){
		    		Cam.setCamGesamt(token, cam);
		    	}
		    	if(count==5){
		    		Cam.setCamGut(token, cam);
		    	}
		    	if(count==6){
		    		Cam.setCamSchlecht(token, cam);
		    	}
		    	if(count==7){
		    		anz_obj=Integer.parseInt(token);
		    		Cam.setCamAnzObj(anz_obj, cam);
		    	}
			}
			
			return_wert="";
			if(anz_obj>0){
				semikolon=0;
				data = new byte[1];
				end=true;
				while(end){
					dis.readFully(data);
					if(new String(data).compareToIgnoreCase(";")==0){
						semikolon++;	
						return_wert=return_wert+new String(data);
						if(semikolon==(anz_obj*3)){
							end=false;
						}
					}else{
						return_wert=return_wert+new String(data);
					}
				}		
			}
			Cam.setCamObjErg(return_wert, cam);
			
			int anz_off=0;
			int anz_off_new=0;
			int off=0;
			int leng=b_groesse;

			anz_off = in.read(bild,off,leng);
			anz_off_new = anz_off;
			while (anz_off<b_groesse){
				off = anz_off;
				leng = leng - anz_off_new;
				anz_off_new = in.read(bild,off,leng);
				anz_off=anz_off+anz_off_new;
			}
			in.close();
			out.close();
			sock.close();
			//data Array mit Farbwerten füllen 
			BufferedImage img = new BufferedImage(breite, hoehe, BufferedImage.TYPE_INT_RGB);
			int k=0;
			int  bild_neu_int[] = new int[b_groesse];
			for(int h=0; h<hoehe; h++){
				for(int br=0; br<breite; br++){
					k=(h*breite)+br;
					int bild_int=((int)bild[k])&0xff;
					bild_neu_int[k]=bild_int;
				}
			}
			for(int h=0; h<hoehe; h++){
				for(int br=0; br<breite; br++){
					k=(h*breite)+br;  
					if(bild_neu_int[k]>247){
						if(bild_neu_int[k]==247){
							bild_neu_int[k] = Color.white.getRGB();
						}else{
							if(bild_neu_int[k]==248){
								bild_neu_int[k] = new Color(0, 0, 255).getRGB(); 
							}else{
								if(bild_neu_int[k]==249){
									bild_neu_int[k] = new Color(0, 255, 0).getRGB(); 
								}else{
									if(bild_neu_int[k]==250){
										bild_neu_int[k] = Color.cyan.getRGB(); 
									}else{
										if(bild_neu_int[k]==251){
											bild_neu_int[k] = Color.red.getRGB(); 
										}else{
											if(bild_neu_int[k]==252){
												bild_neu_int[k] = Color.magenta.getRGB(); 
											}else{
												if(bild_neu_int[k]==253){
													bild_neu_int[k] = Color.yellow.getRGB(); 
												}else{
													if(bild_neu_int[k]==254){
														bild_neu_int[k] = Color.pink.getRGB(); 
													}else{
														if(bild_neu_int[k]==255){
															bild_neu_int[k] = new Color(255, 0, 255).getRGB(); 
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}else{
						bild_neu_int[k] = new Color(bild_neu_int[k], bild_neu_int[k], bild_neu_int[k]).getRGB();						
					}
				}
			}
/*			long start_zeit = System.currentTimeMillis(); 
			System.out.println("Zeit:"+(System.currentTimeMillis()-start_zeit));  
*/
			img.getRaster().setDataElements(0, 0, breite, hoehe, bild_neu_int); 
			ico1 = new ImageIcon(img);

		} catch (IOException ex) {
			System.err.println("41"+ex.toString());
			System.exit(1);
		}finally{
			try{
				if(in != null){
					in.close();
				}
				if(out != null){
					out.close(); 
				}
				if(sock != null){
					sock.close();
				}
			} catch (IOException ex) {
				System.err.println("5"+ex.toString());
				System.exit(1);
			}
		} 	
		return ico1;	
	}

also ich hab das so gemacht ...
funktioniert auch wunderbar und das bild (752*480) dauert ca 100 ms

das ist ganz annehmbar aber ich hab nun wieder gehört das man nem buffered image irgendwie ne tabelle mit farben übergeben kann und dann soll das noch schneller gehn...

und da ich das so fix wie möglich brauch muss ich da nochmal nachgucken...
vielleicht find ich da ja was..
 

Kaladial

Bekanntes Mitglied
So ich habs rausbekommen:

Code:
			byte[] reds = new byte[256];
			byte[] greens = new byte[256];
			byte[] blues = new byte[256];
			
			for(int rgb=0; rgb<247; rgb++){
				reds[rgb]=(byte)rgb;
				greens[rgb]=(byte)rgb;
				blues[rgb]=(byte)rgb;
			}
			reds[247]=(byte)Color.white.getRed();
			greens[247]=(byte)Color.white.getGreen();
			blues[247]=(byte)Color.white.getBlue();

			reds[248]=(byte)Color.blue.getRed();
			greens[248]=(byte)Color.blue.getGreen();
			blues[248]=(byte)Color.blue.getBlue();

			reds[249]=(byte)Color.green.getRed();
			greens[249]=(byte)Color.green.getGreen();
			blues[249]=(byte)Color.green.getBlue();

			reds[250]=(byte)Color.cyan.getRed();
			greens[250]=(byte)Color.cyan.getGreen();
			blues[250]=(byte)Color.cyan.getBlue();

			reds[251]=(byte)Color.red.getRed();
			greens[251]=(byte)Color.red.getGreen();
			blues[251]=(byte)Color.red.getBlue();

			reds[252]=(byte)Color.magenta.getRed();
			greens[252]=(byte)Color.magenta.getGreen();
			blues[252]=(byte)Color.magenta.getBlue();

			reds[253]=(byte)Color.yellow.getRed();
			greens[253]=(byte)Color.yellow.getGreen();
			blues[253]=(byte)Color.yellow.getBlue();
			
			reds[254]=(byte)Color.pink.getRed();
			greens[254]=(byte)Color.pink.getGreen();
			blues[254]=(byte)Color.pink.getBlue();

			reds[255]=(byte)255;
			greens[255]=(byte)0;
			blues[255]=(byte)255;
			
			IndexColorModel color_model = new IndexColorModel(8, 256, reds, greens, blues); 
			
			Image img = Toolkit.getDefaultToolkit().createImage(
					new MemoryImageSource(breite, hoehe,
					color_model, bild, 0, breite));

^^ so hab ich jetzt mein ColorModel verändert. Zeitverlust = 0 (hin und wieder mal 15 ms aufs komplette bild aber ka das muss net an der änderung liegen)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JavaFX Position von Image angeben/verändern AWT, Swing, JavaFX & SWT 2
L Swing Image zur Laufzeit verändern AWT, Swing, JavaFX & SWT 6
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
K JavaFX Bildergalerie aus Image Ordner laden AWT, Swing, JavaFX & SWT 3
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
L AWT .gif image transparent machen AWT, Swing, JavaFX & SWT 3
kodela angezeigtes Image entfernen AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
T Swing Buffered Image anzeigen AWT, Swing, JavaFX & SWT 45
L Image kann nicht gefunden werden AWT, Swing, JavaFX & SWT 1
S Stretch Image in ImageView AWT, Swing, JavaFX & SWT 4
N Swing Image aus Web laden und in Icon umwandeln AWT, Swing, JavaFX & SWT 4
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
L JavaFX Image mit Blureffect AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Background Image Klasse AWT, Swing, JavaFX & SWT 14
Q AWT TicTacToe Image auf Button hinzufügen AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L JavaFX leeres weißes Image - javafx.scene.image.Image AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
B Graphics to Image AWT, Swing, JavaFX & SWT 3
L Image in anderes kopieren AWT, Swing, JavaFX & SWT 0
T Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 1
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
I Image im PopupMenu vom SystemTray AWT, Swing, JavaFX & SWT 8
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
F Swing Image einem Button hinzufügen AWT, Swing, JavaFX & SWT 5
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
T Image aus "nicht-src-ordner" AWT, Swing, JavaFX & SWT 5
vodkaz (javafx) Image Problem AWT, Swing, JavaFX & SWT 2
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Image in JTable einfügen AWT, Swing, JavaFX & SWT 9
M Image aus MS Access anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Image im Array per Knopfdruck ändern AWT, Swing, JavaFX & SWT 6
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
G JavaFX Image vergrößern AWT, Swing, JavaFX & SWT 5
U Image mit Zeichenbereich rotieren AWT, Swing, JavaFX & SWT 3
P Speicherproblem SWT.Image in Nebula-Gallery AWT, Swing, JavaFX & SWT 3
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
D JLabel Image ausrichten AWT, Swing, JavaFX & SWT 2
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
H Image Icon ersetzen AWT, Swing, JavaFX & SWT 8
I Image Button AWT, Swing, JavaFX & SWT 4
U IntBuffer zum Image konvertieren. AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T 2D-Grafik Slideshow (DoubleBuffering und Image transformieren/bewegen) AWT, Swing, JavaFX & SWT 6
K Swing Warum bleibt das Image immer gleich AWT, Swing, JavaFX & SWT 4
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
D Image.getScaledInstance() vs. Netzwerkverbindung??? AWT, Swing, JavaFX & SWT 2
reibi SWT Image viewer AWT, Swing, JavaFX & SWT 2
lumo SWT Image funktion auf ImageDaten AWT, Swing, JavaFX & SWT 9
A Applet .gif in applet Image nicht animiert angezeigt AWT, Swing, JavaFX & SWT 4
M Image wird nicht neugezeichnet nach dem Wechsel AWT, Swing, JavaFX & SWT 2
lumo SWT Image Pattern AWT, Swing, JavaFX & SWT 5
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
M Swing Image in JPanel als Componente AWT, Swing, JavaFX & SWT 2
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
S Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 2
0 Mousecurser mit Image hinterlegen AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
N Java Choice Bilderausgabe - images - - image - AWT, Swing, JavaFX & SWT 2
D iText PdfPCell mit Image AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Icon in Image (System Icons) AWT, Swing, JavaFX & SWT 2
S Button mit Image AWT, Swing, JavaFX & SWT 7
A Skaliertes Image pixelweise bearbeiten AWT, Swing, JavaFX & SWT 6
F SWT GC drawText auf halbtransparentem Image AWT, Swing, JavaFX & SWT 21
G Swing JEdtitorPane und HTML Image Seite AWT, Swing, JavaFX & SWT 2
C Image mit Graphics2D zeichnen AWT, Swing, JavaFX & SWT 9
C Image performant skalieren AWT, Swing, JavaFX & SWT 5
D SWT Image Farbtiefe AWT, Swing, JavaFX & SWT 2
L Swing Auf unabhängiges Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 8
lumo SWT Composite + Image + zeichnen AWT, Swing, JavaFX & SWT 4
V Ein Image als Button (nicht mit JButton(Icon)) AWT, Swing, JavaFX & SWT 5
D Image Viewer gesucht AWT, Swing, JavaFX & SWT 5
Kr0e Image schärfen AWT, Swing, JavaFX & SWT 2
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
T Image auf Image zeichnen AWT, Swing, JavaFX & SWT 2
E Warum ist offscreen (mit Image) schneller? AWT, Swing, JavaFX & SWT 11
G Swing Image speichern / 0 Byte AWT, Swing, JavaFX & SWT 7
H Image abspeichern AWT, Swing, JavaFX & SWT 4
B Swing Image als Hintergrund im JInternalFrame - Problem AWT, Swing, JavaFX & SWT 3
W Image in jar einbauen AWT, Swing, JavaFX & SWT 20
Luk10 AWT Image und die Skalierung! AWT, Swing, JavaFX & SWT 3
L JPanel als Image speichern AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben