Kontrast in einem Bild erzeugen

beastofchaos

Bekanntes Mitglied
Hallo Leute, ich hänge gerade daran, wie ich diese Funktion funktionsfähig mache :)
- Img ist das zu ändernde Bild
- value ist ein Wert zwischen -100 und 100
- Return ist das Ergebnis

Java:
@Override
	public BufferedImage adopt(BufferedImage img, int value) {
		
            // Der Bereich "-100 bis 100" wird zu "0 bis 2"
            float intensive = 1 + (value / 100F);
	
	
	    BufferedImage biDest = new BufferedImage(img.getWidth(),
	                               img.getHeight(),
	                               BufferedImage.TYPE_INT_ARGB);
		RescaleOp rescale = new RescaleOp(intensive, 10, null);
		
//		Passiert nichts:
	        rescale.filter(img, biDest);
	    
//		Auch hier passiert nichts:
//		biDest = rescale.filter(img, null);
	    
	    return biDest;
	}


Freu mich auf Hilfe.

Gruß, Thomas


PS: Hier ein Beispiel-Programm, wo das ganze funktioniert:
java2s.com - ImageProcessingBrightnessandContrast
 

Marco13

Top Contributor
Am geposteten sehe ich spontan nichts falsches. Was kommt denn bei

System.out.println(Integer.toHexString(img.getRGB(0,0));
System.out.println(Integer.toHexString(biDest .getRGB(0,0));

Bzw. wie äußert sich das "nichts passieren"?
 

beastofchaos

Bekanntes Mitglied
Hallo,

grundsätzlich kenne ich mich damit leider nicht aus, aber vielleicht hilft dir ja auch dieser Thread aus der FAQ http://www.java-forum.org/bilder-gu...18-helligkeit-kontrast-bildes-veraendern.html

Schöne Grüße

Fabi

Dieses Tutorial arbeitet jeden Pixel für sich durch und führt also unglaublich oft die Berechnung durch. Mir ist klar, dass es anders nicht gehen kann, aber ich dachte, eine von Java vorgegebene Klasse, würde das am leichtesten/ schnellsten bzw. optimalsten erledigen können. Was meint ihr dazu?



Am geposteten sehe ich spontan nichts falsches. Was kommt denn bei

System.out.println(Integer.toHexString(img.getRGB(0,0));
System.out.println(Integer.toHexString(biDest .getRGB(0,0));

Bzw. wie äußert sich das "nichts passieren"?

Deinen Vorschlag werde ich später mal anschauen, wenn ich weiter schreibe, aber das "nichts passiert" meint, dass das Bild genauso wie vorher aussieht.

Was mich an meinem Code verwirrt ist diese Zeile:
Code:
rescale.filter(img, biDest);
In der Beschreibung steht, dass er das Ergebnis zurückgibt, gleichzeitig kann man dass Ziel aber auch als Parameter angeben (darf auch null sein).
 

beastofchaos

Bekanntes Mitglied
System.out.println(Integer.toHexString(img.getRGB(0,0));
System.out.println(Integer.toHexString(biDest .getRGB(0,0));

Hab es doch schon jetzt ausprobiert. Bei einem value-Wert von 50, kommen diese beiden Zeilen raus:

ffffffff
ffff00

In der zweiten Zeile fehlt iwie ein Wert (Der Alpha-Wert?)

Hier mal ein zweites Beispiel, als ich die linke obere Ecke mal hellrot angemalt habe:

ffff6666 (Voller Alphawert + helles Rot)
ffa300 (helles Orange)



Bei Paint.NET wird bei Kontrast 50 die Farbe "FF6666" zu "FF7A7A".
 

Marco13

Top Contributor
Was mich an meinem Code verwirrt ist diese Zeile:
Code:
rescale.filter(img, biDest);
In der Beschreibung steht, dass er das Ergebnis zurückgibt, gleichzeitig kann man dass Ziel aber auch als Parameter angeben (darf auch null sein).

Etwas vereinfacht: Man kann dort ein Image übergeben, in das reingemalt werden soll - und wenn man keins übergibt, wird eins angelegt. Das ist, damit man selbst bestimmen kann, ob dort ein neues Bild erzeugt oder ein schon vorhandenes verwendet werden soll. (Das macht aber noch mehr - z.B. die Kompatimilitätschecks die in der Doku stehen)





Hab es doch schon jetzt ausprobiert. Bei einem value-Wert von 50, kommen diese beiden Zeilen raus:

ffffffff
ffff00

In der zweiten Zeile fehlt iwie ein Wert (Der Alpha-Wert?)

Zumindest sieht man schonmal, das sich was ändert. Auch wenn man nicht viel erwarten darf, wenn man versucht, "Weiß" heller zu machen ....

Wie zeichnest du das Ergebnisbild? Poste ein KSKB!

Bei Paint.NET wird bei Kontrast 50 die Farbe "FF6666" zu "FF7A7A".

RescaleOp macht mehr als eine Kontrasterhöhung. Nämlich Kontrast UND Helligkeit auf einmal (je nach Parametern)
 

beastofchaos

Bekanntes Mitglied
Zumindest sieht man schonmal, das sich was ändert. Auch wenn man nicht viel erwarten darf, wenn man versucht, "Weiß" heller zu machen ....

Was wäre denn der Standardwert, dass die Helligkeit sich nicht ändert? Im Tutorial war das 10 und beim Kontrast 1.


Wie zeichnest du das Ergebnisbild? Poste ein KSKB!

Na, das wird jetzt toll mit dem "wie zeichne ich das". Ich müsste dich in mein 75 Klassen schweres Projekt einführen :D

An einer Stelle wird das Bild gemalt, welches aber andere Klassen (als Zeichenobjekte ) aufruft... und allein die Kontrast-Einstellung läuft über ein Always-On-Top-Dialog. Hatte schon viele Probleme bei meinem Programm wegen Malen, aber das ist alles behoben. Deswegen zeige ich erstmal nur meinen Dialog. Vorweg verwende ich für alle solche Dialog die abstrakte Oberklasse "EDModel" und diese Unterklasse heißt "EDContrast". Kommentare fehlen zur Zeit leider noch, aber ich kenn mich mit meinem Code bestens aus und erkläre gerne im Nachhinein:

EDModell:

Java:
public abstract class EDModel extends JDialog{
    private int value;
    private JTextField fieldValue;
    private JScrollBar scroller;
    private boolean imageAdded;
    
    private BufferedImage oldImg;
    private Main main;
    
    public EDModel(Main target, String title){
        super(target);
        setModal(false);
        setTitle(title);
        setSize(132, 500);
        main = target;
        imageAdded = false;
        setVisible(false);
        setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent evt){
                reset();
                setVisible(false);
            }
        });
        layoutPanel();
    }
    
    private void layoutPanel(){
        fieldValue = new JTextField();
        fieldValue.setHorizontalAlignment(SwingConstants.CENTER);
        fieldValue.setToolTipText("Intensivität");
        fieldValue.addKeyListener(new KeyAdapter(){
            @Override
            public void keyReleased(KeyEvent e) {
                if (fieldValue.getText().length() == 0){
                    return;
                }
                int newValue;
                try{
                    newValue = Integer.parseInt(fieldValue.getText());
                }catch (NumberFormatException exc){
                    newValue = scroller.getValue();
                }
                newValue = Math.min(newValue, scroller.getMaximum() - 1);
                newValue = Math.max(newValue, scroller.getMinimum());
                value = newValue;
                scroller.setValue(newValue);
                fieldValue.setText(newValue + "");
            }
        });
        scroller = new JScrollBar();
        scroller.setPreferredSize(new Dimension(40, 100));
        scroller.setOrientation(JScrollBar.VERTICAL);
        scroller.setToolTipText(getTitle());
        scroller.addAdjustmentListener(new AdjustmentListener(){
            public void adjustmentValueChanged(AdjustmentEvent e) {
                fieldValue.setText(scroller.getValue() + "");
                value = scroller.getValue();
                adoptValue();
            }
        });
        scroller.setValues(0, 1, -100, 101);

        JButton buttonReset = new JButton("");
        buttonReset.setToolTipText(Languages.get("Reset"));
        buttonReset.setIcon(new ImageIcon(getClass().getResource("/images/reset.png")));
        buttonReset.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                reset();
            }
        });
        JButton buttonOk = new JButton("OK");
        buttonOk.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                adoptAndClose();
            }
        });

        JPanel panel = new JPanel(new GridBagLayout());
        ((GridBagLayout)panel.getLayout()).columnWidths = new int[]{1, 2, 1};
        GridBagConstraints cons = new GridBagConstraints();
        cons.fill = GridBagConstraints.VERTICAL;
        cons.gridwidth = GridBagConstraints.REMAINDER;
        cons.gridheight = 5;
        cons.weightx = 0.5;
        cons.weighty = 1.0;
        panel.add(scroller, cons);
        cons.gridheight = 1;
        cons.weighty = 0.0;
        cons.fill = GridBagConstraints.BOTH;
        panel.add(fieldValue, cons);
        panel.add(buttonReset, cons);

        JPanel panelLow = new JPanel(new GridBagLayout());
        panelLow.add(buttonOk, cons);

        add(panel, BorderLayout.CENTER);
        add(panelLow, BorderLayout.SOUTH);
    }

    private Point getSpecialLocation(Center centerPanel) {
        Point loc = getLocation();
        int xRightPos = centerPanel.getLocationOnScreen().x +
                         centerPanel.getWidth();
        loc.y = centerPanel.getLocationOnScreen().y;
        loc.x = xRightPos - getWidth();
        return loc;
    }

    //------------------------------------------------------------------//

    public void actualize(){
        reset();
        oldImg = ((ImageDesign)Saves.properties.process.getPaints().clone()).getImage();
        setLocation(getSpecialLocation(main.center));
    }
    
    public void reset(){
        scroller.setValue(0);
        if (imageAdded){
        	Saves.properties.process.goBackward();
        	imageAdded = false;
        }
        Saves.properties.process.repairProcess();
    }
    
    
    public void close(){
    	reset();
    	dispose();
    }

    private void adoptAndClose(){
        setVisible(false);
        adoptValue();
        dispose();
    }

    private void adoptValue(){
        if (Saves.properties.process == null){
            return;
        }
    	if (Saves.properties.process.getActual().getMode() == Design.IMAGE){
    		Saves.properties.process.goBackward();
    	}
        Saves.properties.process.add(new ImageDesign(getAdoptedImage()));
        imageAdded = true;
    }
    
    private BufferedImage getAdoptedImage(){
    	BufferedImage newImg = new BufferedImage(oldImg.getWidth(), oldImg.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = newImg.createGraphics();
        try{
        	BufferedImage biDist = new BufferedImage(oldImg.getWidth(), oldImg.getHeight(), BufferedImage.TYPE_INT_ARGB);
        	Graphics2D g2d_2 = biDist.createGraphics();
        	try{
        		g2d_2.drawImage(oldImg, 0, 0, null);
        	}finally{
        		g2d_2.dispose();
        	}
            g2d.drawImage(adopt(biDist, value), 0, 0 , null);
        } finally{
            g2d.dispose();
        }
    	return newImg;
    }

    public abstract BufferedImage adopt(BufferedImage img, int newValue);
}

EDContrast:
Java:
public class EDContrast extends EDModel{
	public Main main;

	public EDContrast(Main target){
	    super(target, Languages.get("Contrast"));
	    this.main = target;
	}
	
	@Override
	public BufferedImage adopt(BufferedImage img, int value) {
		
		float intensive = 1 + (value / 100F);
	
	
	    BufferedImage biDest = new BufferedImage(img.getWidth(),
	                               img.getHeight(),
	                               BufferedImage.TYPE_INT_ARGB);
		RescaleOp rescale = new RescaleOp(intensive, 10, null);
		
//		Passiert nichts:
	    rescale.filter(img, biDest);
	    
	    System.out.println(Integer.toHexString(img.getRGB(0, 0)));
	    System.out.println(Integer.toHexString(biDest .getRGB(0,0)));
	    
//		Auch hier passiert nichts:
//		biDest = rescale.filter(img, null);
	    
	    return biDest;
	}
}


Ich erwarte keineswegs, dass ihr jetzt alles da durchschaut, aber wichtig ist in EDModell eig. nur "getAdoptedImage()" - das findet ihr ganz unten.
EDContrast sollte man alles verstehen können ;)

Gruß, Thomas
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hmja, bei sowas wie
Java:
        if (Saves.properties.process.getActual().getMode() == Design.IMAGE){
            Saves.properties.process.goBackward();
        }
