2016-09-22 5 views
0

Я использую TelegramBots API Java от rubenlagus для разработки моего бонуса Telegram. Я могу успешно отправить фотографию боту, а также получить фотографию с телеграммы, как показано на рисунке this example. Проблема в том, что загруженное изображение меньше, а также плохое по качеству по сравнению с загруженным фактическим изображением. Я сохраняю изображение как blob с использованием Java Persistence (JPA). Вот мой кодTelegram Bot Java Library Скачано изображение Качество

Образец кода, который получает изображение от клиента;

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

Загрузить File Method;

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

, если вы получили от rubenlagus, почему бы вам не поговорить с rubenlagus ?? – gpasch

+0

, а что это делать с JPA? у вас есть некоторые байты изображения, и вы сохраняете его и retri накануне ... это будет одно и то же. Поэтому проблема не в JPA. Так что отладка, где проблема –

+0

@gpasch уже сделано, что еще не повезло .. – kabugima2

ответ

0

Есть несколько возможностей здесь происходит:

  1. Когда вы получаете a Message в боте api, объект photo представляет собой массив из PhotoSize. Вам нужно убедитесь, что вы загружаете больше в этом массиве (параметры width и heigth).

  2. При отправке фотографии с помощью sendPhoto метода Телеграммы сжать фото (такие же, как отправка фото с любого из официальных приложений. Это означает, что ваше фото может потерять некоторое качество. Если вы не хотите, чтобы это произошло , вы всегда можете использовать метод sendDocument.

Надеется, что это объясняет проблему.

+0

Спасибо Рубен. Это сработало. – kabugima2