Brauche Hilfe beim Run-Length-Decoding

RalleYTN

Bekanntes Mitglied
Also ich wollte mein eigenes Bildformat machen, dass ich schnell einlesen kann.
Schreiben die Pixeldaten werden mit diesem Algorithmus auf den OutputStream geschrieben.
Java:
       boolean hasAlpha = data.hasAlpha();
       boolean isGrayscale = data.isGrayscale();
       int[] pixels = data.getPixels();
       int index = 1;
       int oldPixel = pixels[0];
       int repeat = 1;
      
       do {
          
           int pixel = pixels[index++];
          
           if(oldPixel != pixel || repeat == 255) {
              
               int alpha = (pixel >> 24) & 0xFF;
               int blue = (pixel >> 16) & 0xFF;
               int green = (pixel >> 8) & 0xFF;
               int red = pixel & 0xFF;
              
               imageStream.write(repeat);
              
               if(hasAlpha && !isGrayscale) {
                  
                   writeInt(imageStream, pixel, true);
                  
               } else if(!hasAlpha && !isGrayscale) {
                  
                   imageStream.write(blue);
                   imageStream.write(green);
                   imageStream.write(red);
                  
               } else if(hasAlpha && isGrayscale) {
                  
                   imageStream.write(alpha);
                   imageStream.write(blue);
                  
               } else if(!hasAlpha && isGrayscale) {
                  
                   imageStream.write(blue);
               }
              
               repeat = 0;
           }
          
           oldPixel = pixel;
           ++repeat;
          
       } while(index < pixels.length);

Jetzt wollte ich das ganze wieder mit diesem Algorithmus auslesen:
Java:
       boolean hasAlpha = getBit(flags, 0);
       boolean grayscale = getBit(flags, 1);
       int[] pixels = new int[width * height];

       for(int index = 0; index < pixels.length;) {
           
           int pixel = 0;
           int repeat = imageStream.read();

           if(hasAlpha && !grayscale) {
               
               pixel = readSignedInt(imageStream, true);
               
           } else if(hasAlpha && grayscale) {
               
               int alpha = imageStream.read();
               int color = imageStream.read();
               
               pixel = ((alpha & 0xFF) << 24) | ((color & 0xFF) << 16) | ((color & 0xFF) << 8) | (color & 0xFF);
               
           } else if(!hasAlpha && !grayscale) {
               
               int blue = imageStream.read();
               int green = imageStream.read();
               int red = imageStream.read();
               
               pixel = ((255 & 0xFF) << 24) | ((blue & 0xFF) << 16) | ((green & 0xFF) << 8) | (red & 0xFF);
               
           } else if(!hasAlpha && grayscale) {
               
               int color = imageStream.read();
               pixel = ((255 & 0xFF) << 24) | ((color & 0xFF) << 16) | ((color & 0xFF) << 8) | (color & 0xFF);
           }

           for(int r = 0; r < repeat; r++) {
               
               pixels[index++] = pixel;
           }
       }

Jedoch hänge ich hier in einer Endlosschleife weil index um 2 zu klein ist. Wenn ich die Schleife vorher abbreche sieht das Bild auch nicht richtig aus.

Was mache ich falsch?
 

RalleYTN

Bekanntes Mitglied
Hier auch noch mal die Bilder, damit man sich etwas darunter vorstellen kann wenn ich sage das Ergebnis sieht komisch aus. Rechts ist es so wie es sein sollte und links so wie es ist.

abbruchergebnis.pngstall.png
 

Anhänge

  • stall.png
    stall.png
    49,1 KB · Aufrufe: 26

Thallius

Top Contributor
Auf jeden Fall schreibst du schonmal nicht die letzten Pixel. Deshalb ist beim einlesen auch Index nicht groß genug. Du solltest auch beim einlesen die Anzahl Bytes im Stream nehmen und nicht die Größe des Bildes. Dann macht es auch nichts aus wenn zu wenig Pixel im Stream sind.
Weiterhin ist es natürlich nicht wirklich schnell für jedes Pixel abzufragen welches Format es hat. Schreibe für jedes pixelformat eine eigene Routine. Ist nicht so elegant dürfte aber deutlich performanter sein.
 

RalleYTN

Bekanntes Mitglied
Weiterhin ist es natürlich nicht wirklich schnell für jedes Pixel abzufragen welches Format es hat. Schreibe für jedes pixelformat eine eigene Routine. Ist nicht so elegant dürfte aber deutlich performanter sein.
Ja ich weiß ist noch nicht ganz so schnell. erstmal soll es funktionieren. Die Sache die das ganze gerade sehr langsam macht ist dass ich "InputStream#read" mindestens 20000 mal durchführe. dabei könnte ich das Bild komplett in den Arbeitsspeicher mit gerade mal 4 Mal read laden.
 

httpdigest

