2016-09-21 58 views
0

我正在一個錯誤,而谷歌查詢API願景:谷歌雲願景API - 「圖像註釋::錯誤的要求:圖像處理錯誤」

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

我已經通過其中包含的圖像和PDF文件然後使用pdfbox創建AnnotateImageRequest列表

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); 
      } 
    } 
} 

提取的圖像並通過上述視力服務創建的列表:

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

我也試圖消除圖像字節組的64位編碼,但仍坐上top.The ByteArray的長度列出了同樣的錯誤是「」

有一些東西,我很想念,因爲當我將多部分圖像添加到servlet並傳遞從輸入流中獲取的bytearray,它可以正常工作。

我在Tomcat V8運行的應用程序使用

依賴條件:

<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()'傳遞原始pi xel數據沒有任何大小信息。這是谷歌API需要什麼? PDFBox也可以用'PDImageXObject.getImage()'返回一個'BufferedImage',然後你可以用ImageIO.write()把它保存到一個流中。 EncodeContent沒有解釋它需要什麼。 https://developers.google.com/resources/api-libraries/documentation/vision/v1/java/latest/com/google/api/services/vision/v1/model/Image.html#encodeContent(字節[]) –

+0

我不知道內部細節。我也看到了相同的javadoc,然後使用'com.google.api.client.util.Base64'編碼圖像流。 – akgaur

+1

你可以嘗試我在第一條評論中提到的內容,或者你需要一些代碼嗎?這個想法是,你寫一個ByteArrayOutputStream,然後從那裏取出字節數組,然後做你已經做過的encode64的東西。 –

回答

1

由於Tilman Hausherr

我改變了我的代碼按他的建議和它的作品:

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); 
}