2016-09-22 7 views
0

私は電文ロボットを開発するためにrubenlagusによってTelegramBots Java APIを使用しています。私は首尾よく写真をボットに送ることができ、this exampleのようにテレグラムから写真を取り出すこともできます。問題は、実際にアップロードされた画像と比較してダウンロードした画像が小さく、品質も劣ることです。 Java Persistence(JPA)を使用してイメージをブロブとして保存していますか?ここに私のコードですテレグラムボットJavaライブラリダウンロード画像の品質

クライアントからのイメージを受け取るサンプルコード;

List<PhotoSize> photos = message.getPhoto(); 
      System.out.println("Photos --> " + photos.size()); 
      for (int i = 0; i < photos.size(); i++) { 

       GetFile getFileRequest = new GetFile(); 

       getFileRequest.setFileId(photos.get(i).getFileId()); 
       File file = getFile(getFileRequest); 
       // System.out.println(file.getFilePath()); 
       downloadFilePath = filePathUrl + file.getFilePath(); 
       System.out.println("Photo --> " + downloadFilePath); 
       java.io.File fileFromSystem =downloadFile(downloadFilePath); 

       byte[] bytes = new byte[(int) fileFromSystem.length()]; 

       System.out.println(photo Size --> " + bytes.length); 

       FileInputStream fileInputStream = new FileInputStream(fileFromSystem); 
       fileInputStream.read(bytes); 
       myEntity.setPhoto(bytes); 
       myFacade.edit(myEntity); 

ダウンロードファイルメソッド;

private java.io.File downloadFile(String fileUrl) { 
    java.io.File file = null; 
    try { 

     sysProps = System.getProperties(); 
     URL url = new URL(fileUrl); 
     InputStream in = url.openStream(); 
     String directoryPath = sysProps.getProperty("file.separator") + sysProps.getProperty("user.home") + sysProps.getProperty("file.separator") + "Documents" + sysProps.getProperty("file.separator") + "dev"; 
     java.io.File directory = new java.io.File(directoryPath); 

     String pathToFile = directoryPath + sysProps.getProperty("file.separator") + new Random().nextInt(100) + fileUrl.substring(fileUrl.lastIndexOf("/") + 1); 

     if (!directory.exists()) { 
      directory.mkdirs(); 
     } 
     file = new java.io.File(pathToFile); 
     file.createNewFile(); 

     FileOutputStream outputStream = new FileOutputStream(file); 
     int read = 0; 

     byte[] bytes = new byte[10000]; 
     while ((read = in.read(bytes)) != -1) { 
      outputStream.write(bytes, 0, read); 

     } 
     outputStream.flush(); 
     outputStream.close(); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return file; 
} 

クライアントにイメージを送信するコード(変換バイト[]エンティティから、クライアントに送信します)

String strFilePath = sysProps.getProperty("user.home") + sysProps.getProperty("file.separator") + "Documents" + sysProps.getProperty("file.separator") + "dev" + sysProps.getProperty("file.separator") + new Random().nextInt(100) + ".jpeg"; 
       FileOutputStream fos = new FileOutputStream(strFilePath); 
       fos.write(myEntity.getPhoto()); 
       fos.close(); 

       SendPhoto sendPhotoRequest = new SendPhoto(); 
       sendPhotoRequest.setChatId(message.getChatId().toString()); 
       java.io.File fileToSend = new java.io.File(strFilePath); 
       sendPhotoRequest.setNewPhoto(fileToSend); 

       // System.out.println("Sending phtoto --> " + strFilePath); 
       sendPhoto(sendPhotoRequest); 
       fileToSend.delete(); 
+0

あなたは?? – gpasch

+0

をrubenlagusする話いけない理由rubenlagusからもらったとJPAを行うためにこれを持っている場合はどう?あなたは、いくつかを持っていますイメージバイト、それを保持しretriそれはまったく同じです。だから問題はJPAにはない。だから問題がどこにあるのかデバッグ –

+0

@gpaschはすでに運がなかったので。 – kabugima2

答えて

0

ここで起こっていくつかの可能性があります:あなたが得るとき

  1. は、ボットapi内のMessagephotoオブジェクトはPhotoSizeの配列です。 が必要です。をそのアレイにダウンロードしてください(widthheigthのパラメータをチェックしてください)。

  2. sendPhoto方法、電報を使用して写真を送信する公式アプリがいずれかから写真を送信すると同じ(写真を圧縮する。これは、あなたの写真がいくつかの品質を失うことを意味する。これが起こるしたくない場合、あなたは常にsendDocumentメソッドを使用することができます。

ホープ、これは問題を説明しています。

+0

Rubenに感謝します。出来た。 – kabugima2

関連する問題