سؤال

لدي كود جافا من جانب الخادم الذي يحصل على مصفوفة بايت من العميل.من أجل القيام ببعض معالجة الصور، أحتاج إلى تحويل مصفوفة البايت إلى ملف 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 يقدم تشخيصًا للخطأ.) إذا كان الأمر كذلك، فستحتاج إلى العثور على سبب ذلك وإصلاحه.

ومع ذلك، إذا كنت "تعرف" أن مصفوفة البايت تحتوي على صورة بتنسيق معين، فيمكنك القيام بشيء مثل هذا:

  1. يستخدم ImageIO.getImageReadersByFormatName أو ImageIO.getImageReadersByMIMEType للحصول على Iterator<ImageReader>.
  2. اسحب الأول ImageReader من Iterator.
  3. يخترع MemoryCacheImageInputStream التفاف أ ByteArrayInputStream للأنواع.
  4. يستخدم ImageReader.setInput لربط القارئ بال ImageInputStream.
  5. يستخدم ImageReader.read للحصول على BufferedImage.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top