2016-09-21 5 views
0

ich eine Störung erhalte, während Google Vision-API abfragt:Google Cloud Vision-API - "Bild-Kommentator :: Malformed Anfrage .: Bildverarbeitungsfehler"

{ 
     "responses" : [ { 
     "error" : { 
      "code" : 3, 
      "message" : "image-annotator::Malformed request.: Image processing error!" 
     } 
     } ] 
    } 

ich eine PDF-Datei vergangen sind, die Bilder enthält und dann extrahiert Bild pdfbox mit AnnotateImageRequest Liste

List<AnnotateImageRequest> visionRequests = new ArrayList<>(); 
PDDocument document = PDDocument.load(pdfDatastream); 
for (PDPage page : document.getPages()) { 
    PDResources resources = page.getResources(); 
    for (COSName xObjectName : resources.getXObjectNames()) { 
     PDXObject pdxObject = resources.getXObject(xObjectName); 
      if (pdxObject instanceof PDImageXObject) { 
       byte[] imageArray = Base64.encodeBase64(IOUtils.toByteArray(((PDImageXObject) pdxObject).createInputStream())); 
       System.out.println("image >>"+imageArray.length); 
       Image image = new Image(); 
       image.encodeContent(imageArray); 

       Feature feature = new Feature(); 
       feature.setType("TEXT_DETECTION"); 

       AnnotateImageRequest annotateImageRequest = new AnnotateImageRequest(); 
       annotateImageRequest.setImage(image); 
       annotateImageRequest.setFeatures(Arrays.asList(feature)); 
       visionRequests.add(annotateImageRequest); 
      } 
    } 
} 

und reichte die Liste oben Vision Service erstellt zu erstellen:

BatchAnnotateImagesResponse visionSrvcResponse = visionSrvc.images().annotate(new BatchAnnotateImagesRequest().setRequests(visionRequests)).execute(); 
System.out.println(visionSrvcResponse.toPrettyString()); 

Ich habe auch versucht, die Base64-Codierung von Bild bytearray entfernt, aber immer noch der gleiche Fehler auf top.the bytearray Länge aufgelistet bekommen „774.800

Gibt es etwas, was mir fehlt, denn wenn ich ist Multipart ein Bild an das Servlet und übergeben Sie das Bytearray erhalten aus dem Eingangsstrom funktioniert es gut.

Ich bin mit der Anwendung auf Tomcat V8

dependecies verwendet:

<dependency> 
    <groupId>org.apache.tika</groupId> 
    <artifactId>tika-core</artifactId> 
    <version>1.13</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.tika</groupId> 
    <artifactId>tika-parsers</artifactId> 
    <version>1.13</version> 
</dependency> 
<dependency> 
    <groupId>com.google.apis</groupId> 
    <artifactId>google-api-services-vision</artifactId> 
    <version>v1-rev24-1.22.0</version> 
</dependency> 
+0

'PDImageXObject.createInputStream()' liefert das rohe Pi xel Daten ohne irgendeine Größeninformation. Ist das, was diese Google API benötigt? PDFBox kann auch ein 'BufferedImage' mit' PDImageXObject.getImage() 'zurückgeben, das Sie dann mit ImageIO.write() in einem Stream speichern können. EncodeContent erklärt nicht, was es benötigt. https://developers.google.com/resources/api-libraries/documentation/vision/v1/java/latest/com/google/api/services/vision/v1/model/Image.html#encodeContent (byte []) –

+0

Ich kenne keine internen Details. Ich sah auch das gleiche Javadoc und kodierte dann den Bildstrom mit 'com.google.api.client.util.Base64'. – akgaur

+1

Können Sie versuchen, was ich in meinem ersten Kommentar erwähnte oder benötigen Sie einen Code? Die Idee ist, dass Sie in einem ByteArrayOutputStream schreiben, dann nehmen Sie das Byte-Array von dort, dann machen Sie das encode64-Zeug, das Sie bereits tun. –

Antwort

1

Dank Tilman Hausherr

ich meinen Code gemäß seinem Vorschlag geändert und es funktioniert:

if (pdxObject instanceof PDImageXObject) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ImageIO.write(((PDImageXObject) pdxObject).getImage(), "jpg", baos); 
    baos.flush(); 
    byte[] imageInByte = baos.toByteArray(); 

    Image image = new Image(); 
    image.encodeContent(imageInByte); 

    Feature feature = new Feature(); 
    feature.setType("TEXT_DETECTION"); 

    AnnotateImageRequest annotateImageRequest = new AnnotateImageRequest(); 
    annotateImageRequest.setImage(image); 
    annotateImageRequest.setFeatures(Arrays.asList(feature)); 
    visionRequests.add(annotateImageRequest); 
}