Bilder speichern

Status
Nicht offen für weitere Antworten.

Kerberus

Bekanntes Mitglied
Ich speichere Bilder mit dem Packet javax.imageio.
Leider habe ich festgestellt, dass wenn ich ein Bild speichere, dass ich dann Bildverluste habe. Gibt es eine Möglichkeit Bilder zu speichern ohne, dass ich nur den geringsten Qualitätsverlust habe? Dies wäre sehr wichtig für micht, da ich Grafiken erstellen muss, die auf den Pixel genau sind. Kennt jemand eine Möglichkeit, dies zu realisieren?
 
B

Beni

Gast
Der write-Methode von ImageIO kannst du als Format "png" übergeben. Das PNG ("Portable Network Graphics" oder so ähnlich) wird komprimiert, aber ohne Datenverlust.
 

Kerberus

Bekanntes Mitglied
Nun, ich wende die Methode write() an:

Code:
File file = new File(title);
ImageIO.write(buffImage, "png", file);

Allerdings, wenn ich zum Beispiel auf einem 4*4 Pixel grossen Bild zeichne, einen schwarzen, ein Pixel breiten Strich, dann einen ein Pixel breiten weissen, dann wieder einen schwarzen und wieder einen weissen, so erhalte ich immer ein Bild, das grau ist. Ist das normal?
(Es ist wichtig, dass ich ein Pixel genaue Graphiken zeichnen kann, ohne, dass mir Java die Farben vermischst.)
 
B

Beni

Gast
Das Problem hatte ich noch nie.

Kannst du mal einen Codeteil posten, der das Problem herstellt? Würde das ganz gerne mal ausprobieren, und bin zu faul selbst ein Beispiel zu schreiben (das dann möglicherweise doch richtig funktioniert).
 

Kerberus

Bekanntes Mitglied
Also, meine erste Klasse, der ImageExporter, definiert eigentlich einige Funktionen, die ich später für mein Programm brauche. Die Klasse Test soll nur die Funktionalität von ImageExporter überprüfen.

ImageExporter:
Code:
import java.awt.image.*;
import java.awt.*;
import java.io.*;
import javax.imageio.*;

public class ImageExporter
{
    public ImageExporter()
    {
    }

    public boolean export(BufferedImage buffImage, String title)
    {
        
        title = title + ".png";
        
        try
        {
            File file = new File(title);
            ImageIO.write(buffImage, "png", file);
        }
        catch(IOException e)
        {
            return false;
        }
        
        return true;
    }      
    
    public BufferedImage advancedScale(BufferedImage buffImage, int scale_x, int scale_y, int type_of_scale)
    {
        BufferedImage internBufferedImage = new BufferedImage(scale_x, scale_y, BufferedImage.TYPE_INT_RGB);
        
        Image internScaleImage = buffImage.getScaledInstance(scale_x, scale_y, type_of_scale);
        
        Graphics2D internGraphics2D = internBufferedImage.createGraphics();
        
        internGraphics2D.drawImage(internScaleImage,0,0,new Frame());
        internGraphics2D.dispose();
        
        return internBufferedImage;
    }
    
    public BufferedImage createDiffractionPattern(BufferedImage buffImage, int anzahl_in_x, int anzahl_in_y, int scale_x, int scale_y, int type_of_scale)
    {
        BufferedImage pattern = new BufferedImage((anzahl_in_x * scale_x), (anzahl_in_y * scale_y), BufferedImage.TYPE_INT_RGB);
        
        BufferedImage scaledVersion = this.advancedScale(buffImage, scale_x, scale_y, type_of_scale);
        
        Graphics2D d = pattern.createGraphics();
        
        for(int x = 0; x < (anzahl_in_x * scale_x); x = x + scale_x)
        {
            for(int y = 0; y < (anzahl_in_y * scale_y); y = y + scale_y)
            {
                d.drawImage(scaledVersion, x, y, new Frame());
            }
        }
        
        d.dispose();
        
        return pattern;
    }
}

Test:
Code:
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.*;
import java.io.*;

public class Test
{
    public static void main(String[] args)
    {
        BufferedImage img = new BufferedImage(4, 4, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = img.createGraphics();
        
        g.setColor(new Color(255,255,255));
        g.fillRect(0,0,4,4);
        
        g.setColor(new Color(0,0,0));
        g.fillRect(0,0,1,4);
        g.fillRect(3,0,1,4);
        
        g.dispose();
 
        ImageExporter exporter = new ImageExporter();
        
        BufferedImage pattern = exporter.createDiffractionPattern(img, 8, 8, 1, 1, Image.SCALE_SMOOTH);
        
        boolean erfolgt = exporter.export(pattern, "test");
        
        if(erfolgt)
        {
            System.out.println("Export abgeschlossen");
        }
        else
        {
            System.out.println("Fehler");
        }
    }
}

Die Methode createDiffractionPattern parketiert eine Fläche, respektive erstellt diese. Später drucke ich diese dann aus und verwende sie in einem physikalischen Experiment.

(Ich schreibe dieses Programm als Teil meiner Maturarbeit. Ich habe nun schon einige Testläufe mit dem Code gemacht und nie die erwünschten Ergebnisse erzielt und weiss einfach nicht, wo sich der Fehler befinden könnte. Hoffentlich entdeckst du ihn, sonst hab ich ein kleines Problem ;-) )

Wünsche noch einen schönen Abend.
Sir MacKerberus
 
B

Beni

Gast
Das Bild wird richtig gespeichert, es wird aber grau gezeichnet.

Code:
        BufferedImage pattern = exporter.createDiffractionPattern(img, 80, 80, 3, 3, Image.SCALE_SMOOTH);
       
        JFrame frame = new JFrame();
        JLabel label = new JLabel();
        label.setIcon( new ImageIcon( pattern ) );
        frame.getContentPane().add( label );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setBounds( 200, 200, 200, 200 );
        frame.setVisible( true );

Diese Zeile ist interessant, je grösser man den 3. und den 4. Parameter macht, desto mehr sieht man von den Linien. Insbesondere müssen die Werte offenbar >= 3 sein.
Code:
exporter.createDiffractionPattern(img, 80, 80, 3, 3, Image.SCALE_SMOOTH);

Beni



P.S. jedes mal ein neues Frame zu erstellen ist ein bisschen übertrieben.
Code:
d.drawImage(scaledVersion, x, y, new Frame());

Viel Ressourcenschonender ist diese Version:
Code:
        Graphics2D d = pattern.createGraphics();
       
        ImageObserver obs = new ImageObserver(){
			public boolean imageUpdate( Image img, int infoflags, int x, int y,
					int width, int height ) {
				return false;
			}
        };
        
        for(int x = 0; x < (anzahl_in_x * scale_x); x = x + scale_x)
        {
            for(int y = 0; y < (anzahl_in_y * scale_y); y = y + scale_y)
            {
                d.drawImage(scaledVersion, x, y, obs);
            }
        }
 

Kerberus

Bekanntes Mitglied
Danke, für diese Version.
Könnte es sein, dass die Formate png und jpg eine Art Unschärfe besitzen?

Gibt es eigentlich auch eine Möglichkeit im .tif Format zu speichern. Soweit ich weiss ist das so ziemlich das einzige das keine Komprimierung hat, sofern man diese nicht wünscht.

Könnte mir nur noch vorstellen, dass ScaleSmooth diesen Fehler auslöst. Werde den Code mal abändern. Mal sehen, was dabei rauskommt.
 

Kerberus

Bekanntes Mitglied
Ich stosse immer wieder auf verblüfende Sachen.
Habe mir mal Jimi gesogen und "installiert". Damit sollte ich nun theoretisch Bilder in praktisch allen Formaten speichern können. Wenn ich nun ein Bild öffne, das ich mit Photoshop erstellt habe und das eine Auflösung von 300 DPI besitzt, und es dann wieder speichere, zum Beispiel als JPG, so hat das Bild danach eine Auflösung von 72 DPI.
 

Kerberus

Bekanntes Mitglied
@Beni: Habe nun meinen ImageExporter neu geschrieben unter der Verwendung von Jimi. Nun treten keine Fehler mehr auf und es ist auch egal, wie weit ich runter skaliere.
Das mit der Unschärfe konnte ich auch lösen. Ist mehr ein mathematisches als technisches Problem.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
Z Bilder speichern AWT, Swing, JavaFX & SWT 6
G bilder speichern AWT, Swing, JavaFX & SWT 2
A Bilder speichern AWT, Swing, JavaFX & SWT 7
S Bilder speichern AWT, Swing, JavaFX & SWT 7
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
F Bilder zu ausführbarer Jar-Datei hinzufügen AWT, Swing, JavaFX & SWT 5
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
G Bilder in javafx Project AWT, Swing, JavaFX & SWT 11
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Kirby.exe Bilder in GUI einfügen AWT, Swing, JavaFX & SWT 8
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
L Bilder werden in exportierter Datei nicht geladen AWT, Swing, JavaFX & SWT 6
C Bilder so einbinden, dass sie sich ändern AWT, Swing, JavaFX & SWT 6
J Bilder aus dem SceneBuilder werden in der Jar nicht dargestellt AWT, Swing, JavaFX & SWT 4
TheWhiteShadow JavaFX Bilder werden ungewollt Skaliert AWT, Swing, JavaFX & SWT 1
B JavaFX Bilder in einem Gewissen bereich halten AWT, Swing, JavaFX & SWT 1
J Bilder proportional verkleiner AWT, Swing, JavaFX & SWT 12
E Bilder skalieren AWT, Swing, JavaFX & SWT 4
DaCrazyJavaExpert Swing Bilder überlagern AWT, Swing, JavaFX & SWT 19
A Bilder als Hintergrund AWT, Swing, JavaFX & SWT 2
@SupressWarnings() JavaFX Bilder in executable jar laden AWT, Swing, JavaFX & SWT 5
Sugan JavaFX Bilder drucken AWT, Swing, JavaFX & SWT 0
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
Sugan Java FX Verzeichnisüberwachung -> Bilder auf GUI anzeigen AWT, Swing, JavaFX & SWT 4
E AWT Bilder als "Array" abspeichern. AWT, Swing, JavaFX & SWT 4
MrSnake Bilder aus Unterordner einfügen AWT, Swing, JavaFX & SWT 2
I 2D-Grafik Bilder Eingefügt, button jetzt im Hintergrund AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
thet1983 JTable Bilder AWT, Swing, JavaFX & SWT 6
GenerationLost Bilder an bestimmten Platz einfügen/Objekte visualisieren AWT, Swing, JavaFX & SWT 1
F Bilder in jFrame einfügen AWT, Swing, JavaFX & SWT 3
I Swing Bilder werden nach Export nicht angezeigt AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Bilder anzeigen AWT, Swing, JavaFX & SWT 4
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
vodkaz JFrame,Bilder und Zeitverzögerung AWT, Swing, JavaFX & SWT 2
A Swing Bilder werden nicht angezeigt AWT, Swing, JavaFX & SWT 3
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
Xbody 2D-Grafik JavaFX Bilder transformieren AWT, Swing, JavaFX & SWT 2
C 2D-Grafik Steganographie - Verschlüsselung von Dateien in Bildern - Bilder zeigen schwarze Rechtecke AWT, Swing, JavaFX & SWT 13
P Durch Bilder Scrollen AWT, Swing, JavaFX & SWT 2
F Bilder werden nicht in's Array geladen AWT, Swing, JavaFX & SWT 4
K Bilder übereinanderlegen AWT, Swing, JavaFX & SWT 11
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
Karuka 2D-Grafik Bilder in GridLayout einfügen AWT, Swing, JavaFX & SWT 7
J Bilder in ausführbare jar einbinden AWT, Swing, JavaFX & SWT 7
J Swing Bilder anzeigen in Gridlayout AWT, Swing, JavaFX & SWT 11
H 2D-Grafik Bilder laden ist nicht zuverlässig AWT, Swing, JavaFX & SWT 3
F Bilder ineinander kopieren AWT, Swing, JavaFX & SWT 3
P Bilder verkleinern AWT, Swing, JavaFX & SWT 2
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
Furtano AWT Skalierung mehrerer Bilder / Histogramme im Fenster AWT, Swing, JavaFX & SWT 4
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
T 2D-Grafik Statisches Hintergrundbild, dynamische Bilder drüber AWT, Swing, JavaFX & SWT 2
C Zwei Bilder übereinander legen AWT, Swing, JavaFX & SWT 1
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
S Flickr Bilder in Gui Oberfläche AWT, Swing, JavaFX & SWT 21
L Bilder im JPanel als Hintergrund - Swing AWT, Swing, JavaFX & SWT 2
K Bilder nacheinander einfügen AWT, Swing, JavaFX & SWT 3
H Bilder auf Buttons per Klick tauschen ( Puzzle ) AWT, Swing, JavaFX & SWT 8
H Bilder in Array zufällig anordnen AWT, Swing, JavaFX & SWT 4
P 2D-Grafik Viele Bilder zu einem Video AWT, Swing, JavaFX & SWT 3
J Vergleicher zweier Bilder AWT, Swing, JavaFX & SWT 2
C zwei Bilder nacheinander anzeigen AWT, Swing, JavaFX & SWT 2
L Swing Bilder über andere Bilder laden AWT, Swing, JavaFX & SWT 3
J Bilder überlappen AWT, Swing, JavaFX & SWT 18
P Bilder werden nach Änderung nicht angezeigt AWT, Swing, JavaFX & SWT 15
3 2D-Grafik Rechtecke auf Bilder legen und auslesen AWT, Swing, JavaFX & SWT 4
M Mehrere Bilder auf einmal anzeigen AWT, Swing, JavaFX & SWT 9
P Swing html mit bilder drin AWT, Swing, JavaFX & SWT 12
F Nicht alle Bilder werden angezeigt AWT, Swing, JavaFX & SWT 2
E Bilder auf JFrame AWT, Swing, JavaFX & SWT 7
R Bilder über URL einfügen AWT, Swing, JavaFX & SWT 4
F Applet zeigt Bilder nicht an AWT, Swing, JavaFX & SWT 5
M FileChooser Bilder auswählen AWT, Swing, JavaFX & SWT 8
G Swing Bilder zeichnen AWT, Swing, JavaFX & SWT 28
L Swing Bilder im Icons-Ordner AWT, Swing, JavaFX & SWT 4
U Bilder in Jar werden nicht gefunden AWT, Swing, JavaFX & SWT 5
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
A Bilder vergleichen AWT, Swing, JavaFX & SWT 4
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
E AWT Bilder und Java AWT, Swing, JavaFX & SWT 11
P Bilder einfügen AWT, Swing, JavaFX & SWT 4
D Swing JEditorPane mit HTML aber ohne Bilder AWT, Swing, JavaFX & SWT 3
S Swing Kleine Bilder in Panel einfügen AWT, Swing, JavaFX & SWT 13
A AWT Bilder als Link verwenden? AWT, Swing, JavaFX & SWT 11
T SWT Wie Bilder aus JAR-Dateien einbinden? AWT, Swing, JavaFX & SWT 12
S Bilder aus der Google Book Search API auslesen AWT, Swing, JavaFX & SWT 3
J Bilder in JScrollPane zentrieren AWT, Swing, JavaFX & SWT 5
M Bilder in einem Textfeld darstellen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben