Как конвертировать изображения между CMYK и RGB в ColdFusion (Java)?

голоса
8

У меня есть необходимость конвертировать изображения из CMYK в RGB - не обязательно обратно, но эй, если это может быть сделано ...

С выходом ColdFusion 8, мы получили CFImage тег, но он не поддерживает это преобразование; и ни делает Image.cfc или изображение Alagad Компонентные .

Тем не менее, это должно быть возможно в Java; которые мы можем использовать через CF. Например, вот как вы можете создать поток Java спать процесс:

<cfset jthread = createObject(java, java.lang.Thread)/>
<cfset jthread.sleep(5000)/>

Я думаю, подобный метод может быть использован для привлечения Java, чтобы сделать это преобразование изображения, но не будучи разработчиком Java, я понятия не имею, с чего начать. Может кто-нибудь протянуть руку здесь?

Задан 22/08/2008 в 14:51
источник пользователем
На других языках...                            


4 ответов

голоса
10

Очень простая формула для преобразования из CMYK в RGB, игнорируя все цветовые профили является:

    R = ((255-С) * (255-K)) / 255;
    G = ((255-М) * (255-K)) / 255;
    В = ((255-Y) * (255-K)) / 255;

Этот код требует значений CMYK, чтобы быть в ярости 0-255. Если у вас есть 0 до 100 или от 0,0 до 1,0, вам придется преобразовать значение.

Надеюсь, что это поможет вам начать работу.

Что касается Java и ColdFusion сопряжение, я извиняюсь, но я понятия не имею, как это сделать.

Ответил 22/08/2008 d 22:41
источник пользователем

голоса
5

Я использую библиотеки Java ImageIO ( https://jai-imageio.dev.java.net ). Они не идеальны, но могут быть простыми и получить работу. Что касается преобразования из CMYK в RGB, вот лучшее , что я смог придумать.

Загрузите и установите ImageIO баночку и собственные библиотеки для вашей платформы. Местные библиотеки имеют важное значение. Без них JAR-файлы ImageIO не смогут обнаружить CMYK изображения. Изначально, я был под впечатлением, что нативные библиотеки могли бы повысить производительность, но не требуются для любой функциональности. Я был неправ.

Единственная вещь, которую я заметил, что преобразованные изображения RGB иногда намного легче, чем CMYK изображений. Если кто-нибудь знает, как решить эту проблему, я бы признателен.

Ниже приведен код для преобразования CMYK изображения в RGB изображения любого поддерживаемого формата.

Спасибо,
Рэнди Stegbauer

package cmyk;

import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.commons.lang.StringUtils;

public class Main
{

    /**
     * Creates new RGB images from all the CMYK images passed
     * in on the command line.
     * The new filename generated is, for example "GIF_original_filename.gif".
     *
     */
    public static void main(String[] args)
    {
        for (int ii = 0; ii < args.length; ii++)
        {
            String filename = args[ii];
            boolean cmyk = isCMYK(filename);
            System.out.println(cmyk + ": " + filename);
            if (cmyk)
            {
                try
                {
                    String rgbFile = cmyk2rgb(filename);
                    System.out.println(isCMYK(rgbFile) + ": " + rgbFile);
                }
                catch (IOException e)
                {
                    System.out.println(e.getMessage());
                }
            }
        }
    }

    /**
     * If 'filename' is a CMYK file, then convert the image into RGB,
     * store it into a JPEG file, and return the new filename.
     *
     * @param filename
     */
    private static String cmyk2rgb(String filename) throws IOException
    {
        // Change this format into any ImageIO supported format.
        String format = "gif";
        File imageFile = new File(filename);
        String rgbFilename = filename;
        BufferedImage image = ImageIO.read(imageFile);
        if (image != null)
        {
            int colorSpaceType = image.getColorModel().getColorSpace().getType();
            if (colorSpaceType == ColorSpace.TYPE_CMYK)
            {
                BufferedImage rgbImage =
                    new BufferedImage(
                        image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
                ColorConvertOp op = new ColorConvertOp(null);
                op.filter(image, rgbImage);

                rgbFilename = changeExtension(imageFile.getName(), format);
                rgbFilename = new File(imageFile.getParent(), format + "_" + rgbFilename).getPath();
                ImageIO.write(rgbImage, format, new File(rgbFilename));
            }
        }
        return rgbFilename;
    }

    /**
     * Change the extension of 'filename' to 'newExtension'.
     *
     * @param filename
     * @param newExtension
     * @return filename with new extension
     */
    private static String changeExtension(String filename, String newExtension)
    {
        String result = filename;
        if (filename != null && newExtension != null && newExtension.length() != 0);
        {
            int dot = filename.lastIndexOf('.');
            if (dot != -1)
            {
                result = filename.substring(0, dot) + '.' + newExtension;
            }
        }
        return result;
    }

    private static boolean isCMYK(String filename)
    {
        boolean result = false;
        BufferedImage img = null;
        try
        {
            img = ImageIO.read(new File(filename));
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage() + ": " + filename);
        }
        if (img != null)
        {
            int colorSpaceType = img.getColorModel().getColorSpace().getType();
            result = colorSpaceType == ColorSpace.TYPE_CMYK;
        }

        return result;
    }
}
Ответил 11/05/2009 d 16:01
источник пользователем

голоса
1

Тег cfx_image может быть полезна для вас. Я не использовал его в то время, но я помню, что это была тонна особенностей.

Кроме того, вы могли бы сценарий окна приложения, такие как Irfanview (с помощью командной строки, используя cfexecute) для обработки изображений.

надеюсь, это поможет

Ответил 09/11/2008 d 06:57
источник пользователем

голоса
0

Я знаю, что этот вопрос старый, но я до сих пор возникают проблемы с CMYK изображениями и ColdFusion. Тем не менее, я только что прочитал изображение CMYK JPEG с помощью ColdFusion 10 и повторно сохранен его. Сохраненное изображение было в состоянии быть считаны с помощью ColdFusion 9 (который способен только читать RGB JPEG.) Я не уверен, если это преобразование намеренно или нет, и я в настоящее время не имеют какой-либо способ определения является ли источник изображения в цвет профиль CMYK или нет, как сохраненный профиль цвета по-прежнему, как представляется, то же самое.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>
Ответил 06/07/2013 d 01:07
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more