2015-09-05 1 views
1

Je dois enregistrer BufferedImage en tant qu'image PNG. À l'étape suivante, j'aurai besoin d'ouvrir l'image dans un autre programme (Avisynth). Ce programme est capable d'ouvrir des images, que j'ai dessinées dans ms-paint, mais les images créées par mon programme Java ne sont pas ouvertes. Les images de mon programme et de ms-paint sont de type png, et dans windows cela me semble bon. Cela signifie que je suis capable de l'ouvrir, et l'image contient tout ce que j'ai dessiné. Dans le programme externe, il jette l'erreur suivante:JAVA: Comment créer une image "png" à partir de BufferedImage. L'image doit pouvoir être ouverte dans la bibliothèque DevIL

Avisynth open failure: 
ImageReader error 'Could not open file' in DevIL library. 
reading image"C:\Images\mask\mirror.png" 
DevIL version 166. 
(C:\User\admin\Documents\4555.avs) 

est le code ici. Je l'ai essayé même avec une ligne commentée. J'ai trouvé quelque chose sur google. Ce message est typique du mauvais format d'image. Mais je ne sais pas comment faire la même image que ms-paint.

BufferedImage img = new BufferedImage(video.getWidth(), video.getHeight(), BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2 = (Graphics2D) img.getGraphics(); 
    img.getGraphics().setColor(Color.white); 
    c.paintAll(img.getGraphics()); 
    File f = new File(path + ".png"); 

    opencv_core.IplImage imgs = IplImage.createFrom(img); 
    opencv_highgui.cvSaveImage(f.getPath(), imgs); 
    //ImageIO.write(img, "png", f); 

Dans le code:

c is JComponent, whitch contains the image, whitch I want to save, and I used JavaCL library

+0

Pouvez-vous joindre la ou les mauvaise (s) image (s)? Avez-vous le même problème en utilisant 'ImageIO.write' (le code commenté)? – haraldK

+0

Oui, j'ai eu le même problème en utilisant ImageIO.write. –

+0

voici le lien avec les fichiers: http://rabcan.wz.cz/temp.rar –

Répondre

1

Pour lire/écrire un BufferedImage, vous pouvez utiliser javax.imageio.ImageIO. Vous pouvez également ajouter l'extension TwelveMonkeys qui améliore les opérations d'E/S avec imageio.

Une autre solution consiste à utiliser JAI, mais elle présente des problèmes de fuite de mémoire lors de la lecture des images.

Le format png est un standard, supporté par presque toutes les bibliothèques/logiciels. Si Avisynth ne peut pas ouvrir une image créée avec votre logiciel Java, c'est certainement parce que vous l'avez sauvegardé dans un format rare.

+0

javax.imageio.ImageIO est capable de le faire, merci –

+0

Le TwelveMonkey accélère les opérations d'E/S sur png ... juste au cas où vous auriez besoin de meilleures performances. – FiReTiTi

+0

@FiReTiTi Je suis toujours heureux quand quelqu'un se réfère à la bibliothèque TwelveMonkeys (je suis son auteur principal). Cependant, dans ce cas, je ne pense pas que cela fera une différence. Il n'y a pas de plugin PNG dans la librairie (..yet.J'ai l'intention d'ajouter un "PNGImageWriter" plus rapide un jour). Merci pour la confiance, cependant! ;-) – haraldK

1

J'ai regardé vos images jointes, et moi, elles semblent toutes les deux des fichiers PNG parfaitement valides, et elles s'ouvrent très bien dans n'importe quelle visionneuse/bibliothèque que j'ai essayée. Ils utilisent tous les deux la compression par dégonflage standard, le filtrage adaptatif et sont non entrelacés.

Cependant, il y a une différence importante, et celle qui est écrite à partir de Java a une transparence (canal alpha), contrairement à celle de Paint. Aucun des images ont des pixels transparents, de sorte que vous pouvez essayer de simplement jeter le canal alpha, et voir si cela aide (seulement changer la première ligne de votre code):

int w = video.getWidth(); 
int h = video.getHeight(); 
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); 

TYPE_3BYTE_BGR est ce que les rendements ImageIO PNGReader pour un PNG opaque, donc c'est probablement plus rapide, mais vous pouvez tout aussi bien utiliser TYPE_INT_RGB je pense.

Ce petit changement de code devrait produire une image plus proche de ce que Paint crée. Je suis assez confiant que ce changement devrait produire un PNG que DevIL/Avisynth peut lire.

(Il y a aussi une petite différence entre les images, à savoir que l'image Paint contient explicitement un bloc sRGB (et quelques autres blocs auxiliaires), mais cela ne devrait pas avoir d'importance). À part cela, je vois que DevIL utilise LibPNG (qui est probablement la bibliothèque PNG la plus répandue et la plus répandue) pour lire les fichiers PNG, donc je trouve étrange qu'il ne puisse pas lire ce fichier PNG. Mais, il pourrait être quelque chose à propos de cette version, de la façon dont elle est construite ou quelque chose (je ne suis pas un programmeur C/C++, et je ne connais pas la bibliothèque en profondeur). Vous devriez probablement parler à (poser un problème avec) les développeurs de la bibliothèque/programme à ce sujet.