Generate thumbnails based on image paths

1. Thumbnails

while browsing albums. It may be necessary to generate corresponding thumbnails.

Go directly to the code:

public class ImageUtil {

    private Logger log = LoggerFactory.getLogger(getClass());

    private static String DEFAULT_PREVFIX = "thumb_";
    private static Boolean DEFAULT_FORCE = false;//建议该值为false

    /**
     * <p>Title: thumbnailImage</p>
     * <p>Description: 依据图片路径生成缩略图 </p>
     * @param imagePath    原图片路径
     * @param w            缩略图宽
     * @param h            缩略图高
     * @param prevfix    生成缩略图的前缀
     * @param force        是否强制依照宽高生成缩略图(假设为false,则生成最佳比例缩略图)
     */
    public void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force){
        File imgFile = new File(imagePath);
        if(imgFile.exists()){
            try {
                // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
                String types = Arrays.toString(ImageIO.getReaderFormatNames());
                String suffix = null;
                // 获取图片后缀
                if(imgFile.getName().indexOf(".") > -1) {
                    suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1);
                }// 类型和图片后缀所有小写,然后推断后缀是否合法
                if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0){
                    log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
                    return ;
                }
                log.debug("target image's size, width:{}, height:{}.",w,h);
                Image img = ImageIO.read(imgFile);
                if(!force){
                    // 依据原图与要求的缩略图比例,找到最合适的缩略图比例
                    int width = img.getWidth(null);
                    int height = img.getHeight(null);
                    if((width*1.0)/w < (height*1.0)/h){
                        if(width > w){
                            h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0)));
                            log.debug("change image's height, width:{}, height:{}.",w,h);
                        }
                    } else {
                        if(height > h){
                            w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0)));
                            log.debug("change image's width, width:{}, height:{}.",w,h);
                        }
                    }
                }
                BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
                Graphics g = bi.getGraphics();
                g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
                g.dispose();
                String p = imgFile.getPath();
                // 将图片保存在原文件夹并加上前缀
                ImageIO.write(bi, suffix, new File(p.substring(0,p.lastIndexOf(File.separator)) + File.separator + prevfix +imgFile.getName()));
                log.debug("缩略图在原路径下生成成功");
            } catch (IOException e) {
               log.error("generate thumbnail image failed.",e);
            }
        }else{
            log.warn("the image is not exist.");
        }
    }

    public static void main(String[] args) {
        new ImageUtil().thumbnailImage("C:/Users/cm/Desktop/我的页面/images/girlNoImg.jpg", 100, 150,DEFAULT_PREVFIX,DEFAULT_FORCE);
    }
}

2. Generate cropped images with js

When we change personal microblog and qq data, we can upload personal avatars, and we can cut personal avatars and upload them. The size and style of the cropped image is implemented by javascript, but it cannot generate a new image. However, the js cropped image provides the x, y coordinates and width and height of the image. Through these four parameters, we can generate a new cropped image based on the original image. Steps: 1. First, use js to realize the picture cutting and browsing function through the page. I refer to the information provided by MOOC and change it slightly. In addition, we can also use plugins, such as Jcrop is a very good image cropping plugin.

Download address : http://download.csdn.net/detail/u012385190/9733480

这里写图片描写叙述  The final rendering is as above, the left side can be dragged and dragged, and the right side is the preview image.

2. java generates and saves the cut image

public class ImageUtil2 {

    private Logger log = LoggerFactory.getLogger(getClass());

    private static String DEFAULT_CUT_PREVFIX = "cut_";

    /**
     * Description: 依据原图与裁切size截取局部图片
     * @param srcImg 源图片
     * @param output 图片输出流
     * @param rect 须要截取部分的坐标和大小
     */
    public void cutImage(File srcImg, OutputStream output,java.awt.Rectangle rect) {
        if (srcImg.exists()) {
            java.io.FileInputStream fis = null;
            ImageInputStream iis = null;
            try {
                fis = new FileInputStream(srcImg);
                // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG,
                // JPEG, WBMP, GIF, gif]
                String types = Arrays.toString(ImageIO.getReaderFormatNames())
                        .replace("]", ",");
                String suffix = null;
                // 获取图片后缀
                if (srcImg.getName().indexOf(".") > -1) {
                    suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1);
                }// 类型和图片后缀所有小写。然后推断后缀是否合法
                if (suffix == null
                        || types.toLowerCase().indexOf(suffix.toLowerCase() + ",") < 0) {
                    log.error("Sorry, the image suffix is illegal. the standard image suffix is {}."+ types);
                    return;
                }
                // 将FileInputStream 转换为ImageInputStream
                iis = ImageIO.createImageInputStream(fis);
                // 依据图片类型获取该种类型的ImageReader
                ImageReader reader = ImageIO.getImageReadersBySuffix(suffix).next();
                reader.setInput(iis, true);
                ImageReadParam param = reader.getDefaultReadParam();
                param.setSourceRegion(rect);
                BufferedImage bi = reader.read(0, param);
                ImageIO.write(bi, suffix, output);
                log.info("图片生成成功,请到文件夹下查看");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (fis != null)
                        fis.close();
                    if (iis != null)
                        iis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            log.warn("the src image is not exist.");
        }
    }


    //生成目标文件路径
    public void cutImage(File srcImg, String destImgPath,java.awt.Rectangle rect) {
        File destImg = new File(destImgPath);
        if (destImg.exists()) {
            String p = destImg.getPath();
            try {
                if (!destImg.isDirectory())
                    p = destImg.getParent();
                if (!p.endsWith(File.separator))
                    p = p + File.separator;
                cutImage(srcImg,new java.io.FileOutputStream(p + DEFAULT_CUT_PREVFIX+ "_"+ srcImg.getName()), rect);
            } catch (FileNotFoundException e) {
                log.warn("the dest image is not exist.");
            }
        } else
            log.warn("the dest image folder is not exist.");
    }


    public void cutImage(String srcImg, String destImg, int x, int y, int width,
            int height) {
        cutImage(new File(srcImg), destImg, new java.awt.Rectangle(x, y, width, height));
    }


    public static void main(String[] args) {
        new ImageUtil2().cutImage("C:/Users/cm/Desktop/我的页面/images/boyNoImg.jpg", "C:/Users/cm/Desktop/我的页面/images/imgs",0, 0, 61, 166);
        //new ImageUtil2().cutImage("C:/Users/cm/Desktop/Jcrop-master/demos/demo_files/sago.jpg", "C:/Users/cm/Desktop/我的页面/images/imgs",124, 110, 196, 176);
    }
}

This method can be executed directly in main.

The four incoming parameters are the image path, left value, top value, length, and width.

Let's analyze how to obtain these four parameters: 
1. Take my js cut as an example, and obtain the following through F12: 
这里写图片描写叙述 
the red part in the picture is the div where the picture is cut. We can observe which parameters have been changed by dragging the size and width of the clipping area, etc., and then determine which parameter value corresponds to the detailed corresponding parameter value. As in the picture, my x/y/width/height are 40, 28, 224, 228 respectively.

Note: In js, I define the length and width of the div and the image as 300*300. For the purpose of testing, the image I downloaded is also 300*300. Suppose your test image size is not 300*300. Then the effect you test directly in the java above will be different from what you see on the front end, because the width and height of your front end image are defined as 300*300. And your actual picture (ie the picture in java) is not.

So what is the hypothetical solution to this problem?

在你的java代码中获取原图片的长宽,然后推断原图片的长宽是不是300*300,假设不是就生成该图片的300*300的缩略图,然后将该300*300的缩略图作为裁剪的图片原型。

(我的代码中没有处理,须要的自己处理,用完图片之后删除缩略图)

2、Jcrop获取參数 
这里写图片描写叙述


如图,Jcrop直接提供了參数,能够直接使用。可是它有个缺点就是在前端页面的图片大小区域不固定,假设你有个大像素图片,那么会非常丑,比方我在相应文件中有个图片soga_bak.jpg,换成这个图片就不好了。

所以综上建议用第一个js。然后推断原图片的长宽是不是300。不是的生成300*300缩略图。然后将缩略图作为裁剪原型图,用完了再删除缩略图。


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325730062&siteId=291194637