3

我正在尝试调整 .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...." />,据我所知,base64 字符串通常以 /9j/ 开头,我无法加载 url 消息(悬停时)(可能是我错了)。当我附加 /9j/. 我收到一个错误 - “图像损坏或被截断”。我无法在这里找出问题,请帮助。

4

1 回答 1

1

乍一看,您对Data URI 格式的使用看起来是正确的——尝试缩小失败的确切位置。

我会推荐:

  1. 在您将字符串返回到前端的方法中,我建议将整个内容打印到控制台以获取 Data URI 格式的原始数据。
  2. 获取数据 URI 字符串,创建一个包含硬编码值的示例 HTML 文件,尝试加载它......图像是否显示?如果是这样,那太好了,那么您的问题在于如何将其流式传输回前端或如何尝试加载它。(可能是 JavaScript/DOM 问题)
  3. 如果这不起作用,请尝试从示例中删除 Base64 部分并将其保存到示例 TXT 文件中。在您的 Java 代码中,加载、解码并尝试从中创建图像并将其写回 TIFF - 如果这不起作用,那么您的 Base64 处理有问题并且编码无效最有可能的。

走到这一步应该可以回答大部分问题。

实际上现在我想了想,尝试使用 ImageIO 将图像读入 BufferedImage,然后使用 imgscalr 对其进行处理,然后立即调用 ImageIO.write 并尝试将其写入其他地方的新 TIF 并确保 ImageIO 解码/encoding 过程正常工作。

希望有帮助!

于 2012-12-27T18:12:06.833 回答