Also ich wollte mein eigenes Bildformat machen, dass ich schnell einlesen kann.
Schreiben die Pixeldaten werden mit diesem Algorithmus auf den OutputStream geschrieben.
Jetzt wollte ich das ganze wieder mit diesem Algorithmus auslesen:
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?
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?