Alternative Java pure à JAI ImageIO pour la détection d'images CMJN
d'abord je tiens à expliquer la situation/conditions qui conduisent à la question:
Dans notre application web, nous ne pouvons pas soutenir des images CMJN (JPEG) depuis IE 8 et ci-dessous ne peut pas les afficher.
Donc, nous avons besoin de détecter quand quelqu'un veut télécharger une image et de le nier.
Malheureusement, Java ImageIO de ne pas lire les images ou ne permettrait pas de me rendre à la détection de la couleur de l'espace. À partir de débogage, il semble que JPEGImageReader
en interne devient l'espace de couleur de code 11 (ce qui voudrait dire JCS_YCCK
) mais je ne peux pas en toute sécurité accéder à cette information.
Lors de l'interrogation du lecteur pour les types d'image je ne reçois rien pour les images CMJN, donc je pourrais assumer no image types = unsupported image
.
Je me suis converti à la source de l'image CMJN RVB à l'aide d'un outil d'imagerie afin de tester si alors il serait lisible (j'ai essayé de simuler l'admin étapes lorsque vous obtenez le message "Pas de CMJN pris en charge"). Cependant, JPEGImageReader
ne serait pas lire cette image, car il suppose (commentaire dans le source!)3-component espace de couleurs RVB, mais l'image d'en-tête des rapports de 4 éléments (peut-être RGBA ou ARGB) et donc une IllegalArgumentException
est levée.
Ainsi, ImageIO n'est pas une option puisque je ne peux pas fiable obtenir de l'espace de couleur d'une image et je ne peux pas dire à l'admin pourquoi une image bien (il peut être affiché par le navigateur) ne serait pas accepté en raison d'une erreur interne.
Cela m'a conduit à essayer JAI ImageIO dont CLibJPEGImageReader
fait un excellent travail et correctement lit toutes mes images de test.
Cependant, puisque nous sommes le déploiement de notre application dans un JBoss qui peuvent héberger d'autres applications, nous aimerions les garder aussi isolé que possible. Autant que je sache, j'aurais besoin d'installer JAI ImageIO pour le JRE ou autrement rendre le natif libs disponible pour les utiliser, et donc d'autres applications peuvent avoir accès à eux, ce qui pourrait causer des effets secondaires (au moins, nous devrions avoir à tester un lot pour s'assurer que ce n'est pas le cas).
Que l'explication de la question, et ici il s'agit de nouveau:
Java pur alternative à JAI ImageIO qui détecte de façon fiable et, éventuellement, convertit des images en CMJN?
Merci d'avance,
Thomas
source d'informationauteur Thomas
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution qui est ok pour nos besoins: Apache Commons Sanselan. Cette bibliothèque lit JPEG en-têtes assez rapide et précise (au moins toutes mes images de test) ainsi que d'un certain nombre d'autres formats d'image.
L'inconvénient est qu'il ne la lira pas d'image JPEG de données, mais je peux le faire avec la base JRE outils.
La lecture des images JPEG conversion est assez facile (ceux qui
ImageIO
refuse de le lire, trop):Alors si Sanselan me dit que l'image est en fait CMJN, je reçois la source de l'image raster et les convertir en moi-même:
Cela donne d'assez bons résultats dans les images RVB pas être trop lumineux ou sombres. Cependant, je ne suis pas sûr pourquoi multipliant avec
k
empêche l'éclairage. Le JPEG est en fait décodé en code natif et le CMJN->conversion RGB j'ai eu unis quelque chose de différent, j'ai juste essayé de le multiplier pour voir le résultat visuel.Si quelqu'un pourrait jeter quelque lumière sur ce, je lui en serais reconnaissant.
J'ai posté un pur Java solution pour lire toutes sortes de fichiers images JPEG et de les convertir en RVB.
Repose sur les faits suivants:
Je ne suis pas d'accord avec votre "Donc, nous avons besoin de détecter quand quelqu'un veut télécharger une image et de le nier". Un moyen beaucoup plus convivial de la politique serait de le convertir en quelque chose d'autre que CMJN.
Le reste de votre post est un peu confus en ce qui concerne vu que vous vous posez à la fois pour la détection et de conversion, qui sont deux choses différentes. Une fois de plus, je pense que la conversion de l'image est beaucoup plus convivial.
Pas besoin d'écrire en gras btw:
Pur Java je ne sais pas, mais ImageMagick fonctionne très bien pour convertir image CMJN en RVB. L'appel de ImageMagick sur le côté serveur de Java n'est vraiment pas compliqué. J'ai l'habitude de le faire manuellement en appelant un processus externe, mais de nos jours il y a des wrappers comme JMagick et im4java.
Méfiez-vous d'un autre post que le Java 7 ne permet pas d'utiliser directement du Soleil, de la mise en œuvre, sans paramètres, comme indiqué dans l'importation com.sun.image.codec.jpeg.*.