1

BufferedImage を png 画像として保存する必要があります。次のステップでは、別のプログラム (Avisynth) で画像を開く必要があります。このプログラムは、ms-paint で描画した画像を開くことができますが、Java プログラムで作成した画像を開くことはできません。私のプログラムとms-paintの画像はpngのタイプで、Windowsでは良さそうです。それを開くことができ、画像には私が描いたものがすべて含まれていることを意味します。外部プログラムでは、次のエラーがスローされます。

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) 

ここにコードがあります。コメント行でも試してみました。私はグーグルで何かを見つけました。このメッセージは、不適切な画像形式の場合によく見られます。しかし、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);

コード内:

cはJComponentで、保存したい画像が含まれており、JavaCLライブラリを使用しました

4

2 に答える 2

1

添付の画像を確認しましたが、どちらも完全に有効な PNG ファイルのようで、試したビューア/ライブラリで問題なく開くことができます。どちらも標準のデフレート圧縮と適応フィルタリングを使用し、非インターレースです。

ただし、重要な違いが 1 つあります。それは、Java から作成されたものには透明度 (アルファ チャネル) があるのに対し、ペイントから作成されたものにはないことです。どの画像にも透明なピクセルがないため、アルファ チャネルを破棄して、それが役立つかどうかを確認できます (コードの最初の行のみを変更します)。

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

TYPE_3BYTE_BGRImageIOPNGReaderが不透明な PNG に対して返すものなので、おそらく高速ですが、同様に使用できるTYPE_INT_RGBと思います。

このコードの小さな変更により、ペイントが作成するものにより近い画像が生成されるはずです。この変更により、DevIL/Avisynth が読み取れる PNG が生成されると確信しています。

(画像間にはもう 1 つの小さな違いがあります。つまり、ペイント画像には明示的にsRGBチャンク (およびその他の補助チャンク) が含まれていますが、それは問題ではありません)。

それ以外では、DevIL が LibPNG (おそらく最も標準的で広く使用されている PNG ライブラリ) を使用して PNG を読み取っていることがわかります。しかし、それはこのバージョン、その構築方法、または何かに関するものかもしれません (私は C/C++ プログラマーではなく、ライブラリの詳細も知りません)。これについては、おそらくライブラリ/プログラムの開発者と話し合う (問題を報告する) 必要があります。

于 2015-09-07T08:33:03.857 に答える