Ergebnis 1 bis 6 von 6
  1. #1
    Wiederbelebt Avatar von Cystasy
    Registriert seit
    08.05.2015
    Beiträge
    670

    Standard BufferedImage Schnell in Int Array packen?

    Hey,
    Ich bin gerade dabei an einem Projekt weiterzuarbeiten, und stehe nun vor einem Problem.. und das sieht folgendermaßen aus:

    1) Ich habe ein BufferedImage dessen RGBA Daten ich in ein Int-Array oder String packen möchte
    2) Das ganze dauert aber pro Bild (ca 200*200px) schon fast ne halbe Minute.. und das ist ziemlich unbrauchbar so.

    Gibt es da eine elegantere Möglichkeit die RGBA Wertes eines ganzen BufferedImage in ein Array / String zu packen (vllt auf einen Schlag ohne for-Schleife)?

    Ich habe noch nicht viel Erfahrung in Java, und mache das deshalb zur Zeit so:

    Code:
     screenRect = new Rectangle(0, 0, 200, 200);
     capture = new Robot().createScreenCapture(screenRect);
     
     int[] rgb = ((DataBufferInt)capture.getRaster().getDataBuffer()).getData();
     String data="";
       
     for(int x=0;x<rgb.length();x++)
     {
       Color c = new Color(rgb[x]);
       data += c.getRed()+","+c.getGreen()+","+c.getBlue()+","+c.getAlpha()+",";
      }
    Jedoch scheint das nicht wirklich ideal zu sein, vorallem da ich in meinem Projekt pro Bild nur max ca 1/2 bis 1 Sekunde brauchen darf damit es nutzbar ist.


    Rauskommen soll am Ende dann sowas wie hier zum Beispiel:

    Code:
    255,0,124,0,12,142, [...] ,255,0,120
    Quasi ein ziemlich langes String oder Array mit den RGBA Daten.
    Hat da jemand Tipps oder Ideen wie ich das ganze anders lösen könnte? Ich denke das die Abfragen von getBlue, getRed, getAlpha usw der entscheidende Faktor sind die das ganze langsam machen - würde das ganze schneller laufen wenn ich das ganze Manuell berechnen lasse ohne das ich diese Funktionen aufrufe? Oder würde das auf das selbe hinauslaufen?

    Ich kenne es von Javascript Canvas das man hier direkt ein Uint8ClampedArray hat auf das man zugreifen kann... da ist die Geschwindigkeit dann auch ziemlich schnell und man kann sogar bei Webcam-Feeds live die Pixel manipulieren ohne Probleme... nur in Java scheint der Zugriff auf die Daten enorm langsam zu sein - weshalb auch immer (mache ich etwas falsch?).

    Kann mir da jemand helfen?^^
    Wäre tierisch genial

    grüße

  2. #2
    Anfänger
    Registriert seit
    28.05.2015
    Beiträge
    6

    Standard AW: BufferedImage Schnell in Int Array packen?

    Was zumindest ein bisschen helfen würde, wäre die Klasse StringBuilder. StringBuilder bietet sich an, wenn man in einer Schleife String konkatenieren will.
    In etwa so:
    Code:
    int[] rgb = ((DataBufferInt) capture.getRaster().getDataBuffer()).getData();
            StringBuilder data = new StringBuilder();
    
    
            for (int x = 0; x < rgb.length; x++) {
                Color c = new Color(rgb[x]);
                data.append(c.getRed());
                data.append(",");
                data.append(c.getGreen());
                data.append(",");
                data.append(c.getBlue());
                data.append(",");
                data.append(c.getAlpha());
                data.append(",");
            }
    Bei mir habe ich beide getestet, die Variante mit dem StringBuilder ist sichtbar schneller; Musst mal schauen ob das so reicht.

    Über die Methode toString holst du dir am Ende deinen String aus dem StringBuilder-Objekt.

    Grüße,
    thellmei

  3. #3
    Fortgeschrittener
    Registriert seit
    08.04.2015
    Beiträge
    32

    Standard AW: BufferedImage Schnell in Int Array packen?

    Direkt auf
    Code:
    int[] rgb(a)
    zugreifen und nicht den Umweg über die Color Klasse gehen?

    Wenn du die R/G/B/A Anteile seperat brauchst musst du halt das jeweilige Byte mit 0xFF verknüpfen.
    Siehe: http://stackoverflow.com/questions/6...ray-from-image
    (Da gibts auchn Benchmark)

  4. #4
    Wiederbelebt Avatar von Cystasy
    Registriert seit
    08.05.2015
    Beiträge
    670

    Standard AW: BufferedImage Schnell in Int Array packen?

    Zitat Zitat von rax Beitrag anzeigen
    Direkt auf
    Code:
    int[] rgb(a)
    zugreifen und nicht den Umweg über die Color Klasse gehen?

    Wenn du die R/G/B/A Anteile seperat brauchst musst du halt das jeweilige Byte mit 0xFF verknüpfen.
    Siehe: http://stackoverflow.com/questions/6...ray-from-image
    (Da gibts auchn Benchmark)
    Ah.. man kann es mit 0xFF verknüpfen, okay dann ist das ganze klarer
    Dachte man muss die Funktionen nutzen da zum Abrufen der Daten.

    Danke, habs jetzt hinbekommen !

  5. #5
    Anfänger
    Registriert seit
    28.05.2015
    Beiträge
    6

    Standard AW: BufferedImage Schnell in Int Array packen?

    Wenn du die beiden Möglichkeiten verknüpfst, würdest du mit folgender Implementierung recht schnell zum Ergebnis kommen.

    Code:
            Rectangle screenRect = new Rectangle(0, 0, 200, 200);
            BufferedImage capture = new Robot().createScreenCapture(screenRect);
    
    
            int[] rgb = ((DataBufferInt) capture.getRaster().getDataBuffer()).getData();
            StringBuilder data = new StringBuilder();
            char comma = ',';
            int currentColor = 0;
    
    
            for (int x = 0; x < rgb.length; x++) {
                currentColor = rgb[x];
                data.append((currentColor >> 16) & 0xff).append(comma).append((currentColor >> 8) & 0xff).append(comma)
                        .append((currentColor >> 24) & 0xff).append(comma);
            }
    
    
            System.out.println(data.toString());
    // EDIT: Oh sehe gerade du hast es bereits hinbekommen.

  6. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Cystasy (28.05.2015)

  7. #6
    Wiederbelebt Avatar von Cystasy
    Registriert seit
    08.05.2015
    Beiträge
    670

    Standard AW: BufferedImage Schnell in Int Array packen?

    Zitat Zitat von thellmei Beitrag anzeigen
    Wenn du die beiden Möglichkeiten verknüpfst, würdest du mit folgender Implementierung recht schnell zum Ergebnis kommen.

    Code:
            Rectangle screenRect = new Rectangle(0, 0, 200, 200);
            BufferedImage capture = new Robot().createScreenCapture(screenRect);
    
    
            int[] rgb = ((DataBufferInt) capture.getRaster().getDataBuffer()).getData();
            StringBuilder data = new StringBuilder();
            char comma = ',';
            int currentColor = 0;
    
    
            for (int x = 0; x < rgb.length; x++) {
                currentColor = rgb[x];
                data.append((currentColor >> 16) & 0xff).append(comma).append((currentColor >> 8) & 0xff).append(comma)
                        .append((currentColor >> 24) & 0xff).append(comma);
            }
    
    
            System.out.println(data.toString());
    // EDIT: Oh sehe gerade du hast es bereits hinbekommen.
    Trotztdem vielen lieben dank !

Ähnliche Themen

  1. [Global] Webhack: Javascript und CSS per PNG packen
    Von meckl im Forum Globale News / Szene News
    Antworten: 0
    Letzter Beitrag: 23.08.2010, 12:32
  2. schnell schnell schnell i need speed
    Von gootesverachter im Forum PC Modding/Tuning
    Antworten: 8
    Letzter Beitrag: 18.02.2008, 14:51
  3. [b] Ordnungsgemäß Packen
    Von Crashkid im Forum Video-Tutorials
    Antworten: 7
    Letzter Beitrag: 31.07.2007, 15:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
crypt.blue