package com.celements.photo.image; public class JpegReader { public static final int COLOR_TYPE_RGB = 1; public static final int COLOR_TYPE_CMYK = 2; public static final int COLOR_TYPE_YCCK = 3; private int colorType = COLOR_TYPE_RGB; private boolean hasAdobeMarker = false; // public BufferedImage readImage(File file) throws IOException, ImageReadException { // colorType = COLOR_TYPE_RGB; // hasAdobeMarker = false; // // ImageInputStream stream = ImageIO.createImageInputStream(file); // Iterator<ImageReader> iter = ImageIO.getImageReaders(stream); // while (iter.hasNext()) { // ImageReader reader = iter.next(); // reader.setInput(stream); // // BufferedImage image; // ICC_Profile profile = null; // try { // image = reader.read(0); // } catch (IIOException e) { // colorType = COLOR_TYPE_CMYK; // checkAdobeMarker(file); // profile = Sanselan.getICCProfile(file); // WritableRaster raster = (WritableRaster) reader.readRaster(0, null); // if (colorType == COLOR_TYPE_YCCK) // convertYcckToCmyk(raster); // if (hasAdobeMarker) // convertInvertedColors(raster); // image = convertCmykToRgb(raster, profile); // } // // return image; // } // // return null; // } // // public void checkAdobeMarker(File file) throws IOException, ImageReadException { // JpegImageParser parser = new JpegImageParser(); // ByteSource byteSource = new ByteSourceFile(file); // @SuppressWarnings("rawtypes") // ArrayList segments = parser.readSegments(byteSource, new int[] { 0xffee }, true); // if (segments != null && segments.size() >= 1) { // UnknownSegment app14Segment = (UnknownSegment) segments.get(0); // byte[] data = app14Segment.bytes; // if (data.length >= 12 && data[0] == 'A' && data[1] == 'd' && data[2] == 'o' // && data[3] == 'b' && data[4] == 'e') { // hasAdobeMarker = true; // int transform = app14Segment.bytes[11] & 0xff; // if (transform == 2) // colorType = COLOR_TYPE_YCCK; // } // } // } // // public static void convertYcckToCmyk(WritableRaster raster) { // int height = raster.getHeight(); // int width = raster.getWidth(); // int stride = width * 4; // int[] pixelRow = new int[stride]; // for (int h = 0; h < height; h++) { // raster.getPixels(0, h, width, 1, pixelRow); // // for (int x = 0; x < stride; x += 4) { // int y = pixelRow[x]; // int cb = pixelRow[x + 1]; // int cr = pixelRow[x + 2]; // // int c = (int) (y + 1.402 * cr - 178.956); // int m = (int) (y - 0.34414 * cb - 0.71414 * cr + 135.95984); // y = (int) (y + 1.772 * cb - 226.316); // // if (c < 0) // c = 0; // else if (c > 255) // c = 255; // if (m < 0) // m = 0; // else if (m > 255) // m = 255; // if (y < 0) // y = 0; // else if (y > 255) // y = 255; // // pixelRow[x] = 255 - c; // pixelRow[x + 1] = 255 - m; // pixelRow[x + 2] = 255 - y; // } // // raster.setPixels(0, h, width, 1, pixelRow); // } // } // // public static void convertInvertedColors(WritableRaster raster) { // int height = raster.getHeight(); // int width = raster.getWidth(); // int stride = width * 4; // int[] pixelRow = new int[stride]; // for (int h = 0; h < height; h++) { // raster.getPixels(0, h, width, 1, pixelRow); // for (int x = 0; x < stride; x++) // pixelRow[x] = 255 - pixelRow[x]; // raster.setPixels(0, h, width, 1, pixelRow); // } // } // // public static BufferedImage convertCmykToRgb(Raster cmykRaster, ICC_Profile cmykProfile) // throws IOException { // if (cmykProfile == null) // cmykProfile = ICC_Profile.getInstance(JpegReader.class // .getResourceAsStream("/ISOcoated_v2_300_eci.icc")); // ICC_ColorSpace cmykCS = new ICC_ColorSpace(cmykProfile); // BufferedImage rgbImage = new BufferedImage(cmykRaster.getWidth(), cmykRaster // .getHeight(), BufferedImage.TYPE_INT_RGB); // WritableRaster rgbRaster = rgbImage.getRaster(); // ColorSpace rgbCS = rgbImage.getColorModel().getColorSpace(); // ColorConvertOp cmykToRgb = new ColorConvertOp(cmykCS, rgbCS, null); // cmykToRgb.filter(cmykRaster, rgbRaster); // return rgbImage; // } }