Изменение размера изображения.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 выглядит правильно - попробуйте сузить круг, где именно происходит сбой.

Я бы посоветовал:

  1. В вашем методе, где вы возвращаете строку во внешний интерфейс, я бы порекомендовал распечатать все это на консоли, чтобы получить необработанные данные в формате Data URI.
  2. Возьмите строку URI данных, создайте образец файла HTML с жестко запрограммированным значением в нем, попробуйте и загрузите его... изображение отображается? Если так, отлично, тогда ваша проблема в том, как вы передаете это обратно во внешний интерфейс или как вы пытаетесь его загрузить. (Вероятно, проблема с JavaScript/DOM)
  3. Если это не сработает, попробуйте выделить раздел Base64 из примера и сохранить его в файле TXT примера. В своем Java-коде загрузите его, декодируйте и попробуйте создать из него изображение и записать его обратно в TIFF - если это не сработало, значит что-то не так с вашей обработкой Base64, и кодировка неверна более вероятный.

Пройдя так далеко, вы должны ответить на большинство вопросов.

На самом деле, теперь, когда я думаю об этом, попробуйте использовать ImageIO для считывания изображения в BufferedImage, затем обработайте его с помощью imgscalr, затем немедленно вызовите ImageIO.write и попробуйте записать его в новый TIF где-нибудь еще и убедиться, что ImageIO декодирует / Процесс кодирования работает правильно.

Надеюсь, это поможет!

Другие вопросы по тегам