Top Contributor
Die Sache die das ganze gerade sehr langsam macht ist dass ich "InputStream#read" mindestens 20000 mal durchführe. dabei könnte ich das Bild komplett in den Arbeitsspeicher mit gerade mal 4 Mal read laden.
-> https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[], int, int)

oder schalte einen BufferedInputStream davor. Dieser sorgt dann selbst dafür, dass die bytes chunkweise vom darunterliegenden InputStream per read(byte[], int, int) gelesen werden und nicht byte für byte.
 

RalleYTN

Bekanntes Mitglied
-> https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[], int, int)

oder schalte einen BufferedInputStream davor. Dieser sorgt dann selbst dafür, dass die bytes chunkweise vom darunterliegenden InputStream per read(byte[], int, int) gelesen werden und nicht byte für byte.
Ich wusste das schon war bloß zu faul es zu ändern als ich es gemerkt habe.
Ich versuche gerade es umzustellen aber jetzt laufe ich in eine IndexOutOfBoundsException.

Java:
    public static final int[] readPixels(InputStream imageStream, int flags, int width, int height) throws IOException {
       
       boolean hasAlpha = getBit(flags, 0);
       boolean grayscale = getBit(flags, 1);
       int[] pixels = new int[width * height];

       try(ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
           
           write(imageStream, buffer); // Schreibt die Bilddaten in 4KB Chunks auf den buffer
           byte[] data = buffer.toByteArray();
           
                  if(!hasAlpha && !grayscale) {readPixelsBGR(data, pixels);
           } else if( hasAlpha && !grayscale) {readPixelsABGR(data, pixels);
           } else if(!hasAlpha &&  grayscale) {readPixelsG(data, pixels);
           } else if( hasAlpha &&  grayscale) {readPixelsAG(data, pixels);
           }
       }
       
       return pixels;
   }
    private static final void readPixelsBGR(byte[] data, int[] pixels) {
       
       int index = 0;
       
       for(int offset = 0; offset < data.length; offset += 5) {
           
           int repetitions = data[offset] & 0xFF;
           
           for(int repetition = 0; repetition < repetitions; repetition++) {
               
               // Index sorgt hier für OutOfBounds
               pixels[index++] = ((data[offset + 1] & 0xFF) << 24) | ((data[offset + 2] & 0xFF) << 16) | ((data[offset + 3] & 0xFF) << 8) | (data[offset + 4] & 0xFF);
           }
       }
   }
 

RalleYTN

Bekanntes Mitglied
OK vergesst das mit der OutOfBoundsException. Ich war einfach blöde und habe an dieser Stelle Alpha mit beachtet obwohl es das nicht gibt. Bild sieht jedoch immer noch nicht richtig aus.
 

mrBrown

Super-Moderator
Mitarbeiter
Ähnliche Java Themen
  Titel Forum Antworten Datum
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
M Brauche Hilfe bei Quellcodeverständnis Allgemeine Java-Themen 4
D Brauche Hilfe bei Rechnung (Exponentiation) Allgemeine Java-Themen 12
F Brauche Hilfe bei Java Allgemeine Java-Themen 6
C Brauche Hilfe mit Modulo Strategie Allgemeine Java-Themen 2
S Brauche Hilfe: Prüfungsaufgabe Java Allgemeine Java-Themen 8
S brauche Hilfe für ssh connection in java Allgemeine Java-Themen 6
S Brauche Hilfe bei Planung für JAVA-Programm Allgemeine Java-Themen 3
Developer_X Brauche Hilfe bei meinem kleinen hilfsprogramm Allgemeine Java-Themen 4
Developer_X Bound Animation - Brauche Hilfe Allgemeine Java-Themen 3
D Brauche mal Hilfe bin noch nicht so fit Allgemeine Java-Themen 3
L Brauche Hilfe bei Memory Programmierung Allgemeine Java-Themen 2
N Brauche dringend Hilfe! Allgemeine Java-Themen 7
M brauche hilfe mit iReport Allgemeine Java-Themen 4
V Brauche dringend Hilfe. Object-handling Allgemeine Java-Themen 4
R Hilfe - brauche ein Applet zu Demozwecken Allgemeine Java-Themen 10
J Brauche Hilfe zum ToolKit Allgemeine Java-Themen 15
K Brauche Hilfe bei Simulation einer Flugkurve . Allgemeine Java-Themen 14
T Brauche Hilfe! Allgemeine Java-Themen 10
G Brauche hilfe bei JMF: Wie eigene Streaming Data Source! Allgemeine Java-Themen 4
N int[] referenzen in ein Array packen, brauche Hilfe. Allgemeine Java-Themen 7
T Brauche Hilfe bei ClassLoader Allgemeine Java-Themen 2
G Brauche Hilfe bei Erstellung eines Musters! Allgemeine Java-Themen 3
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
Robert Zenz Ich brauche bitte mal kurz einen Sanity/Reality-Check betreffend Tests. Allgemeine Java-Themen 9
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
MoxxiManagarm Ich brauche einen smarten Ansatz Allgemeine Java-Themen 23
Thallius Unfassbarer Fehler. Brauche Ideen zum Debuggen Allgemeine Java-Themen 9
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
S Best Practice Brauche eine Idee für eine Java Projekt! Allgemeine Java-Themen 11
Fu3L Input/Output Brauche Rat bei effizienter Speicherung großer Datenmengen Allgemeine Java-Themen 21
T Ich brauche gute Quellen Allgemeine Java-Themen 13
hdi GUI: Ich brauche ein Textfeld mit "Sperre" Allgemeine Java-Themen 12
E brauche schnell Ausführbare Datei Allgemeine Java-Themen 4
M brauche grösseren Datentyp Allgemeine Java-Themen 5
S brauche dringend help bei einem projekt (Römisch-dezimal) Allgemeine Java-Themen 3
M Brauche einen Tipp, bei einer Aufgabe ! Allgemeine Java-Themen 3
P Java Acces Datenbank Problem ! (Brauche eine Abfrage) Allgemeine Java-Themen 5
E Ich brauche euren Code Allgemeine Java-Themen 12
S Ich Brauche Bei Einen Bot Hile :( Allgemeine Java-Themen 2
V Brauche Beratung in Sachen Java+Datenbank+Web Allgemeine Java-Themen 8
M Schätzfrage: Wieviel Prozessorpower brauche ich? Allgemeine Java-Themen 27
T Lizenzfrage - brauche Infos Allgemeine Java-Themen 34
T Autostart Programm - brauche Tipps Allgemeine Java-Themen 5
A brauche schnelle antwort wg. schleife! Allgemeine Java-Themen 3
K Brauche euren Lösungsweg zu einem File/IO-Beispiel Allgemeine Java-Themen 23
G packageproblem? brauche rat! Allgemeine Java-Themen 2
S brauche Orientierungshilfe in Java Allgemeine Java-Themen 5
Z Was brauche ich für Servlets? Allgemeine Java-Themen 17
W Hilfe bei Methode Allgemeine Java-Themen 14
M Javascript Hilfe bei ToDoList? Allgemeine Java-Themen 1
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
T Hilfe bei negation von suchabfrage Allgemeine Java-Themen 2
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
V Hilfe mit Java Code Allgemeine Java-Themen 4
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
alinakeineAhnungv Hilfe bei einem Straßenbahn-Projekt von mir Allgemeine Java-Themen 18
Aboya Kugel mit Hilfe von Dreiecken rekursiv zeichnen Allgemeine Java-Themen 2
K Anzeigemöglichkeit von Bildern in JavaFX mit Hilfe von MongoDB GridFS Allgemeine Java-Themen 0
A Preisberechnung, Hilfe Allgemeine Java-Themen 4
M Bräuchte Hilfe bei der Aufgabe Allgemeine Java-Themen 1
s_1895 Hilfe bei Java Tic Tac Toe Allgemeine Java-Themen 8
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
B Bei Email: FW / AW... - Hilfe bei String suche Allgemeine Java-Themen 21
U Erste Schritte Hilfe bei simplem Glücsspiel in Java Allgemeine Java-Themen 4
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
K Objektorientierung, hilfe Allgemeine Java-Themen 9
V Bilder bei bestimmten Zeiten wechseln, bitte um Hilfe Allgemeine Java-Themen 5
D Hilfe bei Informatik Hausaufgaben Allgemeine Java-Themen 30
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
F NetBeans Hilfe!!! Allgemeine Java-Themen 23
H Schiffe versenken JButton Schiffe mit GUI verbinden Hilfe! Allgemeine Java-Themen 2
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
S GetMethode erstellen mit Hilfe von Parametern Allgemeine Java-Themen 9
B Hilfe bei Übungsblätter Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
C Hilfe Bei Vegas Slide Allgemeine Java-Themen 0
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
Ice4P4rty Hilfe Bei Promillerechner Allgemeine Java-Themen 9
C Atfx mit Hilfe von OpenAtfx auslesen Allgemeine Java-Themen 1
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
G Hilfe bei Projektarbeit Allgemeine Java-Themen 5
GenerationLost Input/Output Custom Serialization - hilfe bei Realisierung Allgemeine Java-Themen 8
J Hilfe!!! Ausbildung Allgemeine Java-Themen 14
H Hilfe bei Erstellung eines Hilfe Fenster bei Tastendruck (F1 bei Win98) Allgemeine Java-Themen 5
B Swing Hilfe bei Abfrage von Benutzernamen und Passwort Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
S Hilfe bei Gui Allgemeine Java-Themen 3
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
GRAZZ0R Hilfe zum Spiel Mensch ärger dich nicht Allgemeine Java-Themen 1
C Hilfe bei den Ausgaben Allgemeine Java-Themen 4
K Hilfe bei GUI für Pizza-Service Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben