ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于geotools实现图片的缩放

2021-11-28 19:31:47  阅读:248  来源: 互联网

标签:基于 geotools String 缩放 image formatStr org import


1. pom依赖

参见文章基于geotools实现geotif切瓦片

2. 代码展示

package cn.surpass;

import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.coverage.grid.io.GridFormatFinder;
import org.geotools.coverage.processing.Operations;
import org.geotools.factory.GeoTools;
import org.geotools.factory.Hints;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import javax.media.jai.PlanarImage;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author surpass
 * @version 1.0
 * @date 2021/11/26 10:12
 */
public class ImageUtils {

    private final static Logger LOGGER = LoggerFactory.getLogger(ImageUtils.class);
    private static final Integer LARGE_THUMB_IMG_WIDTH = 512;

    public static void generateThumb(String filePath, String saveDir,ImageFormat imageFormat) {
        LOGGER.info("处理文件路径为{};输出文件夹路径为:{}", filePath, saveDir);
        
        File file = new File(filePath);
        AbstractGridFormat format = GridFormatFinder.findFormat(file);
        Hints hints = GeoTools.getDefaultHints();
        AbstractGridCoverage2DReader reader = format.getReader(file, hints);

        try {
            //获取图像的宽和高的像素
            GridCoverage2D read = reader.read(null);
            RenderedImage sourceImage = read.getRenderableImage(0, 1).createDefaultRendering();
            int rasterXSize = sourceImage.getWidth();
            int rasterYSize = sourceImage.getHeight();

            LOGGER.info("原始影像的width:{};height:{}", rasterXSize, rasterYSize);

            double scale = LARGE_THUMB_IMG_WIDTH / (double) Math.max(rasterXSize, rasterYSize);

            LOGGER.info("=======>SCALE:{}", scale);

			// 核心代码
            Operations ops = new Operations(null);
            RenderedImage image = ops.scale(read, scale, scale, 0, 0).getRenderedImage();


            if (image == null) {
                LOGGER.error("临时图片生成失败");
                return;
            }
            BufferedImage largeThumb = PlanarImage.wrapRenderedImage(image).getAsBufferedImage();

            //保存图像
            String descFileName = file.getName().replaceAll("^(.*\\.).*$", "$1"+ imageFormat.getFormatStr());

            //文件夹
            File saveFolder = new File(saveDir);
            if (!saveFolder.exists()) {
                saveFolder.mkdirs();
            }
            saveImage(largeThumb, new File(saveFolder, descFileName), imageFormat.getFormatStr());
            LOGGER.info("缩略图生成成功");
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
            throw new RuntimeException("缩略图生成失败," + e.getMessage());
        } finally {
            reader.dispose();
        }
    }
    
    private static void saveImage(BufferedImage image, File descFile, String format) throws Exception {
        try (FileOutputStream fos = new FileOutputStream(descFile)) {
            ImageIO.write(image, format, fos);
            fos.flush();
        } catch (IOException e) {
            throw e;
        }
    }

    public enum ImageFormat{
        IMAGE_FORMAT_PNG("png"),
        IMAGE_FORMAT_WEBP("webp"),
        IMAGE_FORMAT_JPG("jpg");
        
        private String formatStr;

        public String getFormatStr() {
            return formatStr;
        }
        public void setFormatStr(String formatStr) {
            this.formatStr = formatStr;
        }
        private ImageFormat(String formatStr){
            this.formatStr = formatStr;
        }
    }
}

标签:基于,geotools,String,缩放,image,formatStr,org,import
来源: https://blog.csdn.net/oYinHeZhiGuang/article/details/121595944

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有