web-dev-qa-db-ja.com

バイト配列から画像を変換して表示する

サーバーからバイト配列の画像に関するデータを取得するプログラムを作成しています。このデータを24ビットBMP形式(jpeg、png、bmp、8-24-32bpp)に変換しています)。最初にHDに保存し、次に ' m JLabelのアイコンにロードします。次の例外が発生する場合がありますが、完全に機能します。

Java.io.EOFException at
javax.imageio.stream.ImageInputStreamImpl.readFully(ImageInputStreamImpl.Java:353) at
com.Sun.imageio.plugins.bmp.BMPImageReader.read24Bit(BMPImageReader.Java:1188) at
com.Sun.imageio.plugins.bmp.BMPImageReader.read(BMPImageReader.Java:843) at
javax.imageio.ImageIO.read(ImageIO.Java:1448) at 
javax.imageio.ImageIO.read(ImageIO.Java:1308)

この行(2番目)の場合

File imgFile = new File("d:/image.bmp");
BufferedImage image = ImageIO.read(imgFile);

これらの場合:

  • 画像はJLabelに読み込まれませんが、HDで見つけることができます
  • 何かが「スリップ」するため、変換は適切ではありません
  • この画像は、Word文書で斜体を使用した場合のようなものです

最初に、bppが問題であると思い、次に写真が大きすぎると思いましたが、両方の提案で機能する場合と機能しない場合があります。私はここで少し立ち往生していて、アイデアを喜んでいるでしょう。

6
bajla
  • word文書で斜体を使用すると、画像は..のようになります。

私はついにこの弾丸アイテムが今意味するものを手に入れたと思います.. ;-)

投機的な答えですが、ここに行きます:

書き込んだ画像が「歪んでいる」ように見える場合は、BMP形式で指定されているように(またはBMP)の幅フィールドが正しくないため、各列のパディングが欠落していることが原因である可能性があります。ヘッダー)。次に、EOF例外の場合、幅が4の倍数ではない画像を取得すると仮定します。

ImageIOを使用してBMPを作成し、それが役立つかどうかを確認してください。

private static BufferedImage createRGBImage(byte[] bytes, int width, int height) {
    DataBufferByte buffer = new DataBufferByte(bytes, bytes.length);
    ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
    return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, width * 3, 3, new int[]{0, 1, 2}, null), false, null);
}

.。

byte[] bytes = ...; // Your image bytes
OutputStream stream = ...; // Your output

BufferedImage image = createRGBImage(bytes, width, height);

try {
    ImageIO.write(image, "BMP", stream);
}
finally {
    stream.close();
}
7
haraldK

クラス名で呼んでください、liek ClassName.byteArrayToImage(byte)

public static BufferedImage  byteArrayToImage(byte[] bytes){  
        BufferedImage bufferedImage=null;
        try {
            InputStream inputStream = new ByteArrayInputStream(bytes);
            bufferedImage = ImageIO.read(inputStream);
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        return bufferedImage;
}
2
Azad

このコードを使用して、出力画像をバイト配列に変換できます

   Blob b = rs.getBlob(2);
   byte barr[] = new byte[(int)b.length()]; //create empty array
   barr = b.getBytes(1,(int)b.length());

   FileOutputStream fout = new FileOutputStream("D:\\sonoo.jpg");
   fout.write(barr);
0
Mohsin Shaikh