バイト配列をバッファリングされた画像に変換する方法
-
21-12-2019 - |
質問
私はクライアントからバイト配列を取得するサーバーサイドのJavaコードを持っています。画像処理を実行するためには、バイト配列をBufferedImage
に変換する必要があります。私はここでそれをすることになっているコードを持っています:
public void processImage(byte[] data) {
ByteArrayInputStream stream = new ByteArrayInputStream(data);
BufferedImage bufferedImage;
bufferedImage = ImageIO.read(stream);
// bufferedImage is null
//...
}
.
しかしこれはうまくいきません。BufferedImageはNULLです。ImageIOのマニュアルによると:
結果のストリームを読み取ることができるように登録されていない場合は、
ImageReader
が返されます。
null
にどのような画像タイプがあるかを教えてください。たとえば、JPEG(私の場合、それがある)である画像を知っている場合、私は何をすることになっていますか?
編集:ファイルがJPEG形式ではない可能性が高いという提案をありがとう。これは、データをサーバーに送信するクライアントサイドコードです。
import org.json.JSONObject;
// Client-side code that sends image to server as String
public void sendImage() {
FileInputStream inputStream = new FileInputStream(new File("myImage.jpg"));
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((bytesRead = inputStream.read(b)) != -1) {
byteStream.write(b,0,bytesRead);
}
byte[] byteArray = byteStream.toByteArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("data",new String(byteArray));
// ... more code here that sends jsonObject in HTTP post body
}
.
とこれはprocessImage()関数を呼び出すサーバーサイドコードです。
// Server-side code that calls processImage() function
public void handleRequest(String jsonData) {
JSONObject jsonObject = new JSONObject(jsonData);
processImage(jsonObject.getString("data").getBytes());
}
. 解決
最も可能性の高い説明は、バイト配列がJPEGイメージを含むことです。(たとえば、ダウンロードしようとした場合は、Error Diagnosticが診断されたHTML文書がある可能性があります。)その場合は、これが何を原因であるかを見つけて修正する必要があります。
しかし、バイト配列に与えられたフォーマットの画像が含まれていることを「知っている」場合は、次のようなものができます。
-
ImageIO.getImageReadersByFormatName
またはImageIO.getImageReadersByMIMEType
を使用して、Iterator<ImageReader>
を使用します。 -
ImageReader
から最初のIterator
を引きます。 -
MemoryCacheImageInputStream
を作成します。タイプのByteArrayInputStream
を作成します。 -
ImageReader.setInput
を使用して、リーダーをImageInputStream
に接続します。 -
ImageReader.read
を使用してBufferedImage
を使用します。
所属していません StackOverflow