Zwischenablage lesen und speichern; Image -> Transferable

Status
Nicht offen für weitere Antworten.

norman

Top Contributor
Hallo zusammen,

welche Möglichkeiten habe ich um einen existierenden screenshot in java einzulesen?
Code:
	public void foo() throws UnsupportedFlavorException, IOException {
		Toolkit t = null;
		Image bild;
		
		Clipboard  clip = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable tr = clip.getContents(null);
		
        DataFlavor[] dataFlavor = tr.getTransferDataFlavors();
        DataFlavor flavor = dataFlavor[1];
        Object content = tr.getTransferData(flavor);
        
        bild = (Image) content; // geht natürlich nicht => ClassCastException

	}

Danke schonmal :)
 

Sky

Top Contributor
Code:
    Object content = tr.getTransferData(DataFlavor.imageFlavor);
    bild = (Image) content;
 

norman

Top Contributor
danke, das funktioniert soweit.

will ich das ganze jedoch speichern, wird nur ein komplett schwarzes bild erstellt/ gespeichert. Schätze das liegt an dem BufferedImage, aber die abmessungen stimmen. ???:L
Code:
		Clipboard  clip = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable tr = clip.getContents(null);
        Object content = tr.getTransferData(DataFlavor.imageFlavor);
        bild = (Image) content;

        bi = new BufferedImage(bild.getWidth(null),bild.getHeight(null),BufferedImage.TYPE_INT_RGB);
        ImageIO.write(bi, "jpeg", bildDatei);
 

Sky

Top Contributor
du erstellst ein BufferedImage, welches so hoch und so weit ist, wie das Image... dass reicht aber nicht: Du musst das Bild schon noch auf dein BufferedImage 'malen'
 

norman

Top Contributor
hm..eigentlich logisch :roll:

mache es dann jetzt so:
Code:
	public void fuelleDatei() throws IOException {      
        bi = new BufferedImage(bild.getWidth(null), bild.getHeight(null), BufferedImage.TYPE_INT_RGB);
                
        Graphics2D g2d = bi.createGraphics();
        g2d.drawImage(bild, 0, 0, null);
        g2d.dispose();

        ImageIO.write(bi, "bmp", bildDatei);		
	}
 

norman

Top Contributor
hm..ich habe doch noch mal eine Frage:

wenn ich das Bild bearbeite habe möchte ich es wieder in die Zwischenablage zurückbringen..etwa so:
Code:
		Clipboard  clip = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable tr = (Transferable) bild; // ClassCastException
		clip.setContents(tr, null);

das Bild existiert zu dem Zeitpunkt als File, Image und BufferedImage. Aber nichts davon kann zu einem Transferable gecastet werden -> wie komme ich hier zum erfolg?

Grüße
 

norman

Top Contributor
habe dazu den folgenden code gefunden, aber damit wird nur aus einem JComponent ein Transferable erstellt.
Code:
  public Transferable createTransferable(JComponent comp) {
    // Clear
    source = null;
    image = null;

    if (comp instanceof JLabel) {
      JLabel label = (JLabel) comp;
      Icon icon = label.getIcon();
      if (icon instanceof ImageIcon) {
        image = ((ImageIcon) icon).getImage();
        source = label;
        return this;
      }
    }
    return null;
  }