rollen sich mir zwar pauschal erstmal die Fußnägel hoch, aber unabhängig davon: Erstelle ein KSKB, wo zwei Panels oder ImageIcons in einem Frame liegen, das eine zeigt das "vorher" Bild, und das andere das "Nachher" Bild. Wenn man dann sieht, dass die RescaleOp genau das tut, was sie tun soll, wird man feststellen, dass der Fehler vermutlich in Zeilen wie
Saves.properties.process.add(new ImageDesign(getAdoptedImage()));
liegt.
 

beastofchaos

Bekanntes Mitglied
Hmja, bei sowas wie
Java:
        if (Saves.properties.process.getActual().getMode() == Design.IMAGE){
            Saves.properties.process.goBackward();
        }
rollen sich mir zwar pauschal erstmal die Fußnägel hoch, aber unabhängig davon: Erstelle ein KSKB, wo zwei Panels oder ImageIcons in einem Frame liegen, das eine zeigt das "vorher" Bild, und das andere das "Nachher" Bild. Wenn man dann sieht, dass die RescaleOp genau das tut, was sie tun soll, wird man feststellen, dass der Fehler vermutlich in Zeilen wie
Saves.properties.process.add(new ImageDesign(getAdoptedImage()));
liegt.

Ich denke mal du meckerst, weil ich da etwas in ner statischen Klasse speicher, aber das für mich bisher die einzige Lösung, wenn ich nicht in jedem Konstruktor der vielen Klassen in meinem Projekt ein Verweis auf meine Oberklasse einbauen will. Ich werd den ganzen Code eh noch durcharbeiten und kommentieren, bevor ich meine Abi-BLL darüber schreibe :)
Ich schreibe morgen mal das Testprogramm und mach euch n ScreenShot, aber eigentlich ist das Testprogramm schon gegeben (siehe Link im ersten Beitrag)

Thomas
 

Marco13

Top Contributor
Ich schreibe morgen mal das Testprogramm und mach euch n ScreenShot, aber eigentlich ist das Testprogramm schon gegeben (siehe Link im ersten Beitrag)

Genau darauf will ich ja hinaus: In einem Beispiel macht die RescaleOp genau das, was sie soll. Bei dir angeblich nicht. Dann liegt der Fehler vermutlich bei dir. Die Frage, wie dieses Bild (das da erzeugt wird) denn angezeigt wird, hast du noch nicht beantwortet.
 

beastofchaos

Bekanntes Mitglied
Also ist so, wie ich es schon länger befürchtet habe. In meinem Programm funktioniert alles, solange ich ein BufferedImage mit "BufferedImage.TYPE_INT_RGB" erzeuge. Wenn ich stattdessen "ARGB" angebe, kommt ein "leeres" Bild bei mir raus.
Glaubt ihr, RescaleOP kann echt Bild mit speziellen alpha-Werten verarbeiten? Wäre schade, dann müsste ich doch zu der anderen Idee übergehen.

Hier mein Test-Programm (mit RGB -> funktionierend):
Java:
package tests;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ContrastTest {
	
	public static void main(String[] args){
		JFileChooser searchPath = new JFileChooser();
        searchPath.setFileSelectionMode(JFileChooser.FILES_ONLY);
	    searchPath.setDialogTitle("Bilds laden...");
	    int result = searchPath.showOpenDialog(null);
	    if (result == JFileChooser.CANCEL_OPTION){
            return;
	    }
	    File file = searchPath.getSelectedFile();
	    
	    MediaTracker tracker = new MediaTracker(new JPanel());
	    
	    Image img = Toolkit.getDefaultToolkit().getImage(file.getPath());
	    tracker.addImage(img, 1);
	    try {
			tracker.waitForAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	    
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		ClearTest test = new ClearTest();
		frame.getContentPane().add(new Painter(img));
		
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	
	public static class Painter extends JPanel{
		public BufferedImage img;
		public BufferedImage img2;
		public Dimension size;
		
		public Painter(Image img){
			super();
			setOpaque(false);
			setPreferredSize(new Dimension(1020, 310));
		    size = new Dimension(500, 300);
			this.img = drawOnBufferedImg(img);
		    this.img2 = adopt(this.img, 50);
		}
		
		@Override
		public void paintComponent(Graphics g){
			super.paintComponent(g);
		    g.drawImage(img, 5, 5, size.width, size.height, null);
		    g.drawImage(img2, size.width + 15, 5, size.width, size.height, null);
			g.drawLine(size.width + 10, 0, size.width + 10, size.height + 10);
		}
		
		//-----------------------------------------------------------------//
		
		public BufferedImage drawOnBufferedImg(Image img){
			BufferedImage bImg = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
			Graphics g2d = bImg.createGraphics();
			try{
				g2d.drawImage(img, 0, 0, null);
			} finally{
				g2d.dispose();
			}
			return bImg;
		}
		
		public BufferedImage adopt(BufferedImage img, int value) {
			float intensive = 1 + (value / 100F);
			BufferedImage biDest = new BufferedImage(img.getWidth(),
		                               img.getHeight(),
		                               BufferedImage.TYPE_INT_RGB);
			RescaleOp rescale = new RescaleOp(intensive, 10, null);
			
//			Funktioniert!!
			biDest = rescale.filter(img, null);

		    System.out.println(Integer.toHexString(img.getRGB(0, 0)));
		    System.out.println(Integer.toHexString(biDest.getRGB(0,0)));		    
		    return biDest;
		}
	}
}


Gruß, thomas
 

Marco13

Top Contributor
Also bei mir funktioniert das...

Java:
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class ContrastTest {

    public static void main(String[] args) throws Exception{

        BufferedImage image = ImageIO.read(new File("image01.jpg"));

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(new Painter(image));

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static class Painter extends JPanel{
        public BufferedImage img;
        public BufferedImage img2;
        public Dimension size;

        public Painter(BufferedImage img){
            super();
            setOpaque(false);
            setPreferredSize(new Dimension(1020, 310));
            size = new Dimension(500, 300);
            this.img = img;
            this.img2 = adopt(this.img, 50);
        }

        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawImage(img, 5, 5, size.width, size.height, null);
            g.drawImage(img2, size.width + 15, 5, size.width, size.height, null);
            g.drawLine(size.width + 10, 0, size.width + 10, size.height + 10);
        }

        public BufferedImage adopt(BufferedImage img, int value) {
            float intensive = 1 + (value / 100F);
            //RescaleOp rescale = new RescaleOp(new float[]{intensive,intensive,intensive, 1}, new float[]{10,10,10,0}, null);
            RescaleOp rescale = new RescaleOp(intensive, 10, null);

//          Funktioniert!!
            BufferedImage biDest = rescale.filter(img, null);

            System.out.println(Integer.toHexString(img.getRGB(0, 0)));
            System.out.println(Integer.toHexString(biDest.getRGB(0,0)));
            return biDest;
        }
    }
}


Wenn du den Typ von Ein/Ausgabebild ändern oder selbst bestimmen willst, musst du halt aufpassen. Bei ARGB könntest du auch mal schauen, ob die auskommentierte RescaleOp-Zeile nicht das tut, was du willst (aber was das ist, ist mir nicht ganz klar...)
 

beastofchaos

Bekanntes Mitglied
Welche auskommentierte zile meinst du jtzt. die in deinem code oder in meinem. bei mir hatte ich schon alles ausptobiert. ARGB ist fuer mein zeichenprogramm wichtig weshalb ich ja frage ob es auch anders ginge. ich mach mal morgn noch n paar test und spiel n bissl rum. vll kommt mir ja ein einfall :)

Gruss Thomas
 

Marco13

Top Contributor
Ich sehe in deinem (letzten) Code keine auskommentierte Zeile. Ich meinte
RescaleOp rescale = new RescaleOp(new float[]{intensive,intensive,intensive, 1}, new float[]{10,10,10,0}, null);
aber sag' ggf. mal genau welchen Typ die Bilder haben sollen. (Sofern das letzte (wo es funktionierte) nur ein Test sein sollte)
 

beastofchaos

Bekanntes Mitglied
Okay, Großes Dankeschön für deine Hilfe. Ich weiß, ehrlich gesagt jetzt nicht was ich genau falsch gemacht habe, aber bei deinem Test-Programm (ohne die auskommentierte Zeile) funktioniert alles. Ich werde es jetzt in mein Programm einbauen und wenn dann immer noch was nicht funktioniert, meld ich mich nochmal.

Was genau hast du jetzt bei dir nochmal anders gemacht, abgesen davon, dass du das Bild mit ImageIO öffnest und ich es einfach auf ein BufferedImage male.

Gruß, Thomas


PS: Deine auskommentierte Zeile funktioniert nicht, aber ist ja jetzt auch egal - Trotzdem hier die Fehlermeldung:
Exception in thread "main" java.lang.IllegalArgumentException:
Number of scaling constants does not equal the number of of color or color/alpha components



PS2: Wenn ich die Funktion "adopt()" in meinem Programm einbaue, ändert sich immer noch nicht viel. Beim Punkt [0;0] bei Kontrast -100 wird "ffffffff" zu "a0a00".
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Auch das lag noch in meiner TODO-Liste...

Man muss wohl eine RescaleOp erstellen, die zu dem zu verarbeitenden Bild passt - d.h. es wäre gut, wenn man müßte, dass das reinkommende Bild immer den gleichen Typ hat (ansonsten muss man den Abfragen und ensprechend reagieren). Wenn's nicht klappt, schau ich (irgendwann) nochmal.
 

beastofchaos

Bekanntes Mitglied
Ja es hat im Test funktioniert, aber wohlmöglich gibt ImageIO nicht mit dem von mir gewollten Typ wieder. Performance-mäßig ist es natürlich besser, aber ich brauch das hier im Test erstmal, um herauszufinden, wie es am besten geht beim Typ ARGB.
Denkste, ich muss es jetzt die Art nehmen, jeden Pixel einzeln zu bearbeiten? Wäre auch ne Alternative, solange es schnell zu verarbeiten ist.

Gruß, Thomas
 

Marco13

Top Contributor
Nochmal als KSKB. Genaue Problembeschreibung posten
Java:
import java.awt.*;
import java.awt.image.*;
import java.io.*;

import javax.imageio.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ContrastTest
{

    public static void main(String[] args) throws Exception
    {
        BufferedImage image = readAsARGB(new File("lena512color.png"));

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout());

        final Painter painter = new Painter(image);
        frame.getContentPane().add(painter, BorderLayout.CENTER);
        final JSlider s = new JSlider(-100, 100, 0);
        s.addChangeListener(new ChangeListener()
        {
            @Override
            public void stateChanged(ChangeEvent e)
            {
                painter.setContrast(s.getValue());
            }
        });
        frame.getContentPane().add(s, BorderLayout.SOUTH);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static BufferedImage readAsARGB(File file) throws IOException
    {
        BufferedImage tempImage = ImageIO.read(file);
        BufferedImage image = new BufferedImage(
            tempImage.getWidth(), tempImage.getHeight(), 
            BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = image.createGraphics();
        g.drawImage(tempImage, 0, 0, null);
        g.dispose();
        return image;
    }

    public static class Painter extends JPanel
    {
        public BufferedImage img;
        public BufferedImage img2;
        public Dimension size;

        public Painter(BufferedImage img)
        {
            super();
            setOpaque(false);
            setPreferredSize(new Dimension(1020, 310));
            size = new Dimension(500, 300);
            this.img = img;
            this.img2 = adopt(this.img, 50);
        }

        public void setContrast(int contrast)
        {
            this.img2 = adopt(this.img, contrast);
            repaint();
        }

        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(img, 5, 5, size.width, size.height, null);
            g.drawImage(img2, size.width + 15, 5, size.width, size.height, null);
            g.drawLine(size.width + 10, 0, size.width + 10, size.height + 10);
        }

        private BufferedImage adopt(BufferedImage img, int value)
        {
            float intensive = 1 + (value / 100F);
            RescaleOp rescale = new RescaleOp(new float[]
            { intensive, intensive, intensive, 1 }, new float[]
            { 10, 10, 10, 0 }, null);

            BufferedImage biDest = rescale.filter(img, null);

            System.out.println(Integer.toHexString(img.getRGB(0, 0)));
            System.out.println(Integer.toHexString(biDest.getRGB(0, 0)));
            return biDest;
        }
    }
}
 

beastofchaos

Bekanntes Mitglied
Also im Test-Programm, im Tutorial und in meinem Programm wird das Bild bei niedrigem Kontrast schwarz und bei hohen scheint es eher eine größere Sättigung zu bekommen bzw. Ich es wird nicht wirklich intensiv kontrastreicher. Bei maximalen Kontrast müsste das Bild eigentlich schwarz-weiß sein. Wieso nicht? Egal, wie ich hoch es stelle - es funktioniert nicht wie ich es mir vorstelle. Aber trotzdem danke, weil sich jetzt in meinem Pogramm wenigstens was ändert :p

Ich werd mich wohl an diese Variante anpassen müssen: Pixel für Pixel (LuT)

Da kann ich gegebenenfalls auch die Berechnungen ändern/ anpassen :)

Gruß, Thomas

PS: Ich werde das dann erst morgen machen und mich nochmal melden, wenn es Probleme gibt.
 

beastofchaos

Bekanntes Mitglied
As o bei Wikipedia zeigen an Bildern schonmal, wie Kontrast funktionieren sollte. Denn weder das LuT noch das was bisher hier gezeigt wurde, entspricht dem Verständnis von "Kontrast". Nun will ich mit Hilfe des Aufbaus der LUT (siehe zwei Beitrag) meine "eigene" Berechnung einbauen. Also das Gerüst für die Formel ist auch schon da. Auch wenn das LUT die Farbbereiche (R, G & B) einzelnd bearbeitet und ich das ganze wohl umbauen muss, dass jeder einzelne Pixel bearbeitet wird, was natürlich wiederum sehr ressourcenlastig ist, aber Java selbst bietet halt keine Hilfe hierbei... :/

Bei Wiki wird das ganze so formal definiert:

"Der Michelson-Kontrast Km (min. 0, max. 1) wird definiert als:
K_M = (L_max - L_min) / (L_max + L_min)
Dabei bezeichnet L die Leuchtdichte."

-> Wikipedia - Kontrast

Hier wird halt die Leuchtedichte für den Kontrast-Wert hergenommen, wobei ich hier weder weiß, wie ich die Leuchtdichte in einem Pixel berechnen, noch wie ich dann danach mit dem Kontrastwert umgehen muss.

Weiß jemand Rat?

Gruß, Thomas

PS: Ein Kontakt zum Hersteller von Paint.NET wäre wohl ein Geschenk haha :)
 

Marco13

Top Contributor
Dass du nicht das machst, was du willst, ist ein anderer Sachverhalt, als dass der Computer nicht macht, was du willst ;) Ich dachte auch erst, dass du einen Histogrammabgleich willst, wie etwa in http://www.java-forum.org/codeschni...jcuda-java-bindings-fuer-cuda.html#post886332 - und NUR mit einer RescaleOp wäre das schwierig geworden. Wenn es nur darum geht, so einen Kontrast-Slider wie in den gängigen Bildverarbeitungsprogrammen nachzubauen... ja, zugegeben, ich bin da auch erst drüber gestolpert, weil die Rechnungen etwas un-intuitiv sind, aber ... schau halt mal...

Java:
import java.awt.*;
import java.awt.image.*;
import java.io.*;

import javax.imageio.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ContrastTest
{

    public static void main(String[] args) throws Exception
    {
        BufferedImage image = readAsARGB(new File("799px-Male_Anolis_carolinensis.jpg"));

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout());

        final Painter painter = new Painter(image);
        frame.getContentPane().add(painter, BorderLayout.CENTER);
        final JSlider s = new JSlider(-99, 99, 0);
        s.addChangeListener(new ChangeListener()
        {
            @Override
            public void stateChanged(ChangeEvent e)
            {
                painter.setContrast(s.getValue() / 100.0f);
            }
        });
        frame.getContentPane().add(s, BorderLayout.SOUTH);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static BufferedImage readAsARGB(File file) throws IOException
    {
        BufferedImage tempImage = ImageIO.read(file);
        BufferedImage image = new BufferedImage(
            tempImage.getWidth(), tempImage.getHeight(), 
            BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = image.createGraphics();
        g.drawImage(tempImage, 0, 0, null);
        g.dispose();
        return image;
    }

    public static class Painter extends JPanel
    {
        public BufferedImage inputImage;
        public BufferedImage outputImage;

        public Painter(BufferedImage inputImage)
        {
            super();
            setOpaque(false);
            setPreferredSize(new Dimension(1020, 310));
            this.inputImage = inputImage;
            this.outputImage = adopt(this.inputImage, 0);
        }

        public void setContrast(float contrast)
        {
            this.outputImage = adopt(this.inputImage, contrast);
            repaint();
        }

        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(inputImage, 5, 5, getWidth() / 2 - 10, getHeight() - 5, null);
            g.drawImage(outputImage, getWidth() / 2 + 5, 5, getWidth() / 2 - 10, getHeight(), null);
            g.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
        }

        private static BufferedImage adopt(BufferedImage image, float value)
        {
            float scaleFactor = 1;
            float offset = 0;
            if (value > 0)
            {
                scaleFactor = 1 / (1 - value);
                offset = -0.5f * (scaleFactor - 1);
            }
            else if (value < 0)
            {
                scaleFactor = 1 + value;
                offset = 0.5f * (1 - scaleFactor);
            }
            RescaleOp rescale = new RescaleOp(
                new float[]{ scaleFactor, scaleFactor, scaleFactor, 1 }, 
                new float[]{ offset * 255.0f, offset * 255.0f, offset * 255.0f, 0 }, null);

            return rescale.filter(image, null);
        }
    }
}
 

beastofchaos

Bekanntes Mitglied
Also wenn ich das richtig sehe bei der Ausführung deines Programms, funktioniert dein Beispiel wie vorher schon - bloß bei einem negativ-bild und im Bereich von -1 bis 1 funktioniert es nicht bzw. seht man ein graues/ schwarzes Bild.

Gruß, Thomas
 

Marco13

Top Contributor
Das Bild sieht genauso aus, wie wenn man in GIMP den Kontrast zwischen -127 und 127 ändert: Bei -1 (also "kein Kontrast") ist alles grau. Bei +1 (also maximaler Kontrast) ist es praktisch schwarz-weiß (bzw. schwarz oder volle helligkeit/saturation).

Ich werd' jetzt nicht weiter rum-raten. :bahnhof:
 

beastofchaos

Bekanntes Mitglied
Also wenn es wirklich keinen hier gibt, der sich damit auskennt, muss ich es woh laufgeben, aber hast du dir angeschaut, was ich meine? Bei Wikipedia gibt es ein Beispiel (siehe mein Wikipedia-Link vor zwei Beiträgen) und sonst kann man das auch mal bei Paint.NET mal ausprobieren - es ist kostenlos und echt wirklich leicht zu verstehen.
Da ist es auch so wie Kontrast sein soll. Um so stärker der Kontrast um farbschwächer und mehr schwarz-weiß-farbend wird das Bild bzw am Ende ist das Bild ganz schwarz-weiß. Bei schwächeren bildet sich ein grauer Dunst.
Bei den ganzen Test hier wird bei stärkeren Kontrast die Farbintensität sogar stärker (also kein maximaler Kontrast von schwarz-weiß) und bei schwächerem Kontrast sieht es einfach so aus, als würde jemand ein graues Blatt drüberlegen, was wohl kein braucht, wenn er an seinem Bild rumbastelt mit einem Grafikprogramm.

Gruß, Thomas
 

Marco13

