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.
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
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
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