J'ai une méthode convertissant des bufferedimages qui est le type est Type_Custom à Type_int_RGB. J'utilise le code suivant, mais j'aimerais vraiment trouver un moyen plus rapide de le faire.
public static BufferedImage makeCompatible(BufferedImage img) throws IOException { // Allocate the new image BufferedImage dstImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB); // Check if the ColorSpace is RGB and the TransferType is BYTE. // Otherwise this fast method does not work as expected ColorModel cm = img.getColorModel(); if ( cm.getColorSpace().getType() == ColorSpace.TYPE_RGB && img.getRaster().getTransferType() == DataBuffer.TYPE_BYTE ) { //Allocate arrays int len = img.getWidth()*img.getHeight(); byte[] src = new byte[len*3]; int[] dst = new int[len]; // Read the src image data into the array img.getRaster().getDataElements(0, 0, img.getWidth(), img.getHeight(), src); // Convert to INT_RGB int j = 0; for ( int i=0; i<len; i++ ) { dst[i] = (((int)src[j++] & 0xFF) << 16) | (((int)src[j++] & 0xFF) << 8) | (((int)src[j++] & 0xFF)); } // Set the dst image data dstImage.getRaster().setDataElements(0, 0, img.getWidth(), img.getHeight(), dst); return dstImage; } ColorConvertOp op = new ColorConvertOp(null); op.filter(img, dstImage); return dstImage; }
6 Réponses :
Avez-vous essayé de fournir n'importe quel Rendinginghints ? Aucune garantie, mais en utilisant plutôt que le null code> dans votre code de code pourrait accélérer un peu. P> p>
Je soupçonne que le problème peut être que colorConvertop () fonctionne pixel-by-pixel (garantie "lent"). P>
Q: Est-il possible que vous utilisiez GC.CreatEcompatibleImage () ? P>
q: Votre couleur véritable bitmap d'origine est-elle ou utilise-t-elle une coloration? P>
Q: Échec de tout le reste, seriez-vous agréable à écrire une interface JNI? Soit à votre propre code C personnalisé, ou à une bibliothèque externe telle que ImageMagick ? P>
Aussi - avez-vous regardé l'un des nouveaux appels image dans Java 6 ++? docs.oracle.com/javase/6/docs/ API / JAVAX / imageIO / imageIO.html
GC.CreatEcompatibleImage () ne fonctionnera pas (machine sans tête), Bitmap est une couleur vraie, je ne suis pas opposé à l'utilisation de JNI ou d'ImageMagick en attente, je peux obtenir les mêmes résultats que d'utiliser ColorConvertop.
J'utilise image dans l'accélération indigène pour ouvrir le JPG.
Q: Quel format est i> votre bitmap d'origine? Q: Je présume que vous avez définitivement réduit le problème jusqu'à ColorConvertop.filter (), correct? Q: Combien de temps faut-il pour convertir une image? Est-ce parce que l'image est grande (quelle est la taille?), Car il y a tellement d'images (combien vous convertissez-vous à la fois?) Ou car cette méthode est intrinsèquement lente?
Lorsque vous avez une chance, veuillez répondre à mes questions. Je suis curieux :) Mais en attendant, voici un lien vers "Javamagick": code.google. com / p / javamagick
Le fichier d'origine est un JPEG RGB (selon Photoshop), je suppose que j'ai besoin du ColorConvertop car l'ordre des octets est différent de celui de l'ordre natif du système. Le problème est de déformer la méthode du filtre. Il faut n'importe où de 1 à 5 à 5 ans pour effectuer l'opération sur une image 3000x4000 qui ne semble pas beaucoup, mais une fois convertie, je peux exécuter une opération de pixel-by-pixel sur l'image dans <25ms. Je ne traite jamais que 1 image à la fois.
Bonjour - 1) JPEG stocke des données dans Big-Endian (Motorola): l'ordre des octets n'est pas un problème. 2) Essayez les fonctions d'image simples pour lire / convertir vos données (vous pourrait i> être capable de convertir dans un appel i> API) et voyez ce qui se passe!
J'utilise imageOo.Lead (flux) pour charger et décoder la JPEG, mais la mémoire tamponneuse qu'elle le renvoie toujours Type_Custom. Existe-t-il et image image pour le dire de décoder à TYPE_INT_RGB?
Oui - Voir ImagtityPespecter () Docs.oracle.com/ Javase / 6 / Docs / API / Javax / ImageO / ... . Voir aussi Stackoverflow.com/questions/429337/...
Si vous avez installé JAI, vous pouvez essayer de le désinstaller, si vous le pouvez ou recherchez un moyen de désactiver le CODECLIB lors du chargement de JPEG. Dans une vie passée, j'ai eu des problèmes similaires (http://www.java.net/node/660804) et ColorConvertop était le plus rapide à l'époque. P>
Si je me rappelle que le problème fondamental est que Java2D n'est pas du tout optimisé pour les images Type_Custom en général. Lorsque vous installez JAI, il est livré avec CodecLib qui a un décodeur qui retourne type_custom et est utilisé au lieu de la valeur par défaut. La liste JAI peut être en mesure de fournir plus d'aide, cela fait plusieurs années. P>
Peut-être essayez peut-être ceci: puis le bitmap source sera modifié. p> plus tard, vous pouvez faire: P> onDraw(Canvas canvas){
canvas.draw(source, rectSrs,rectDestination, op);
}
Les bufferedimages sont douloureusement lents. J'ai eu une solution mais je ne suis pas sûr que vous l'aimerez. Le moyen le plus rapide de traiter et de convertir des images tamponnées consiste à extraire la matrice de données brutes de l'intérieur de la bufferedimage. Vous faites cela en appelant buffimg.gettraster () et la convertir dans le raster spécifique. Puis appelez raster.getDatastorage (). Une fois que vous avez accès aux données brutes, il est possible d'écrire un code de traitement d'image rapide sans toute l'abstraction dans les tampons en bufferedimages le ralentissant. Cette technique nécessite également une compréhension approfondie des formats d'image et de l'ingénierie inverse de votre part. C'est la seule façon dont j'ai pu obtenir le code de traitement d'image pour fonctionner suffisamment rapidement pour mes applications.
Exemple: P>
ByteInterleavedRaster srcRaster = (ByteInterleavedRaster)src.getRaster(); byte srcData[] = srcRaster.getDataStorage(); IntegerInterleavedRaster dstRaster = (IntegerInterleavedRaster)dst.getRaster(); int dstData[] = dstRaster.getDataStorage(); dstData[0] = srcData[0] << 16 | srcData[1] << 8 | srcData[2];
Beau! Travailler avec les données brutes coupez le temps de traitement de 95% !! Voir la poste éditée pour exactement comment j'ai fini par faire cela.
Je n'ai pas fini par utiliser les classes byteinterleeveVeverRaster et IntegerInterleAveDeReveReVraster, car pour une raison quelconque, je n'ai pas les paquets de soleil.
Sainte Crap, je viens de traiter un fichier PSD de 100 Mo + PSD pendant 10 minutes à 8 secondes. Merci!
J'ai trouvé rendu à l'aide de graphiques.Drawimage () au lieu de colorConvertop 50 fois plus vite. Je ne peux que supposer que le drawimage () est accéléré par le GPU.
C'est-à-dire que c'est vraiment lent, comme 50 ms A opte pour 100x200 rectangles p> c.-Ta ce que cela enregistre <1ms pour mêmes entrées p>