Top Contributor
Starte das gepostete Programm (das verwendete Bild ist das von Wikipedia).
Schiebe den Slider in die Mitte des rechten Bildes: Das bild sieht aus wie das kontrastreiche Bild von Wikipedia.
Schiebe den Slider ins hintere Viertel des linken Bildes: Das Bild sieht aus wie das kontrastarme Bild von Wikipedia.

Starte GIMP (auch frei, nicht ganz so leicht zu verwenden, aber besser :D), lade das Bild und wähle die Kontrasteinstellungen.
Schiebe den Slider ganz nach links: Das Bild wird komplett grau.
Schiebe den Slider ganz nach rechts: Das Bild wird "schwarz-weiß".
Verwende irgendeine Slider-Einstellung von GIMP und vergleiche sie mit der entsprechenden Slider-Einstellung im geposteten Program: Die Ausgabebilder sehen gleich aus.

:bahnhof:
 

beastofchaos

Bekanntes Mitglied
Könntest du vll ein ScrnShot davon machen, denn bei mir sieht es sowohl bei GIMP als auch m Testprogramm nicht schwarz-weiß aus bei starkem Kontrast.
 

Marco13

Top Contributor
Das "schwarz-weiß" stand in Anführungzeichen, weil es z.B. beim Testbild auch grüne Bereiche gibt, die eben schon von Anfang an volle Helligkeit hatten, und diesen auch beim höchsten Kontrast behalten.
 

beastofchaos

Bekanntes Mitglied
Das ist aber bei jedem Bild so dass es nicht schwarz-weiss wird. wie schon gesagt schau dir paint.net an. da geht es bei egal welchem bild.

thomas
 

Marco13

Top Contributor
Ich schaue mir Paint.NET nicht an. Vielleicht macht das jemand anderes, der sich dann aus den Fingern nuckelt, was für eine willkürliche Implementierung da wohl dahinterstecken mag. Warum soll durch eine Erhöhung des Kontrastes aus Grün auf einmal Weiß werden? Denk' dir eine Formel aus, bei der das passiert, und implementier' sie dann als RescaleOp oder irgendwie anders. Du hast für jeden einzelnen Pixel die Wahl zwischen 16777216 Farben, da ist für jeden was dabei.
 

beastofchaos

Bekanntes Mitglied
also es ist bei jedem bild so dass ers ei hohem kontrast schwarz-weiss. das ist doch rein theoretisch immer so. ich denke ich find keine formel. man muesste iwie die leuchtdichte einer farbe errechnen. wenn sie ueber 0.5 ist, strebt sie gegen 1 bzw. dunkel/schwarz. und unter 0.5 halt gegen weiss....

gruss, thomas
 

Marco13

Top Contributor
Die Helligkeit einer Farbe (im HSB-Sinn) hängt vom Maximum der R,G,B-Werte ab. Und bei G=255 ist die Helligkeit 1, und kann auch nicht höher werden. Wenn irgendein Malprogramm das irgendwie anders sieht, musst du irgendein anderes Verfahren implementieren.
 

beastofchaos

Bekanntes Mitglied
Das PHP-Forum konnte helfen und ich habe jetzt die Berechnungen von Paint.NET.
Wer sich den ganzen Ärger sparen will, hier sind zwei Methoden:


Den farblichen Kontrast verändern durch die Klasse RescaleOp
Java:
private BufferedImage adopt_ColorContrast(BufferedImage img, int value)
        {
        	value = (value == 100) ? 99 : value;
            float Dvalue = value / 100f;
            float scaleFactor = 1;
            float offset = 0;
            if (Dvalue > 0)
            {
                scaleFactor = 1 / (1 - Dvalue);
                offset = -0.5f * (scaleFactor - 1);
            }
            else if (Dvalue < 0)
            {
                scaleFactor = 1 + Dvalue;
                offset = 0.5f * (1 - scaleFactor);
            }
            RescaleOp rescale = new RescaleOp(
                new float[]{ scaleFactor, scaleFactor, scaleFactor, 1 }, 
                new float[]{ offset * 255.0f, offset * 255.0f, offset * 255.0f, 0 }, null);
 
            return rescale.filter(img, null);
        }

Den richtigen Kontrast, der anhand der Luminanz (Helligkeit) berechnet und auch am Ende ein Schwarz-Weiß-Bild liefert, beeinflussen
Java:
private BufferedImage adopt_LuminanceContrast(BufferedImage imgSrc, int contrast)
        {
        	BufferedImage imgDst = new BufferedImage(size.width, size.height, BufferedImage.TYPE_4BYTE_ABGR);
        	
        	Raster src = imgSrc.getRaster();
        	WritableRaster dst = imgDst.getRaster();

            int sX = 0;
            int sY = 0;
        	int absValue = Math.abs(contrast);
        	int brightness = 0;
        	
            int[] RGBA = null;
            int luminance;
            float[] YUV = new float[3];
            int[][] calculations = new int[256][256];
            
            int multiply;
            int divide;
            
            if (contrast < 0) {
				multiply = contrast + 100;
				divide = 100;
			} else if (contrast > 0) {
				multiply = 100;
				divide = 100 - contrast;
			} else {
				multiply = 1;
				divide = 1;
			}
            
            if (divide == 0) {
				for (int lum = 0; lum < 256; lum++) {
					for (int val = 0; val < 256; val++) {
						if ((lum + brightness) < 128)
							calculations[lum][val] = 0;
						else
							calculations[lum][val] = 255;
					}
				}
			} else if (divide == 100) {
				for (int lum = 0; lum < 256; lum++) {
					int shift = (lum - 127) * multiply / divide + 127 - lum + brightness;
					for (int val = 0; val < 256; val++) {
						calculations[lum][val] = correctColorBand(val + shift);
					}
				}
			} else {
				for (int lum = 0; lum < 256; lum++) {
					int shift = (lum - 127 + brightness) * multiply / divide + 127 - lum;
					for (int val = 0; val < 256; val++) {
						calculations[lum][val] = correctColorBand(val + shift);
					}
				}
			}
            
            for (int y=0; y < size.height; y++, sY++) {
            	sX = 0;
            	for (int x = 0; x < size.width; x++, sX++) {
                    RGBA = src.getPixel(sX, sY, RGBA);
                    luminance = Math.round(0.299F * RGBA[0] + 0.587F * RGBA[1] + 0.114F * RGBA[2]);
                    RGBA[0] = calculations[luminance][RGBA[0]];
                    RGBA[1] = calculations[luminance][RGBA[1]];
                    RGBA[2] = calculations[luminance][RGBA[2]];
                    dst.setPixel(sX, sY, RGBA);
            	}
            }
        return imgDes;
    }


