Je veux convertir une image en tableau d'octets et vice versa. Ici, l’utilisateur entrera le nom de l’image (.jpg
) et le programme le lira le lira dans le fichier et le convertira en un tableau d’octets.
BufferedImage comprend deux classes principales: Raster et ColorModel. Le raster lui-même est constitué de deux classes, DataBufferByte pour le contenu de l'image, l'autre pour la couleur des pixels.
si vous voulez les données de DataBufferByte, utilisez:
public byte[] extractBytes (String ImageName) throws IOException {
// open image
File imgPath = new File(ImageName);
BufferedImage bufferedImage = ImageIO.read(imgPath);
// get DataBufferBytes from Raster
WritableRaster raster = bufferedImage .getRaster();
DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
return ( data.getData() );
}
vous pouvez maintenant traiter ces octets en cachant du texte dans lsb, par exemple, ou le traiter comme vous le souhaitez.
Si vous utilisez JDK 7, vous pouvez utiliser le code suivant.
import Java.nio.file.Files;
import Java.io.File;
File fi = new File("myfile.jpg");
byte[] fileContent = Files.readAllBytes(fi.toPath())
File fnew=new File("/tmp/rose.jpg");
BufferedImage originalImage=ImageIO.read(fnew);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ImageIO.write(originalImage, "jpg", baos );
byte[] imageInByte=baos.toByteArray();
Essayez cet extrait de code
BufferedImage image = ImageIO.read(new File("filename.jpg"));
// Process image
ImageIO.write(image, "jpg", new File("output.jpg"));
Voici une version complète du code pour cela. Je l'ai testé. Les classes BufferedImage
et Base64
font principalement l'affaire. De plus, certains paramètres doivent être définis correctement.
public class SimpleConvertImage {
public static void main(String[] args) throws IOException{
String dirName="C:\\";
ByteArrayOutputStream baos=new ByteArrayOutputStream(1000);
BufferedImage img=ImageIO.read(new File(dirName,"rose.jpg"));
ImageIO.write(img, "jpg", baos);
baos.flush();
String base64String=Base64.encode(baos.toByteArray());
baos.close();
byte[] bytearray = Base64.decode(base64String);
BufferedImage imag=ImageIO.read(new ByteArrayInputStream(bytearray));
ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg"));
}
}
Consultez javax.imageio
, en particulier ImageReader
et ImageWriter
en tant qu'abstraction pour lire et écrire des fichiers image.
BufferedImage.getRGB(int x, int y)
than vous permet d'obtenir des valeurs RVB sur le pixel donné, qui peuvent être découpées en octets.
Remarque: je pense que vous ne voulez pas lire les octets bruts, car vous devez alors gérer toute la compression/décompression.
Java.io.FileInputStream est ce que vous recherchez :-)
Je pense que la meilleure façon de faire est de commencer par lire le fichier dans un tableau d'octets, puis de convertir le tableau en image avec ImageIO.read ()
Utiliser RandomAccessFile
serait simple et pratique.
RandomAccessFile f = new RandomAccessFile(filepath, "r");
byte[] bytes = new byte[(int) f.length()];
f.read(bytes);
f.close();