Comment convertir des images entre CMYK et RGB en ColdFusion (Java)?
j'ai besoin de convertir les images de CMYK en RVB - pas nécessairement de retour, mais bon, si c'est possible...
avec la sortie de ColdFusion 8, nous avons obtenu le CFImage tag, mais il ne supporte pas cette conversion; et ne fait pas non plus Image.cfc , ou Alagad l'Image de la Composante .
cependant, il devrait être possible en Java; que nous pouvons tirer parti à travers CF. Exemple, voici comment vous pouvez créer un fil Java pour dormir un processus:
<cfset jthread = createObject("java", "java.lang.Thread")/>
<cfset jthread.sleep(5000)/>
je suppose qu'une méthode similaire pourrait être utilisée pour utiliser java pour faire cette conversion d'image, mais n'étant pas un développeur Java, je n'ai pas la moindre idée d'où commencer. Quelqu'un peut-il donner un coup de main ici?
4 réponses
j'utilise les bibliothèques Java ImageIO ( https://jai-imageio.dev.java.net ). Ils ne sont pas parfaits, mais ils peuvent être simples et faire le travail. En ce qui concerne la conversion de CMJN en RVB, voici le meilleur que j'ai pu trouver.
Téléchargez et installez les bibliothèques ImageIO et native pour votre plate-forme. Les bibliothèques natives sont essentiels. Sans eux, les fichiers ImageIO JAR ne pourront pas détecter les images CMJN. A L'Origine, Je était sous l'impression que les bibliothèques natives amélioreraient la performance, mais n'était pas nécessaire pour aucune fonctionnalité. J'ai eu tort.
la seule autre chose que j'ai remarquée est que les images RVB converties sont parfois beaucoup plus légères que les images CMJN. Si quelqu'un sait comment résoudre ce problème, je vous serais reconnaissante.
ci-dessous est un peu de code pour convertir une image CMYK dans une image RGB de n'importe quel format soutenu.
Merci,
Randy 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;
}
}
une formule très simple pour passer de CMYK À RVB en ignorant tous les profils de couleur est:
R = ( (255-C)*(255-K) ) / 255; G = ( (255-M)*(255-K) ) / 255; B = ( (255-Y)*(255-K) ) / 255;
ce code exige que les valeurs CMYK soient en rage de 0-255. Si vous avez 0 à 100 ou 0.0 à 1.0 vous devrez convertir les valeurs.
J'espère que cela vous permettra de commencer.
quant à l'interface java et ColdFusion, je suis désolé, mais je n'ai aucune idée de comment faire.
la balise cfx_image peut vous être utile. Je ne l'ai pas utilisé en temps, mais je me souviens qu'il avait une tonne de fonctionnalités.
alternativement, vous pourriez être en mesure de script une application windows comme Irfanview (via la ligne de commande en utilisant cfexecute) pour traiter les images.
L'espoir qui aide
je sais que cette question Est ancienne, mais je rencontre toujours des problèmes avec CMYK images & ColdFusion. Cependant, je viens de lire une image CMYK JPEG en utilisant ColdFusion 10 et je l'ai resavée. L'image sauvegardée a pu être lue en utilisant ColdFusion 9 (qui n'est capable de lire que les JPEGs RGB.) Je ne suis pas sûr que cette conversion soit intentionnelle ou pas et je n'ai actuellement aucun moyen d'identifier si le profil de couleur de l'image source est CMYK ou non car le profil de couleur enregistré semble toujours être la même.
<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>