Изменение размера изображения.tif с помощью imgscalr
Я пытаюсь изменить размер изображения.tif, а затем отобразить его в браузере, преобразовав его в строку base64. Поскольку ImageIo по умолчанию не поддерживает изображения TIF, я добавил imageio_alpha-1.1.jar(получил здесь - http://www.findjar.com/jar/geoserver/jai/jars/jai_imageio-1.1-alpha.jar.html). Теперь ImageIO может зарегистрировать плагин, который я проверил, выполнив это
String[] writerNames = ImageIO.getWriterFormatNames();
WriterNames имеет TIF, это означает, что ImageIO зарегистрировал плагин.
Я изменяю размер изображения вот так
Map resizeImage(BufferedImage imageData, int width, int height, String imageFormat){
BufferedImage thumbnail = Scalr.resize(imageData, Scalr.Method.SPEED, Scalr.Mode.FIT_EXACT ,
width, height, Scalr.OP_ANTIALIAS);
String[] writerNames = ImageIO.getWriterFormatNames();
ByteArrayOutputStream baos = new ByteArrayOutputStream()
ImageIO.write(thumbnail, imageFormat, baos)
baos.flush()
byte[] imageBytes = baos.toByteArray()
baos.close()
return [imageBytes:imageBytes, imageFormat:imageFormat]
}
String encodeImageToBase64(byte[] imageData){
return Base64.encodeBase64String(imageData)
}
BufferedImage getBufferedImage(byte[] imageData){
ByteArrayInputStream bais = new ByteArrayInputStream(imageData)
BufferedImage bImageFromConvert = ImageIO.read(bais)
bais.close()
return bImageFromConvert
}
String resizeToDimensions(byte[] imageData, String imageFormat, int width, int height){
def bimg = getBufferedImage(imageData)
Map resizedImageData = resizeImage(bimg, width, height, imageFormat)
return encodeImageToBase64(resizedImageData.imageBytes)
}
теперь я показываю изображение вот так < img src = "data:image/tif;base64,TU0AKgAAAAgADAEAAAMAAA...." />
при этом мне не удалось загрузить URL-адрес (при зависании), насколько я знаю, строка base64 обычно начинается с /9j/(может быть, я ошибаюсь). когда я добавляю /9j/. Я получаю ошибку - "изображение повреждено или обрезано". Я не могу понять проблему здесь, пожалуйста, помогите.
1 ответ
На первый взгляд, использование вами формата Data URI выглядит правильно - попробуйте сузить круг, где именно происходит сбой.
Я бы посоветовал:
- В вашем методе, где вы возвращаете строку во внешний интерфейс, я бы порекомендовал распечатать все это на консоли, чтобы получить необработанные данные в формате Data URI.
- Возьмите строку URI данных, создайте образец файла HTML с жестко запрограммированным значением в нем, попробуйте и загрузите его... изображение отображается? Если так, отлично, тогда ваша проблема в том, как вы передаете это обратно во внешний интерфейс или как вы пытаетесь его загрузить. (Вероятно, проблема с JavaScript/DOM)
- Если это не сработает, попробуйте выделить раздел Base64 из примера и сохранить его в файле TXT примера. В своем Java-коде загрузите его, декодируйте и попробуйте создать из него изображение и записать его обратно в TIFF - если это не сработало, значит что-то не так с вашей обработкой Base64, и кодировка неверна более вероятный.
Пройдя так далеко, вы должны ответить на большинство вопросов.
На самом деле, теперь, когда я думаю об этом, попробуйте использовать ImageIO для считывания изображения в BufferedImage, затем обработайте его с помощью imgscalr, затем немедленно вызовите ImageIO.write и попробуйте записать его в новый TIF где-нибудь еще и убедиться, что ImageIO декодирует / Процесс кодирования работает правильно.
Надеюсь, это поможет!