كيف يمكنني تحويل الصور بين CMYK وRGB في ColdFusion (Java)؟

StackOverflow https://stackoverflow.com/questions/22409

  •  09-06-2019
  •  | 
  •  

سؤال

أحتاج إلى تحويل الصور من CMYK إلى RGB - وليس بالضرورة العودة مرة أخرى، ولكن مهلا، إذا كان من الممكن القيام بذلك...

مع إصدار ColdFusion 8، حصلنا على صورة CF العلامة، ولكنها لا تدعم هذا التحويل؛ولا Image.cfc, ، أو مكون صورة العقاد.

ومع ذلك، ينبغي أن يكون ممكنا في جافا؛والتي يمكننا الاستفادة منها من خلال CF.على سبيل المثال، إليك كيفية إنشاء سلسلة رسائل Java لإيقاف العملية:

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

أعتقد أنه يمكن استخدام طريقة مماثلة للاستفادة من جافا للقيام بتحويل الصور هذا، ولكن كوني لست مطورًا لجافا، ليس لدي أدنى فكرة من أين أبدأ.يمكن لأي شخص أن يمد يد المساعدة هنا؟

هل كانت مفيدة؟

المحلول

أستخدم مكتبات Java ImageIO (https://jai-imageio.dev.java.net).إنها ليست مثالية، ولكنها يمكن أن تكون بسيطة وتنجز المهمة.فيما يتعلق بالتحويل من CMYK إلى RGB، فهذا هو أفضل ما تمكنت من التوصل إليه.

قم بتنزيل وتثبيت ImageIO JARs والمكتبات الأصلية لنظامك الأساسي.المكتبات المحلية ضرورية.بدونها، لن تتمكن ملفات ImageIO JAR من اكتشاف صور CMYK.في الأصل، كان لدي انطباع بأن المكتبات المحلية ستعمل على تحسين الأداء ولكنها لم تكن مطلوبة لأي وظيفة.كنت مخطئ.

الشيء الآخر الوحيد الذي لاحظته هو أن صور RGB المحولة تكون أحيانًا أخف بكثير من صور CMYK.إذا كان أي شخص يعرف كيفية حل هذه المشكلة، سأكون ممتنا.

يوجد أدناه بعض التعليمات البرمجية لتحويل صورة CMYK إلى صورة RGB بأي تنسيق مدعوم.

شكرًا لك،
راندي ستيجباور

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;
    }
}

نصائح أخرى

هناك صيغة بسيطة جدًا للتحويل من CMYK إلى RGB مع تجاهل جميع ملفات تعريف الألوان هي:

    R = ( (255-C)*(255-K) ) / 255;
    G = ( (255-M)*(255-K) ) / 255;
    B = ( (255-Y)*(255-K) ) / 255;

يتطلب هذا الرمز أن تكون قيم CMYK في نطاق 0-255.إذا كان لديك 0 إلى 100 أو 0.0 إلى 1.0، فسيتعين عليك تحويل القيم.

نأمل أن هذا سوف تحصل على انك بدأته.

أما بالنسبة لواجهة Java وColdFusion، فأنا آسف، لكن ليس لدي أي فكرة عن كيفية القيام بذلك.

قد تكون العلامة cfx_image مفيدة لك.لم أستخدمه منذ فترة ولكني أتذكر أنه كان يحتوي على الكثير من الميزات.

وبدلاً من ذلك، قد تتمكن من برمجة تطبيق Windows مثل Irfanview (عبر سطر الأوامر باستخدام cfexecute) لمعالجة الصور.

امل ان يساعد

أعلم أن هذا السؤال قديم، ولكن ما زلت أواجه مشكلات مع صور 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"))>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top