Telegram Bot Java 库下载图像质量
Telegram Bot Java Library Downloaded Image Quality
我正在使用 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。问题是与实际上传的图片相比,下载的图片更小,质量也更差。我正在使用 Java Persistence (JPA) 将图像存储为 blob。这是我的代码
从客户端接收图像的示例代码;
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();
这里有几种可能性:
当你得到一个Message in the bot api, the photo
object is an array of PhotoSize。您需要确保您正在下载该数组中较大的一个(检查width
和heigth
参数)。
使用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方法发送照片时。
希望这能解释问题。
我正在使用 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。问题是与实际上传的图片相比,下载的图片更小,质量也更差。我正在使用 Java Persistence (JPA) 将图像存储为 blob。这是我的代码
从客户端接收图像的示例代码;
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();
这里有几种可能性:
当你得到一个Message in the bot api, the
photo
object is an array of PhotoSize。您需要确保您正在下载该数组中较大的一个(检查width
和heigth
参数)。使用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方法发送照片时。
希望这能解释问题。