كيفية تحويل مجموعة البايت إلى صورة مخزنة
-
21-12-2019 - |
سؤال
لدي كود جافا من جانب الخادم الذي يحصل على مصفوفة بايت من العميل.من أجل القيام ببعض معالجة الصور، أحتاج إلى تحويل مصفوفة البايت إلى ملف BufferedImage
.لدي رمز من المفترض أن يفعل ذلك هنا:
public void processImage(byte[] data) {
ByteArrayInputStream stream = new ByteArrayInputStream(data);
BufferedImage bufferedImage;
bufferedImage = ImageIO.read(stream);
// bufferedImage is null
//...
}
لكن هذا لا ينجح؛صورة المخزن المؤقت فارغة.وفقًا لوثائق ImageIO:
إذا لم يكن مسجلا
ImageReader
يدعي أنه قادر على قراءة الدفق الناتج،null
يتم إرجاع.
كيف أخبر ImageReader
ما هو نوع الصورة.على سبيل المثال، إذا كنت أعرف أن الصورة بتنسيق 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.(على سبيل المثال، إذا كنت قد حاولت للتو تنزيله، فقد يكون لديك مستند HTML يقدم تشخيصًا للخطأ.) إذا كان الأمر كذلك، فستحتاج إلى العثور على سبب ذلك وإصلاحه.
ومع ذلك، إذا كنت "تعرف" أن مصفوفة البايت تحتوي على صورة بتنسيق معين، فيمكنك القيام بشيء مثل هذا:
- يستخدم
ImageIO.getImageReadersByFormatName
أوImageIO.getImageReadersByMIMEType
للحصول علىIterator<ImageReader>
. - اسحب الأول
ImageReader
منIterator
. - يخترع
MemoryCacheImageInputStream
التفاف أByteArrayInputStream
للأنواع. - يستخدم
ImageReader.setInput
لربط القارئ بالImageInputStream
. - يستخدم
ImageReader.read
للحصول علىBufferedImage
.