16

画像を bmp 形式で保存しようとしていますが、ファイルが作成されません。代わりに「png」を使用すると、すべて正常に動作します。何か案は?

//This works fine:
ImageIO.write(bi, "png", new File("D:\\MyImage.png"));

//This does not work:
ImageIO.write(bi, "bmp", new File("D:\\MyImage.bmp"));

ImageIO.getWriterFormatNames()「jpg」、「bmp」、「jpeg」などを教えてくれます..

前もって感謝します。

ヤコブ

4

5 に答える 5

0

試しませんでしたが、形式は実際には「bmp」ではなく「BMP」であるべきだと思います。で試してください

ImageIO.write(bi, "BMP", new File("D:\\MyImage.bmp"));

そして何が起こるか見てください。

あなたのバイがどのように構築されているかわかりません。

BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

encodingType は適切に設定されていますか?

あなたのbiが壊れていると思います。それは私にとって完璧に機能します。

BufferedImage bi = new BufferedImage(50,50,BufferedImage.TYPE_INT_RGB);
Graphics gd = bi.getGraphics();
gd.drawRect(0, 0, 10, 10);      
try {
    ImageIO.write(bi, "BMP", new File("C:\\test.bmp"));
    ImageIO.write(bi, "PNG", new File("C:\\test.png"));
} catch (IOException e) {
    System.out.println("error "+e.getMessage());
}
于 2013-09-23T10:45:04.660 に答える
0

古いものですが、BMP は今でも時々役に立ちます。何よりも、答えは最善の解決策を回避します。つまり、自分で行うことです。そうすれば、あらゆるタイプのビットマップで機能します。

static void writeBMP(BufferedImage image, File f) throws IOException {
    OutputStream out = new BufferedOutputStream(new FileOutputStream(f));
    int width = image.getWidth();
    int height = image.getHeight();
    int row = (width * 3 + 3) / 4 * 4;
    out.write('B');
    out.write('M');
    writeInt(out, 14 + 40 + row * height);  // file size
    writeInt(out, 0); 
    writeInt(out, 14 + 40);        // bitmap offset
    writeInt(out, 40);             // size
    writeInt(out, width);          // width
    writeInt(out, height);         // weight
    writeInt(out, (24<<16) | 1);   // planes, bpp
    writeInt(out, 0);              // compression
    writeInt(out, row * height);   // bitmap size
    writeInt(out, 0);              // resx
    writeInt(out, 0);              // resy
    writeInt(out, 0);              // used colors
    writeInt(out, 0);              // important colors
    for (int y=height-1;y>=0;y--) {
        for (int x=0;x<width;x++) {
            int rgba = image.getRGB(x, y); 
            out.write(rgba & 0xFF); // b
            out.write(rgba >> 8);   // g
            out.write(rgba >> 16);  // r
        }   
        for (int x=width*3;x%4!=0;x++) { // pad to 4 bytes
            out.write(0);
        }   
    }   
    out.close();
}   
private static void writeInt(OutputStream out, int v) throws IOException {
    out.write(v);
    out.write(v >> 8);
    out.write(v >> 16);
    out.write(v >> 24);
}   
于 2022-01-11T13:39:25.423 に答える