Kann mir keiner weiter helfen, wie ich sowas aus einem Image/ BufferedImage/ File bekommen kann? :-(
 

Sky

Top Contributor
norman hat gesagt.:
habe dazu den folgenden code gefunden, aber damit wird nur aus einem JComponent ein Transferable erstellt.
Code:
  public Transferable createTransferable(JComponent comp) {.....
zu welcher Klasse gehört das ? Es sieht so aus, als wären die Member-Variablen "source" und "image" wichtig.

norman hat gesagt.:
Code:
Transferable tr = (Transferable) bild; // ClassCastException
Nur mal so am Rande: Wenn ein Transferable erwartet wird und bild keines ist, dann wird das nie klappen! Wenn ein Transferable erwartet wird, so musst Du entweder schon eins haben oder eines erzeugen! Und: Transferable ist ein Interface, welches man 'einfach' implementieren kann.
 

norman

Top Contributor
Sky hat gesagt.:
norman hat gesagt.:
Code:
Transferable tr = (Transferable) bild; // ClassCastException
Nur mal so am Rande: Wenn ein Transferable erwartet wird und bild keines ist, dann wird das nie klappen! Wenn ein Transferable erwartet wird, so musst Du entweder schon eins haben oder eines erzeugen! Und: Transferable ist ein Interface, welches man 'einfach' implementieren kann.

Also muss ich eine Klasse schreiben, die Transferable implementiert, ja. Das waren auch erst meine Gedanken, fande das nur recht umständlich.
Jedenfalls sieht das das dann bei mir so aus:

Code:
	public void neuesBildInClipboard() {
		TransferableImage ti = new TransferableImage(bild);
		Clipboard  clip = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable tr = ti;
		clip.setContents(tr, null);
	}
und
Code:
// imports
public class TransferableImage extends Image implements Transferable {

	Image bild;
	
	public TransferableImage(Image bild) {
		super();
		this.bild = bild;
	}

	public int getWidth(ImageObserver observer) {
		return bild.getWidth(observer);
	}

	public int getHeight(ImageObserver observer) {
		return bild.getHeight(observer);
	}

	public ImageProducer getSource() {
		return null;
	}

	public Graphics getGraphics() {
		return null;
	}

	public Object getProperty(String name, ImageObserver observer) {
		return null;
	}

	public void flush() { }

	public DataFlavor[] getTransferDataFlavors() {
		DataFlavor[] df = new DataFlavor[1];
		df[0] = DataFlavor.imageFlavor;
		return df;
	}

	public boolean isDataFlavorSupported(DataFlavor flavor) {
		return ( flavor.equals(DataFlavor.imageFlavor))? true : false;
	}

	public Object getTransferData(DataFlavor flavor)
			throws UnsupportedFlavorException, IOException {
		return null;
	}
}
das Problem? das programm läuft soweit problemlos durch, aber die zwischenablage ist nachher leer.
(ich kann nichts in paint einfügen; starte ich das programm erneut kommt ein fehler, weil kein bild im clipboard)

=> woher weiß ich, wie ich zB getGraphics() überschreiben muss? (da liegt ja vermutlich das problem?)
 

Sky

Top Contributor
Versuchs mal so:



Code:
class ImageTransferable
    implements Transferable {

  Image image;

  public ImageTransferable(Image image) {
    this.image = image;
  }

  public DataFlavor[] getTransferDataFlavors() {
    return new DataFlavor[] {
        DataFlavor.imageFlavor};
  }

  public boolean isDataFlavorSupported(DataFlavor flavor) {
    return flavor.equals(DataFlavor.imageFlavor);
  }

  public Object getTransferData(DataFlavor flavor) throws
      UnsupportedFlavorException, IOException {
    return image;
  }

}
 

norman

Top Contributor
danke..das sieht etwas einfacher aus. trotzdem funktioniert es nicht. wenn ich ein Objekt von ImageTranserfable ins Clipboard schreiben will, passiert nichts (außer, dass das clipboard wohl leer wird; rechenauslastun 0%, aber das programm kommt nicht zum ende).
ich poste mal den kompletten code, evtl. ist der fehler ja an einer anderen stelle?

Code:
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;

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

public class Bild extends JFrame {
	private static final long serialVersionUID = 7713300478208924716L;
	
	private File bildDatei;     //     C:\temp\report.png
	private Image bild;			// screenshot
	private Image cropImage;	// zurechtgeschnittenes Bild
	
	JOptionPane jop = new JOptionPane();
	
	public void foo() {
			
        this.bild = getBildInClipboard();
        erstelleDatei();
        this.cropImage = makeCropImage();     
        ladeBildInDatei(this.cropImage);
        setBildInClipboard(this.bild); 			// funktioniert
//        setBildInClipboard(this.cropImage);	// funzt nicht
        
        jop.showMessageDialog(this, "Der Screenshot wurde bearbeitet und unter C:\\temp\\report.png gespeichert.");
		System.exit(0);
	}
	
	public Image getBildInClipboard() {
		Clipboard  clip = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable tr = clip.getContents(null);
        Object content;
		try {
			content = tr.getTransferData(DataFlavor.imageFlavor);
			return (Image) content;
		} catch (UnsupportedFlavorException e) {
			jop.showMessageDialog(this, "Es ist kein Bild in der Zwischenablage! \n" + e);
			System.exit(0);
		} catch (IOException e) {
			jop.showMessageDialog(this,e);
			System.exit(0);
		}
		return null;
	}
	
	public void setBildInClipboard(Image img) {
		ImageTransferable it = new ImageTransferable(img);		
		Clipboard  clip = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable tr = it;
		clip.setContents(tr, null);
	}
	
	public Image makeCropImage() {	
		ImageFilter cropFilter = new CropImageFilter( 100, 135, 1100, 800 );
        return createImage( new FilteredImageSource(bild.getSource(),cropFilter) );
	}
		
	
	public void ladeBildInDatei(Image img) {      
        BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
                
        Graphics2D g2d = bi.createGraphics();
        g2d.drawImage(img, 0, 0, null); 		// das bild in das bi zeichnen
        g2d.dispose();

        try {
			ImageIO.write(bi, "png", bildDatei); // DATEIFORMAT	
		} catch (IOException e) {
			jop.showMessageDialog(this,e);
			System.exit(0);
		}		
	}
	
	public void erstelleDatei() {
		File bildDir = new File("C:\\temp\\");
		if (!bildDir.exists()) {
			bildDir.mkdir();
		}
		
		this.bildDatei = new File("C:\\temp\\report.png");  //DATEIFORMAT
		if (this.bildDatei.exists()) {
			this.bildDatei.delete();
		} 
		try {
			this.bildDatei.createNewFile();
		} catch (IOException e) {
			jop.showMessageDialog(this,e);
			System.exit(0);
		}
	}
	
	public static void main(String[] args) {
		Bild b = new Bild();
		b.foo();		
	}
}
 

norman

Top Contributor
Code:
public static void main(String[] args) {
   nochmalAufDasThemaAufmerksamMachen();
}
[schild=12 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]HILFE[/schild]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
T Auslesen der Zwischenablage - Optimierung Geschwindigkeit Java Basics - Anfänger-Themen 6
G Text aus TextArea in Zwischenablage kopieren Java Basics - Anfänger-Themen 6
D Zwischenablage Java Basics - Anfänger-Themen 11
J System.out - Zwischenablage Java Basics - Anfänger-Themen 5
D In Zwischenablage kopieren Java Basics - Anfänger-Themen 8
S Zwischenablage in String kopieren Java Basics - Anfänger-Themen 3
G Einfügen aus Zwischenablage - alles doppelt? Java Basics - Anfänger-Themen 2
M Zwischenablage Java Basics - Anfänger-Themen 3
J Automatisches Auslesen der Zwischenablage plattformübergreif Java Basics - Anfänger-Themen 3
M Inhalt einer TextArea in die Zwischenablage kopieren Java Basics - Anfänger-Themen 2
J Bild der Zwischenablage abspeichern Java Basics - Anfänger-Themen 7
D Zwischenablage von Windows Java Basics - Anfänger-Themen 4
G Text aus Zwischenablage einfügen Java Basics - Anfänger-Themen 6
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
W Timestamp lesen Java Basics - Anfänger-Themen 6
J Dateien lesen und schreiben Java Basics - Anfänger-Themen 5
F MS365 Kalender lesen Java Basics - Anfänger-Themen 5
Robin Gentele XML von Webserver lesen und ausgeben Java Basics - Anfänger-Themen 5
H Scripte oder Programmcode aus Datei lesen? Java Basics - Anfänger-Themen 5
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
C Fehlermeldungen lesen Java Basics - Anfänger-Themen 2
S Allgemeine Java Codes lesen und verstehen Java Basics - Anfänger-Themen 7
NeoLexx Datenströme Lesen und Schreiben einer Textdatei Java Basics - Anfänger-Themen 2
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
T Klassen Den Wert aus Array lesen lassen Java Basics - Anfänger-Themen 12
J Lesen und schreiben in eine Datei(Anfänger- Dateizugriffe) Java Basics - Anfänger-Themen 3
S JSON Datei schreiben und lesen Java Basics - Anfänger-Themen 3
S Java Array Länge aus anderer Klasse lesen Java Basics - Anfänger-Themen 1
G Excle datei aus resources folder finden und lesen Java Basics - Anfänger-Themen 5
J Datei aus Projektfolder lesen Java Basics - Anfänger-Themen 12
H Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen Java Basics - Anfänger-Themen 10
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
S Tastatur input lesen Java Basics - Anfänger-Themen 7
S Mit FileReader lesen, in ArrayList speichern Java Basics - Anfänger-Themen 4
B Aus Datei lesen Java Basics - Anfänger-Themen 23
B Aus Datei lesen Java Basics - Anfänger-Themen 0
deatzi Wert aus anderer Klasse lesen Java Basics - Anfänger-Themen 7
W Wie lasse ich meine Ausgabe nach dem Lesen verschwinden ? Java Basics - Anfänger-Themen 1
A JSON Lesen und Schreiben. Java Basics - Anfänger-Themen 3
S Daten lesen und speichern Java Basics - Anfänger-Themen 26
C Input/Output Datei aus Startverzeichnis lesen Java Basics - Anfänger-Themen 6
amazinglife77 Input/Output Lesen/Schreiben Properties: in eclipse geht, als JAR nicht Java Basics - Anfänger-Themen 4
G Input/Output Aus txt-Datei lesen, aus Ordner Java Basics - Anfänger-Themen 1
S BufferedReader nächste Zeile lesen Java Basics - Anfänger-Themen 4
sourcecorn Werte aus einem File lesen Java Basics - Anfänger-Themen 6
G Jar-Archiv zum Lesen einer Konfigurationsdatei Java Basics - Anfänger-Themen 9
MaxG. Input/Output Datei lesen Java Basics - Anfänger-Themen 3
Hacer Quellcode lesen Java Basics - Anfänger-Themen 13
H Aus wav-datei lesen und in neue wav-datei speichern Java Basics - Anfänger-Themen 10
N Lesen eines files mit FILES.lines Java Basics - Anfänger-Themen 11
A Private Attribut aus fremder Klasse lesen ? Java Basics - Anfänger-Themen 19
R Ab einer bestimmten Zeile lesen Java Basics - Anfänger-Themen 3
P vokale konsonanten ziffern satzzeichen aus string lesen. hab kiene ahnung Java Basics - Anfänger-Themen 10
A textfeldwerte aus array lesen Java Basics - Anfänger-Themen 27
K Classpath Lesen von Property-File Java Basics - Anfänger-Themen 1
D Methoden Array aus Datei lesen und weitergeben? Java Basics - Anfänger-Themen 7
T 'Nix' aus Textdokument lesen Java Basics - Anfänger-Themen 11
G tga Datei lesen und in eine matrix umwandeln Java Basics - Anfänger-Themen 1
F Input/Output Dateien lesen/schreiben Java Basics - Anfänger-Themen 1
E lesen csv file column by column Java Basics - Anfänger-Themen 10
G Bis zu einem bestimmten Punkt aus Datei lesen Java Basics - Anfänger-Themen 2
K Mit Scanner aus einer txt Datei lesen und jede Person mit name, vorname, geburtsdatum speichern Java Basics - Anfänger-Themen 5
K Dateien lesen | IndexOutOfBoundsException Java Basics - Anfänger-Themen 2
E Input/Output Property-Datei aus einer Zip lesen in in einer anderen Zip-Datei ist Java Basics - Anfänger-Themen 3
B Input/Output Scanner-Probleme bei String-Lesen Java Basics - Anfänger-Themen 3
I Properties oder Umgebungsvariablen mit ${irgendwas} lesen? Java Basics - Anfänger-Themen 2
D Lesen aus Datei (java.util.NoSuchElementException) Java Basics - Anfänger-Themen 22
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
G Zeile charweise lesen Java Basics - Anfänger-Themen 3
J Aus Datei lesen und ausgeben Java Basics - Anfänger-Themen 4
N Bestimmte Inhalte aus Datei lesen Java Basics - Anfänger-Themen 11
G Datei zeilenweise lesen Java Basics - Anfänger-Themen 19
M Wie sämtliche Schlüssel und Attibutwerte aus einer Propertie Datei lesen? Java Basics - Anfänger-Themen 3
S Compiler-Fehler jOpenDocument Kompelierfehler - ODS Datei lesen Java Basics - Anfänger-Themen 2
C Aus einer Textdatei Zahlen lesen mit Leerzeichen Java Basics - Anfänger-Themen 11
T BufferReader soll datei mehrmals lesen Java Basics - Anfänger-Themen 13
G Leere Zeile lesen Java Basics - Anfänger-Themen 12
F Effizientes Lesen von 65 Datein mit Boolean Werten Java Basics - Anfänger-Themen 6
S Datei aus JAR lesen. Java Basics - Anfänger-Themen 9
G Zeilenweise lesen Java Basics - Anfänger-Themen 17
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2
B Erst lesen: Automatisch Texteingabe bestätigen Java Basics - Anfänger-Themen 6
S Textdatei lesen, Methode gibt nur die letzte Zeile aus. Warum? Java Basics - Anfänger-Themen 5
X Einen Text aus dem Netz lesen?! Java Basics - Anfänger-Themen 3
J Java API lesen lernen Java Basics - Anfänger-Themen 4
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
N Erste Zeile bei BufferedReader doppelt lesen? Java Basics - Anfänger-Themen 2
R Input/Output einzelnes char aus .txt lesen Java Basics - Anfänger-Themen 11
R XML mit unsortierten Nodes lesen Java Basics - Anfänger-Themen 4
M Zahlen aus Array lesen Java Basics - Anfänger-Themen 19
I Methoden zum lesen und speichern von Dateien Java Basics - Anfänger-Themen 2
M Dateien erstellen/ bearbeiten/ lesen Java Basics - Anfänger-Themen 9
M Input/Output Viele short aus Datei lesen und von Little Endian zu Big Endian umwandeln Java Basics - Anfänger-Themen 12
J Lesen von Textdokumenten Java Basics - Anfänger-Themen 3
J Zeichen aus String Array lesen Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben