使用imgscalr调整.tif图像大小

时间:2012-12-27 09:11:04

标签: resize base64 tiff javax.imageio 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...." />我无法加载网址留言(悬停时) 据我所知,base64字符串通常以/ 9j /开头(可能是我错了)。当我追加/ 9j /。我收到一个错误 - “图像损坏或截断”。我无法在这里找出问题,请帮助。

1 个答案:

答案 0 :(得分:1)

乍一看,您对Data URI format的使用看起来是正确的 - 尝试并准确缩小失败的位置。

我建议:

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

    实际上现在考虑一下,尝试使用ImageIO将图像读入BufferedImage,然后用imgscalr处理它,然后立即调用ImageIO.write并尝试将其写入其他地方的新TIF并确保ImageIO解码/编码过程正常工作。

    希望有所帮助!