Gruß, Thomas
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Kontrast zweier Farben vergleichen AWT, Swing, JavaFX & SWT 5
M Image: Kontrast, Helligkeit und Farben ändern? AWT, Swing, JavaFX & SWT 15
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
S Swing zu einem Datum Tage addieren/subtrahieren AWT, Swing, JavaFX & SWT 6
E Swing Mausposition auf einem JFrame erkennen AWT, Swing, JavaFX & SWT 5
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
N Nur bei einem Textfiled Nullpointerexception bei getText() AWT, Swing, JavaFX & SWT 1
H JComobox in einem JPopupNeu AWT, Swing, JavaFX & SWT 7
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Mit einem Button einen anderen Button Triggern AWT, Swing, JavaFX & SWT 3
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
T Setzen von der Schriftgröße bei einem Shell AWT, Swing, JavaFX & SWT 15
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
D JavaFX Ein Parameter von einem Stage(GUI) zu einem anderen übergeben AWT, Swing, JavaFX & SWT 6
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
S JavaFX Variablen in einem FXML File verwenden AWT, Swing, JavaFX & SWT 8
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
F JavaFX Aktuelle Zeit in einem TextField anzeigen AWT, Swing, JavaFX & SWT 7
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
F JavaFX PNG aus einem resource Ordner laden AWT, Swing, JavaFX & SWT 8
F JavaFX Checken ob der Input einem festgelegten Format gleicht AWT, Swing, JavaFX & SWT 7
B JavaFX Bilder in einem Gewissen bereich halten AWT, Swing, JavaFX & SWT 1
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
Q-bert Doppelclick auf einem List item AWT, Swing, JavaFX & SWT 9
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
C SWT autosize bei gc.drawString() auf einem Label AWT, Swing, JavaFX & SWT 7
R Farbe zu einem Eckpunkt generieren AWT, Swing, JavaFX & SWT 2
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
F abgeleitete Panels von einem ContentPanel AWT, Swing, JavaFX & SWT 4
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
H Hintergrundbild in einem Programm AWT, Swing, JavaFX & SWT 4
F RGB-Werte aus einem String einlesen AWT, Swing, JavaFX & SWT 26
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
Y Darstellung und MouseHover bei bestimmten Wörtern in einem String AWT, Swing, JavaFX & SWT 2
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
H Geld pro Sekunde in einem Clickerspiel AWT, Swing, JavaFX & SWT 4
Java_RY wie kann ich auf JButtons in einem JPanel zugreifen AWT, Swing, JavaFX & SWT 3
F Zeichnung einem JPanel im Layoutmanager zuweisen AWT, Swing, JavaFX & SWT 3
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
F JavaFX JavaFX - Hintergrundmusik in einem seperatem Task/Service AWT, Swing, JavaFX & SWT 6
D JavaFX Gesetzte Variable in einem Controller im Controller laden AWT, Swing, JavaFX & SWT 1
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
T Swing JTable Zeile mit ausgelesenen Werten mit Hilfe von einem Button hinzufügen AWT, Swing, JavaFX & SWT 1
E JavaFX MenuBar und ToolBar zu einem Bereich AWT, Swing, JavaFX & SWT 3
Y Kann man Buttons in einem JFrame rund machen ? AWT, Swing, JavaFX & SWT 2
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Dreieck in einem Kreis??? AWT, Swing, JavaFX & SWT 1
F Swing Image einem Button hinzufügen AWT, Swing, JavaFX & SWT 5
J Swing unterschiedliche Inhalte in einem JFrame AWT, Swing, JavaFX & SWT 3
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
S Punkt finden der in einem Shape liegt..? AWT, Swing, JavaFX & SWT 11
A Swing Externe Klassen aufrufen und in einem bereits vorhandenen Container einfügen AWT, Swing, JavaFX & SWT 0
P LayoutManager TextField.setSize(); in einem FlowLayout AWT, Swing, JavaFX & SWT 3
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Java FX Innerhalb einem FXML-Dialog weiteren FXML-Dialog einblenden AWT, Swing, JavaFX & SWT 3
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
D Swing &MouseListener in einem JFrame, sinnig? AWT, Swing, JavaFX & SWT 11
J RadioButton-Gruppe in Kombination mit einem Button AWT, Swing, JavaFX & SWT 6
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
E Alles in einem Fenster AWT, Swing, JavaFX & SWT 5
F SWT Problem mit Tabelle und Combobox in einem Wizard AWT, Swing, JavaFX & SWT 5
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben