J'essaie actuellement d'écrire un programme pour encoder du texte dans un fichier png en ne changeant que le bit le moins significatif pour chaque lettre que je veux encoder dans l'image. J'ai un 'A' qui est 65 et j'utilise 8 octets différents pour coder la lettre A. Donc 01010100<- 10101101<- 11011010<- 10101010<- je change le dernier bit de chacun d'eux et je mets 10110110<- 01010100<- 01010100<- 01010101<- les ensemble donc 65 est 01000001 chaque nombre par la flèche est modifié en fonction du 65.
Si je devais aborder la question d'une autre manière, toute suggestion serait la bienvenue :). C'est juste un petit projet amusant que je voulais faire. Mais bon, revenons à ma question.
Lorsque je lis une image qui ne fait que 4 pixels, j'obtiens 680 octets, ce qui est fou, ou du moins je le pense, peut-être ai-je tort ? 4 pixels avec ARGB à 8 bits chacun devraient être 16 octets avec quelques octets, j'en suis sûr, pour dire au système d'exploitation que c'est un png et comment le gérer. Donc je m'attendais à environ 30 octets. Peut-être moins. Est-ce que je vois les choses de la mauvaise façon ? Lorsque les images png sont compressées, deviennent-elles plus grandes si c'est une petite image ? De plus, lorsque je l'ai sauvegardé sur le disque dur, j'ai toujours obtenu un fichier plus grand. L'image originale était de 8,554 kb et elle s'est transformée en 16kb quand je l'ai sauvegardée. Voici le code pour obtenir les octets de l'image et pour l'enregistrer. Peut-être que je fais quelque chose de mal ou que je ne comprends pas bien.
Voici comment j'obtiens l'image (j'ai essayé 2 choses différentes)
// BufferedImage img = ImageIO.read(new File("image.png")) ;
BufferedImage img= robot.createScreenCapture(new Rectangle(1,2,2,2)) ;
comment j'ai encore sauvé de deux manières différentes.
essayez {
InputStream in = new ByteArrayInputStream(imgBytes) ;
BufferedImage bImageFromConvert = ImageIO.read(in) ;
ImageIO.write(bImageFromConvert, "png", new File( "image.png")) ;//FileOutputStream fos = new FileOutputStream("image.png") ;
//fos.write(b) ;
//fos.close() ;
}catch(Exception e){}
Comment j'ai obtenu les octets de l'image, encore une fois j'ai essayé deux façons différentes, la deuxième façon qui est commentée m'a effectivement donné les 16 octets comme je le voulais, mais quand je l'ai enregistré, Windows ne pouvait pas l'ouvrir parce qu'il ne savait pas ce que c'était, je suppose ? Je ne suis pas sûr, il a juste dit que le fichier n'était pas supporté.
byte[] imageBytes = null ;
essayer{
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
ImageIO.write(image, "jpg", baos ) ;
baos.flush() ;
imageBytes = baos.toByteArray() ;
baos.close() ;
}catch(IOException e){System.out.println(e.getMessage());}// imageBytes = ((DataBufferByte) image.getData().getDataBuffer()).getData() ;
retourner les octets d'image ;
Gracias.