26
Oct

PictureCutter

   Posted by: zu   in web

/**

 * Created by IntelliJ IDEA.

  * Date: 11-10-26

 * Time: 下午2:46

 * To change this template use File | Settings | File Templates.

 */

 

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.color.ColorSpace;

import java.awt.image.*;

import java.io.File;

import java.io.IOException;

 

public class PictureCutter {

 

    /**

     * 缩放图像

     *

     * @param srcImageFile 源图像文件地址

     * @param result       缩放后的图像地址

     * @param scale        缩放比例   (新的高/旧的高)

     */

    public static void scale(String srcImageFile, String result, long scale) {

        try {

            BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件

            int width = src.getWidth(); // 得到源图宽

            int height = src.getHeight(); // 得到源图长

 

            // 放大

            width = (int) (width * scale);

            height = (int) (height * scale);

 

            Image image = src.getScaledInstance(width, height,

                    Image.SCALE_DEFAULT);

            BufferedImage tag = new BufferedImage(width, height,

                    BufferedImage.TYPE_INT_RGB);

            Graphics g = tag.getGraphics();

            g.drawImage(image, 0, 0, null); // 绘制缩小后的图

            g.dispose();

            ImageIO.write(tag, “JPEG”, new File(result));// 输出到文件流

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 图像切割

     *

     * @param srcImageFile 源图像地址

     * @param descDir      切片目标文件夹

     * @param destWidth    目标切片宽度

     * @param destHeight   目标切片高度

     */

    public static void cut(String srcImageFile, final String descDir, final int destWidth,

                           final int destHeight) {

        try {

            // 读取源图像

            BufferedImage bi = ImageIO.read(new File(srcImageFile));

            final int srcWidth = bi.getHeight(); // 源图宽度

            final int srcHeight = bi.getWidth(); // 源图高度

            //如果源图片的宽度和长度都小于目标图片,不用处理。

            if (srcWidth <= destWidth && srcHeight <= destHeight) return;

 

            // 计算切片的横向和纵向数量

            int temp = srcWidth / destWidth;

            int cols = srcWidth % destWidth == 0 ? temp : temp + 1; // 切片横向数量

            temp = srcHeight / destHeight;

            int rows = srcHeight % destHeight == 0 ? temp : temp + 1;  //切片纵向数量

 

            // 循环建立切片

            // 改进的想法:是否可用多线程加快切割速度

            final Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);

            for (int i = 0; i < rows; i++) {

                for (int j = 0; j < cols; j++) {

                    long bg = System.currentTimeMillis();

 

 

                    // 四个参数分别为图像起点坐标和宽高

                    // 即: CropImageFilter(int x,int y,int width,int height)

                    ImageFilter cropFilter = new CropImageFilter(j * destWidth, i * destHeight, Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight));

 

                    ImageProducer imgProducer = image.getSource();

 

                    Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(imgProducer, cropFilter));

 

                    BufferedImage tag = new BufferedImage(Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight), BufferedImage.TYPE_INT_RGB);

                    Graphics g = tag.getGraphics();

                    g.drawImage(img, 0, 0, null); // 绘制小图

 

                    g.dispose();

                    // 输出为文件

                    String small_pic_name_path = descDir + “map_” + i + “_” + j + “.jpg”;

 

                    ImageIO.write(tag, “JPEG”, new File(small_pic_name_path));

                    System.out.println(“Thread” + Thread.currentThread().getId() + “\t切割第\t” + i + “_” + j + “\t张图片,耗时:\t” + (System.currentTimeMillis() – bg) + ” 毫秒”);

 

                }

            }

 

 

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 图像类型转换

     * GIF->JPG GIF->PNG PNG->JPG PNG->GIF(X)

     */

    public static void convert(String source, String result) {

        try {

            File f = new File(source);

            f.canRead();

            f.canWrite();

            BufferedImage src = ImageIO.read(f);

            ImageIO.write(src, “JPG”, new File(result));

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

 

    /**

     * 彩色转为黑白

     *

     * @param source

     * @param result

     */

    public static void gray(String source, String result) {

        try {

            BufferedImage src = ImageIO.read(new File(source));

            ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);

            ColorConvertOp op = new ColorConvertOp(cs, null);

            src = op.filter(src, null);

            ImageIO.write(src, “JPEG”, new File(result));

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

    /**

     * @param args 3X2 4X3 4X4 5X4

     */

    public static void main(String[] args) {

        //    if(1==1){

        //        return;

        //    }

        //cut(“ss.jpg”, “./ss/”, 256, 256);

        PictureCutter.scale(“c://1.jpg”, “c://2.jpg”, 2);

        //    Properties p= System.getProperties();

        //    System.out.println(p);

    }

 

    public static void cut1(String srcImageFile, final String descDir, final int destWidth,

                            final int destHeight) {

        try {

            // 读取源图像

            BufferedImage bi = ImageIO.read(new File(srcImageFile));

            final int srcWidth = bi.getHeight(); // 源图宽度

            final int srcHeight = bi.getWidth(); // 源图高度

            //如果源图片的宽度和长度都小于目标图片,不用处理。

            if (srcWidth <= destWidth && srcHeight <= destHeight) return;

 

            // 计算切片的横向和纵向数量

            int temp = srcWidth / destWidth;

            int cols = srcWidth % destWidth == 0 ? temp : temp + 1; // 切片横向数量

            temp = srcHeight / destHeight;

            int rows = srcHeight % destHeight == 0 ? temp : temp + 1;  //切片纵向数量

 

            // 循环建立切片

            // 改进的想法:是否可用多线程加快切割速度

            final Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);

            for (int i = 0; i < rows; i++) {

                for (int j = 0; j < cols; j++) {

                    long bg = System.currentTimeMillis();

 

 

                    // 四个参数分别为图像起点坐标和宽高

                    // 即: CropImageFilter(int x,int y,int width,int height)

                    ImageFilter cropFilter = new CropImageFilter(j * destWidth, i * destHeight, Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight));

 

                    ImageProducer imgProducer = image.getSource();

 

                    Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(imgProducer, cropFilter));

 

                    BufferedImage tag = new BufferedImage(Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight), BufferedImage.TYPE_INT_RGB);

                    Graphics g = tag.getGraphics();

 

                    g.drawImage(img, 0, 0, null); // 绘制小图

 

                    g.dispose();

                    // 输出为文件

                    String small_pic_name_path = descDir + “map_” + i + “_” + j + “.jpg”;

 

                    ImageIO.write(tag, “JPEG”, new File(small_pic_name_path));

                    System.out.println(“Thread” + Thread.currentThread().getId() + “\t切割第\t” + i + “_” + j + “\t张图片,耗时:\t” + (System.currentTimeMillis() – bg) + ” 毫秒”);

 

                }

            }

 

 

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

 

 

}


分享家:Addthis中文版
This entry was posted on 星期三, 10月 26th, 2011 at 5:35 pm and is filed under web. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

3 comments so far

 1 

测试????????????

10月 26th, 2011 at 7:43 pm
 2 

非常的专业

10月 26th, 2011 at 9:28 pm
 3 

看不懂程序

10月 26th, 2011 at 10:28 pm

Leave a reply

Name (*)
Mail (will not be published) (*)
URI
Comment
click to change验证码