简体   繁体   中英

Telegram Bot Java Library Downloaded Image Quality

I am using TelegramBots Java API by rubenlagus to develop my Telegram Bot. I am able to successfully send a photo to the bot and also retrieve the photo from Telegram as illustrated by this example . Problem is that the image downloaded is smaller and also poor in quality as compared to actual image uploaded. Am storing the image as a blob using Java Persistence (JPA). Here's my code

Sample Code That Receives Image from Client;

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

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

Code That Sends Image To Client(Converts bytes[] from entity and sends to client)

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

There are several possibilities going on here:

  1. When you get a Message in the bot api, the photo object is an array of PhotoSize . You need to make sure you are downloading the bigger one in that array (checking width and heigth parameters).

  2. When sending a photo using sendPhoto method, Telegram compress the photo (same as sending the photo from any of the official apps. This mean your photo may lose some quality. If you don't want this to happen, you can always use sendDocument method.

Hope this explains the problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM