2 votes

Format de fichier PNG et octets d'image ?

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.

1voto

BevynQ Points 3577

Un png est composé d'un grand nombre de métadonnées d'image ainsi que des données brutes de l'image. C'est ce qui vous donne 680 octets.

0voto

Brian Anderson Points 1331

J'ai eu à peu près le même problème avec mes polices de codes barres. Je voulais juste encoder 5 bits de données dans le plus petit PNG que je pouvais obtenir. Ce que je ne voulais pas faire, c'est écrire un programme personnalisé, basé sur libpng. J'ai essayé plusieurs éditeurs et la plus petite taille de fichier que j'ai pu obtenir était d'environ 170 octets.

J'ai finalement trouvé Gimp 2.0. Il y a une fonction que vous pouvez utiliser pour exporter un fichier PNG sans toutes les métadonnées. Je suis aussi passé en niveaux de gris 8 bits. Je pense que je pourrais économiser quelques octets en passant à des niveaux de gris de 2 bits, mais Gimp n'a pas voulu le faire pour moi. Au final, j'étais satisfait avec ~75 octets par caractère.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X