2017-06-04 2 views
0

D'abord un peu de contexte. J'ai besoin de retourner une image PNG. Je reçois l'information par octet (dans l'ordre) et je dois le retourner comme un flux. Je parviens à diviser et analyser les morceaux. Mais quand j'ai les données de bloc IDAT je ne sais pas quoi faire avec pour le retourner.Morceau IDAT sous-dimensionné pour retourner l'image

INFO de la IHDR: profondeur de bit = 08 (8 bits par échantillon) et le type de couleur = 06. L'image est de 800 x 600 = 480000

taille IDAT est 179502 sorte que soit 0,374 de la total de la taille de pixel (étrange).

Si je retourne les pixels (toutes les données IDAT telles qu'elles sont), j'obtiens une image qui, lorsque j'ouvre, affiche simplement une image transparente. J'ai aussi essayé d'utiliser 4 octets = 1 pixel car j'ai RGB + alpha mais toujours pas de bon résultat. (Toujours une image transparente ... c'est aussi très bizarre ... j'espérais des images aléatoires, pas des images transparentes). J'ai lu que l'information est compressée, donc mon plan est décompressez-le, retourner le tableau RVB, puis compresser à nouveau, mais ... comment puis-je décompresser et compresser à nouveau? Je ne peux pas trouver l'info/l'algorithme pour le faire.

Je trouve aussi l'hex 0x78 presque toujours après la partie IDAT, donc j'ai déduit que le tableau de pixels de compression ne démarre pas directement après l'IDAT mais quelques octets après ... Si oui ... Comment ça s'organise ? est-ce seulement un tableau de pixels direct ou a-t-il des informations avant et/ou après dans les données de bloc IDAT?

+0

J'espère avoir été assez clair avec ma question et je demande pardon pour mon anglais qui n'est pas parfait. –

Répondre

1

Le ou les blocs IDAT comprennent les données de pixels de l'image, pré-filtrées et compressées. Pour obtenir le RVB vous aurez besoin de:

  • concaténer tous les morceaux IDAT
  • Décompressez le flux (ZLIB)
  • unfilter le filter appliqué à chaque ligne
  • selon la pixel format de l'image vous pourriez avoir les composants RVB dans chaque octet, ou peut-être en mots, ou peut-être en quelques bits (et peut-être ne sont pas des composants RVB, mais des index en Palette, ou en niveaux de gris ou avec Alpha ...)

En bref, vous devez décoder une image PNG, ce qui n'est pas trivial. Il y a beaucoup de décodeurs PNG là-bas, donc je ne sais pas pourquoi vous voudriez faire la roue. Si vous voulez vraiment le faire vous-même, alors vous devez lire les détails du PNG standard.

+0

Je ne suis pas tout à fait sûr aussi, le professot m'a juste dit de le faire de cette façon ... Je vais appliquer le stéganographie dernier donc je suppose qu'il veut le faire comme un "apprentissage" sur comment ça marche mais qui sait. En tout cas, très utile l'information, j'ai déjà téléchargé ZLIB et je suis donc en train de suivre vos pas là-dedans. BTW, pouvez-vous nommer certains des décodeurs PNG que vous avez dit? Cela peut m'aider à vérifier les résultats par exemple. –

+0

Le fichier "canonique" est [libpng] (http://www.libpng.org/pub/png/libpng.html). J'ai codé en Java, [PNGJ] (https://github.com/leonbloy/pngj). La mission semble fou, cependant. Êtes-vous sûr de cela? Cela aurait plus de sens avec un format d'image plus simple, comme BMP. – leonbloy

+0

Je vais lui parler, je suppose qu'il a pensé à bmp qui est plus simple, il suffit de lire l'en-tête et d'utiliser les bits comme ça ... Je viens de tomber sur votre dépôt github et je le télécharge :) Merci beaucoup pour l'aide. –