2010-05-06 5 views
0

J'ai besoin de traduire les couleurs en bitmap chargé en BufferedImage de RGB à YCbCr (luminance et chrominance à 2 canaux) et retour après le processus.Comment utiliser les espaces de couleurs BufferedImage et YCbCr?

Je l'ai fait avec des fonctions utilisées comme rgb2ycbcr() dans la méthode principale pour chaque pixel, mais ce n'est pas une solution si intelligente. Je devrais utiliser les classes ColorSpace et ColorModel pour obtenir BufferedImage avec l'espace de couleur correct. Ce serait une méthode plus souple, mais je ne sais pas comment faire cela.

Je suis perdu et j'ai besoin de conseils. Quelqu'un peut-il m'aider?

Répondre

2

Comme je l'ai bien compris votre question, vous voulez faire ce qui suit:

Charge image RVB ->processus YCbCr l'image ->Utiliser l'image RVB à nouveau

Et vous voulez que nous vous aider à rendre ce processus aussi transparent que possible. Tout d'abord, vous voulez que nous vous donnions un moyen simple d'éviter les pièces -> (conversion). J'ai regardé dans le BufferedImage documentation. Il semble, comme s'il n'existe pas un moyen de changer le ColorSpace d'un BufferedImage une fois créé.

Vous pouvez créer un nouveau BufferedImage avec un espace colorimétrique YCbCr pour que vous puissiez utiliser le ICC_ColorSpace prédéfini. Ensuite, vous copiez les données de votre ancienne image, éventuellement via ColorSpace.fromRGB, dans l'espace colorimétrique YCbCr, effectuez le traitement d'image, puis convertissez à nouveau via ColorSpace.toRGB. Cette méthode nécessite de convertir complètement l'image avant et après le traitement via les méthodes existantes. En outre, vous devez savoir, comment ICC_ColorSpace convertit votre image en espace colorimétrique YCbCr. Sinon, vous ne pouvez pas savoir quels indices de tableau correspondent au même pixel.

Si vous souhaitez simplement créer une enveloppe autour du RGB-BufferedImage qui vous permet de manipuler cette image, comme s'il s'agissait d'une image YCbCr, cela n'est pas possible avec BufferedImage.

EDIT: Pour convertir l'espace colorimétrique d'un BufferedImage, utilisez ColorConvertOp. Le code ressemblerait à quelque chose comme ceci:

ColorConvertOp cco = new ColorConvertOp(new YCbCrColorSpace(), null); 
BufferedImage ycbcrImage = cco.filter(oldRGBImage, null); 

Cela vous oblige à soit écrire votre propre classe ColorSpace ou vous pouvez télécharger et utiliser les classes mentionnées here. Si vous voulez juste charger une image JPEG, vous devez utiliser le predefined classes.

+0

Mais je ne sais toujours pas comment faire ça. Je suis perdu et je peux trouver n'importe quoi au-dessus de la documentation des classes. C'est tellement différent des fonctions statiques. Des exemples? J'écris l'implémentation de l'algorithme JPEG et j'ai besoin de convertir en YCbCr et séparer les canaux avant la fragmentation. Maintenant, je travaille avec de nombreux tableaux et fonctions. Ce n'est pas si flexible que je veux. – Szopinski

+0

Peut-être que la classe 'BufferedImage' n'est pas ce que vous cherchez. Si vous voulez juste que votre codeur (dé) Jpeg procédural fasse plus de POO, essayez quelque chose d'autre. Une possibilité consiste à créer une classe pour chaque étape du pipeline de codage (dé) encodage Jpeg. – ablaeul

+0

Ok. Depuis le début :) Je dois ouvrir l'image, séparer les canaux Y, Cb, Cr et fragmenter chaque canal avant la compression. J'ai donc besoin de BufferedImage avec les méthodes getY(), getCb, getCr() ou trois avec un canal pour chacun. Comment faire ça? – Szopinski

Questions connexes