Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Menukar BufferedInputStream daripada Pangkalan Data kepada BufferedImage?

Bagaimana untuk Menukar BufferedInputStream daripada Pangkalan Data kepada BufferedImage?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-13 09:47:02149semak imbas

How to Convert a BufferedInputStream from a Database to a BufferedImage?

Menukar BufferedInputStream kepada Imej

Masalah:

Bagaimana saya boleh menukar objek BufferedInputStream, yang diambil daripada pangkalan data, ke dalam BufferedImage? Kod sedia ada mengembalikan imej nol.

Penyelesaian:

  1. Sahkan bahawa BufferedInputStream mengandungi imej yang sah. Simpannya pada fail dan kemudian baca semula sebagai BufferedImage untuk mengesahkan.
  2. Pastikan panjang Blob yang betul digunakan apabila mendapatkan bait. Untuk pangkalan data H2, panjang dikembalikan sebagai panjang, tetapi Blob#getBytes menjangkakan int.
  3. Sebagai alternatif, gunakan Blob#getBinaryStream dan bukannya Blob#getBytes. Ini mungkin perlu jika pangkalan data tidak menyimpan kandungan Blob dalam ingatan.

Contoh:

Kod Java berikut menggunakan Blob#getBinaryStream untuk membaca imej daripada pangkalan data dan tukarkannya kepada BufferedImage:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.imageio.ImageIO;

public class ImageDatabaseHelper {

    private Connection con;

    public BufferedImage loadImage(int imageId) throws IOException, SQLException {

        PreparedStatement stmt = null;
        ResultSet rs = null;
        BufferedImage image = null;

        try {

            stmt = con.prepareStatement("select image from images where id = ?");
            stmt.setInt(1, imageId);
            rs = stmt.executeQuery();

            while (rs.next()) {

                Blob blob = rs.getBlob(1);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                try (ByteArrayInputStream bais = new ByteArrayInputStream(blob.getBinaryStream())) {
                    ImageIO.read(bais).writeTo(baos);
                }
                image = ImageIO.read(new ByteArrayInputStream(baos.toByteArray()));
            }

        } finally {
            try {
                rs.close();
            } catch (Exception e) {
            }
            try {
                stmt.close();
            } catch (Exception e) {
            }
        }

        return image;
    }

}

Atas ialah kandungan terperinci Bagaimana untuk Menukar BufferedInputStream daripada Pangkalan Data kepada BufferedImage?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn