J'ai besoin de retourner en Java une image brute dont les lignes sont inversées. Par inversé je veux dire, la première rangée de l'image est stockée à la fin d'un fichier.Renverser verticalement une image brute en Java
J'ai réussi à réaliser ce que je voulais en réorganisant les rangées d'images en utilisant un tampon auxiliaire. J'ai inclus mon code ci-dessous.
Je pense que cela peut être optimisé en traduisant les coordonnées, en évitant la copie de la mémoire. J'ai essayé d'implémenter un DataBuffer qui inverserait les lignes, mais le raster que j'utilise nécessite un DataBufferByte (une classe finale).
Est-ce que quelqu'un connaît une manière plus optimisée de faire ce que je veux?
Merci
...
int w = 640;
int h = 480;
byte[] flippedData = new byte[640*480*4];
int scanLineLength = w*4;
for(int i=0;i!=h; ++i) {
System.arraycopy(originalData, scanLineLength*i, flippedData, scanLineLength*(h-i)-scanLineLength, scanLineLength);
}
DataBuffer db = new DataBufferByte(flippedData,flippedData.length);
WritableRaster raster = Raster.createInterleavedRaster(db, w, h, scanLineLength, 4, new int[]{2,1,0}, new Point(0,0));
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel cm = new ComponentColorModel(cs, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
BufferedImage img = new BufferedImage(cm, raster, false, null);
ImageIO.write(img, "JPEG", new File("out.jpg"));
ce qui est la raison de votre hardcoding un codage de pixels et un ColorSpace? Si vous faites un * GraphicsEnvironment.getLocalGraphicsEnvironment(). getDefaultScreenDevice(). getDefaultConfiguration(). createCompatibleImage (...) * vous aurez un encodage de pixels qui convient le mieux à la plate-forme sur laquelle votre programme s'exécute. – SyntaxT3rr0r
Je suis votre code que vous transmettez une variable DataBuffer au Raster, pas un DataBufferByte. – codymanix
@Webinator: parce que je ne veux pas montrer l'image à l'écran – jassuncao