Java сохранить изображение CMYK в файл

Я пытаюсь создать изображение в цветовом пространстве CMYK и после работы с ним, например, рисуя линии и т. Д., Сохраняю его в файл. К сожалению, в инете мало информации о CMYK в java. Я нашел только статью http://carback.us/rick/blog/?p=58 . Но там изображение сохраняется в Pdf с использованием библиотеки iText. Но мне нужно, чтобы он был сохранен в файл png или jpeg. Вот код:

public BufferedImage createCMYKBufferedImage(double l_width, double l_height) {
    ColorSpace colorSpace = SimpleCMYKColorSpace.getInstance();
    ComponentColorModel l_ccm = new ComponentColorModel(colorSpace, false, false,
                            1, DataBuffer.TYPE_FLOAT);
    int[] l_bandoff = {0, 1, 2, 3}; //Index for each color (C, is index 0, etc)
    PixelInterleavedSampleModel l_sm = new PixelInterleavedSampleModel(
                               DataBuffer.TYPE_FLOAT,
                               (int)l_width, (int)l_height,
                                   4,(int)l_width*4, l_bandoff);
    WritableRaster l_raster = WritableRaster.createWritableRaster(l_sm,
            new Point(0, 0));
    return new BufferedImage(l_ccm, l_raster, false, null);
}

Когда я пытаюсь сохранить изображение, я просто звоню

ImageIO.write(изображение, формат, файл);

Кто-нибудь может мне помочь?


person Vladimir Lugovsky    schedule 10.03.2011    source источник


Ответы (2)


Чтобы записать BufferedImage в формате Jpeg:

Сначала преобразуйте BufferedImage в массив байтов Jpeg.

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public static byte[] jpegToBytes(BufferedImage image) {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
    JPEGEncodeParam jparm = encoder.getDefaultJPEGEncodeParam(image);
    jparm.setQuality(1F, false);

    try {
        encoder.encode(image, jparm);
        os.close();
    } catch (IOException e) {
        EclipseLogging.logError(RabidPhotoPlugin.getDefault(),
                RabidPhotoPlugin.PLUGIN_ID, e);
        return new byte[0];
    }
    return os.toByteArray();
}

Затем запишите массив байтов в файл.

public static void writePhoto(byte[] photo) {
    try {
        OutputStream os = new FileOutputStream('file name');
        os.write(photo);
        os.flush();
        os.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
person Gilbert Le Blanc    schedule 10.03.2011
comment
Спасибо, это было полезно, но создаваемое изображение черное. Любые идеи? - person Vladimir Lugovsky; 11.03.2011
comment
@Vladimir: я вытащил этот код из работающего приложения. Создайте простой BufferedImage и убедитесь, что вы получаете правильный Jpeg из простого BufferedImage. Затем постепенно добавляйте код BufferedImage, пока не получите нужное изображение. - person Gilbert Le Blanc; 11.03.2011

Кажется, у вас полемика в вопросе. JPEG и PNG имеют формат изображения RGB. Например, посмотрите http://forums.adobe.com/message/2704225. Итак, вам нужно поместить исходное изображение прямо в png/jpeg или распечатать CMYK в pdf. CMYK — это печатный формат, а не экранный.

person Gangnus    schedule 17.11.2011
comment
JPEG может использовать цветовое пространство CMYK и может использоваться как для экрана, так и для печати. - person Thayne; 15.01.2016