Guten Abend die Damen und Herren,
ich versuche ganze Zeit seit heute Morgne um schon ein 32 bit PNG in ein 16Bit zu konvertieren. Aber leider ohne erfolg. Habe alles tausendmal umgeschrieben und nichts klappt. Habe auch versucht den CollorSpace auf TYPE_USHORT_565_RGB zu setzen, ohne Erfolg. Gab direkt ne Exception... Vllt kennt ihr euch damit besser aus und habt ne Idee oder einen Ratschlag.
Mit freundlichen Grüßen
Patrick.
ich versuche ganze Zeit seit heute Morgne um schon ein 32 bit PNG in ein 16Bit zu konvertieren. Aber leider ohne erfolg. Habe alles tausendmal umgeschrieben und nichts klappt. Habe auch versucht den CollorSpace auf TYPE_USHORT_565_RGB zu setzen, ohne Erfolg. Gab direkt ne Exception... Vllt kennt ihr euch damit besser aus und habt ne Idee oder einen Ratschlag.
Mit freundlichen Grüßen
Patrick.
Java:
public static BufferedImage convert (BufferedImage img) {
//Die Breite und Höhe braucht man immer
int w = img.getWidth();
int h = img.getHeight();
//Einen AnfangsPunkt für den späteren gebrauch
Point location = new Point(0,0);
//Man braucht einen ColorSpace was auch 16bit hat
//in dem Fall TYPE_USHORT_565_RGB!!!
ColorSpace cs = ColorSpace.getInstance(BufferedImage.TYPE_USHORT_565_RGB);
//dann die anzahl der Bits pro Kanel
int[] nBits = {5, 6, 5};
//Man braucht ein passendes ColorModel
//Constructor:
//ComponentColorModel(ColorSpace colorSpace, boolean hasAlpha, boolean isAlphaPremultiplied, int transparency, int transferType)
ComponentColorModel ccm = new ComponentColorModel(cs, nBits, false, false, Transparency.OPAQUE, 0);
// das bandOffset benötigit man für DataBuffer und für das Sample Mode
int[] bandOffset = { 0, 1, 2 };
//Einen DataBuffer für das spätere Raster
DataBuffer datBuff = new DataBufferShort(16);
// Dann braucht man ein Raster
WritableRaster raster = Raster.createInterleavedRaster(datBuff, w, h, h, 3, bandOffset, location);
//Ein Array um das neue Raster zu speichern
short[] shortData = ((DataBufferShort) raster.getDataBuffer()).getData();
//Ein RasterObjekt um das alte Raster zu speichern
Raster originalRaster = img.getData();
//Scannen
int[] pixel = new int[4];
int k = 0;
for (int j = 0; j < h; j++){
for(int i = 0; i < w; i++){
//Die Pixel aus dem original holen und zwischenspeichern
pixel = originalRaster.getPixel(i, j, pixel);
//und neu schreiben
shortData[k++] = (short) (pixel[0]);
shortData[k++] = (short) (pixel[1]);
shortData[k++] = (short) (pixel[2]);
}
}
return new BufferedImage(ccm, raster, false, null);
}
public static BufferedImage[] splitImage(BufferedImage img, int size) {
int c = img.getWidth() / size;
int r = img.getHeight() / size;
int counter = c + r;
int num = 0;
//img = convert(img);
System.out.println("IMG: " + img + "c: " + c + " r: " + r);
BufferedImage imgs[] = new BufferedImage[c*r];
for(int y = 0; y <counter; y++) {
File file = new File("Test"+num+".png");
imgs[num] = convert(img);
Graphics g = imgs[num].createGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();
try {
ImageIO.write(imgs[num], "png", file);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("IMG: " + imgs[num]);
num++;
}
return imgs;
}