tutorials.de Buch-Aktion 02/2012
Like Tree5Danke
  • 1 Beitrag von vfl_freak
  • 1 Beitrag von Akeshihiro
  • 1 Beitrag von Bratkartoffel
  • 1 Beitrag von Bratkartoffel
  • 1 Beitrag von Akeshihiro
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
439
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Ich will ein Bild als Hexadezimale Zeichen in eine Datenbank schreiben und von dort mit dem Clienten anzeigen.
    Leider funktioniert es nicht.
    Ich habe es jetzt auf einen kleinen Code gekürzt, der von der HDD ein Bild als bytes ließt, und nach der Umwandlung wieder abspeichert.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    File f = new File("C:\\Dokumente und Einstellungen\\Kai\\Desktop\\planet.png");
    byte[] buffer = new byte[(int) f.length()];
                
    FileInputStream fileInputStream = new FileInputStream(f);
    fileInputStream.read(buffer, 0, buffer.length);
     
    Image img = Toolkit.getDefaultToolkit().createImage(buffer);
    BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
    Graphics g = image.getGraphics();
    g.drawImage(img, 0, 0, null);
    g.dispose();
    ImageIO.write(image, "png", new File("C:\\planet.png"));

    Das Bild ist ca. 5 kb groß, der Output nur 0.4. Erkennt zufällig jemand, was ich da falsch mache?
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.098
    Moin,

    nein, so direkt fällt mir an Deinem Code nix auf!

    Allerdings lese ich an mehreren Stellen div. Bilder direkt als BufferedImage ein :
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    String strImage "...";  // Pfad und Name des Name des Pics
    ...
    BufferedImage myImage = null;
    try 
    {
        myImage = ImageIO.read( new File(strImage) );
    } 
    catch (IOException ex) 
    {}

    Vlt. hilft Dir das ja weiter ...
    Gruß
    Klaus
    Kai008 bedankt sich. 
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    575
    Wenn ich das richtig verstanden hab, dann war das Beispiel nur fiktiv und eigentlich soll das Bild ja aus der Datenbank gelesen werden, da kann man ImageIO.read() vergessen.

    Kai, eigentlich ist das alles soweit ok, einziges Problem ist scheinbar nur, dass du nicht wartest, bis das Bild vollständig erstellt wurde aus den Bytes. Das Bild wird also schon geschrieben noch bevor es überhaupt vollständig ist. Mit MediaTracker kann man das Programm warten lassen, bis das Bild erstellt wurde.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    package de.tutorials.kai008.image;
     
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    public class ImageSample {
        public static void main(String[] args) throws IOException,
                InterruptedException {
            File f = new File("/home/link/Bilder/revy.png");
            byte[] buffer = new byte[(int)f.length()];
     
            FileInputStream fileInputStream = new FileInputStream(f);
            fileInputStream.read(buffer, 0, buffer.length);
     
            Image img = Toolkit.getDefaultToolkit().createImage(buffer);
     
            // Warten, bis das Bild vollständig erstellt wurde
            MediaTracker mt = new MediaTracker(new JPanel());
            mt.addImage(img, 0);
            mt.waitForAll();
     
            BufferedImage image = new BufferedImage(300, 300,
                    BufferedImage.TYPE_INT_ARGB);
            Graphics g = image.getGraphics();
            g.drawImage(img, 0, 0, null);
            g.dispose();
            ImageIO.write(image, "png",
                    new File("/home/link/Bilder/revy_kopie.png"));
        }
    }
    Ansonsten war alles in Ordnung und funktioniert 1a.
    Kai008 bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  4. #4
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Oh, danke.
    Mein erster Ansatz war, den Dateiinhalt einfach nur im Source für dem Test zu kopieren, ist bei ca. 5 kb ja nicht so extrem viel.
    Das funktioniert leider immer noch nicht.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    String planetHexString = "89504E470D0A1A0A0000000D4...";
     
    byte[] b = new BigInteger(planetHexString, 16).toByteArray();
    Image planetImage = Toolkit.getDefaultToolkit().createImage(b);
            
    try
    {
        MediaTracker tracker = new MediaTracker(new Container());
        tracker.addImage(planetImage, 0);
        tracker.waitForID(0);
     
        BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.drawImage(planetImage, 0, 0, null);
        g.dispose();
        ImageIO.write(image, "png", new File("C:\\planet.png"));
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    Der Inhalt ist richtig, habe ihm mit einen Hexeditor in eine leere Datei eingefügt, und der MD5-Fingerprint war 1:1 der Sourcedatei.
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  5. #5
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.298
    Hallo,

    ich denke, dass das Problem bei dir in Zeile 3 liegt
    Code java:
    1
    
    byte[] b = new BigInteger(planetHexString, 16).toByteArray();

    Laut der Java-API dient der von dir verwendete Konstruktor dazu, genau EINEN BigInteger zu erstellen. Denke aber kaum, dass sich deine Datei durch eine Zahl darstellen lässt.

    Gruß
    BK
    Kai008 bedankt sich. 
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  6. #6
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Danke. Ich habe das jetzt mit einer Schleife ersetzt, hat aber leider nichts bebracht.

    Code java:
    1
    2
    3
    
    byte[] b = new byte[planetHexString.length() / 2];
    for (int i = 0, size = b.length; i < size; i++)
        b[i] = (byte) Integer.parseInt(planetHexString.substring(i, i + 2), 16);
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  7. #7
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.298
    Hallo,

    bei der Schleife musst du nicht um 1 Position weiterzählen, sondern um 2, dann sollte das funktionieren

    Code java:
    1
    
    for (int i = 0, size = b.length; i < size; i+=2)

    Gruß
    BK
    Kai008 bedankt sich. 
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  8. #8
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    575
    Hab auch mal was gemacht zum Umrechnen von Hex-Strings zu bytes.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    
    package tests.zahlen;
     
    import java.util.Arrays;
     
    public class HexZahlen {
        public static void main(String[] args) {
            // for(int i = 0; i < 10; i++) {
            // int zahl = (int)(Math.random() * 256);
            // System.out.println(zahl + " => " + Integer.toHexString(zahl));
            // }
     
            // Ergebnis der Schleife:
            // 172 78 26 222 241 114 188 160 82 15
            // AC4E1ADEF172BCA052F
     
            byte[] bytes = parseHexToByte("AC4E1ADEF172BCA052F");
            System.out.println(Arrays.toString(bytes));
     
            // Ergebnis der Probe:
            // [-84, 78, 26, -34, -15, 114, -68, -96, 82, 15]
            // Passt (negative Zahlen (signed byte) umrechnen (zu unsigned byte),
            // dann stimmen die Zahlen überein)
        }
     
        public static byte[] parseHexToByte(String hex) {
            byte[] bytes = null;
     
            String[] hexArr = toHexArray(hex);
            bytes = new byte[hexArr.length];
     
            for(int i = 0; i < hexArr.length; i++) {
                bytes[i] = (byte)Integer.parseInt(hexArr[i], 16);
            }
     
            return bytes;
        }
     
        public static String[] toHexArray(String hex) {
            String[] hexArr = new String[(int)Math.ceil((double)hex.length() / 2)];
     
            for(int i = 0, j = 0; i < hexArr.length; i++, j += 2) {
                if(j + 2 > hex.length()) {
                    hexArr[i] = "0" + hex.charAt(j);
                } else {
                    hexArr[i] = hex.substring(j, j + 2);
                }
            }
     
            return hexArr;
        }
    }
    Geändert von Akeshihiro (08.07.10 um 16:25 Uhr)
    Kai008 bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  9. #9
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Danke, mit Akeshihiros Code hat es endlich doch geklappt.
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 27.03.09, 18:34
  2. Problem beim Klassen erzeugen Hilfe!!
    Von Topia im Forum .NET Grafik und Sound
    Antworten: 3
    Letzter Beitrag: 15.09.08, 11:23
  3. Problem mit dem Austausch eines Images im StatusBar
    Von bsdxroot im Forum .NET Grafik und Sound
    Antworten: 1
    Letzter Beitrag: 17.11.07, 11:06
  4. Speicherleck beim dynamischen Erzeugen eines CDocument
    Von jokey2 im Forum VisualStudio & MFC
    Antworten: 7
    Letzter Beitrag: 12.07.06, 09:30
  5. Byte eines Ordners
    Von Binio im Forum PHP
    Antworten: 3
    Letzter Beitrag: 29.03.05, 16:33