`
低调衬着那一抹妖娆
  • 浏览: 30092 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java 图片分割处理

阅读更多
    package com.langhua.cutFile;     
    import java.io.*;        
    import java.awt.*;        
    import java.awt.image.*;        
    import java.awt.Graphics;        
    import java.awt.color.ColorSpace;        
    import javax.imageio.ImageIO;        
        
    import com.langhua.ImageUtils.ImageUtils;     
           
    public class ChangeImageSize        
    {        
        /** *//**     
         * 缩放图像     
         * @param srcImageFile 源图像文件地址     
         * @param result       缩放后的图像地址     
         * @param scale        缩放比例     
         * @param flag         缩放选择:true 放大; false 缩小;     
         */       
        public static void scale(String srcImageFile, String result, int scale, boolean flag)        
        {        
            try       
            {        
                BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件        
                int width = src.getWidth(); // 得到源图宽        
                int height = src.getHeight(); // 得到源图长        
                if (flag)        
                {        
                    // 放大        
                    width = width * scale;        
                    height = height * scale;        
                }        
                else       
                {        
                    // 缩小        
                    width = width / scale;        
                    height = 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, String descDir, int destWidth, int destHeight)        
        {        
            try       
            {        
                Image img;        
                ImageFilter cropFilter;      
                String dir = null;     
                // 读取源图像        
                BufferedImage bi = ImageIO.read(new File(srcImageFile));        
                int srcWidth = bi.getHeight(); // 源图宽度        
                int srcHeight = bi.getWidth(); // 源图高度     
                System.out.println("srcWidth:"+srcWidth);     
                System.out.println("srcHeight:"+srcHeight);     
                if (srcWidth > destWidth && srcHeight > destHeight)        
                {        
                    Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);        
                    destWidth = 300; // 切片宽度        
                    destHeight = 300; // 切片高度        
                    int cols = 0; // 切片横向数量        
                    int rows = 0; // 切片纵向数量        
                    // 计算切片的横向和纵向数量        
                    if (srcWidth % destWidth == 0)        
                    {        
                        cols = srcWidth / destWidth;        
                    }        
                    else       
                    {        
                        cols = (int) Math.floor(srcWidth / destWidth) + 1;        
                    }        
                    if (srcHeight % destHeight == 0)        
                    {        
                        rows = srcHeight / destHeight;        
                    }        
                    else       
                    {        
                        rows = (int) Math.floor(srcHeight / destHeight) + 1;        
                    }        
                    // 循环建立切片                    
                    for (int i = 0; i < rows; i++)        
                    {        
                        for (int j = 0; j < cols; j++)        
                        {        
                            // 四个参数分别为图像起点坐标和宽高        
                            // 即: CropImageFilter(int x,int y,int width,int height)        
                            cropFilter = new CropImageFilter(j * 300, i * 300, destWidth, destHeight);        
                            img = Toolkit.getDefaultToolkit().createImage(        
                                            new FilteredImageSource(image.getSource(), cropFilter));        
                            BufferedImage tag = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);        
                            Graphics g = tag.getGraphics();        
                            g.drawImage(img, 0, 0, null); // 绘制缩小后的图        
                            g.dispose();        
                            // 输出为文件       
                            dir = descDir + "cut_image_" + i + "_" + j + ".jpg";     
                            File f = new File(dir);     
                            ImageIO.write(tag, "JPEG",f);     
                            System.out.println(dir);          
                        }        
                    }        
                }        
            }        
            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     
         */       
        public static void main(String[] args)        
        {        
            //scale("c:\\test\\456.jpg","C:\\test\\image1.jpg",2,false);        
            //cut("c:\\1.jpg","C:\\2.jpg",64,64);        
            //gray("c:\\test\\456.jpg","C:\\test\\image4.jpg");        
        }        
           
    }      

 优化处理后

package com.langhua.cutFile;     
    
import java.awt.Rectangle;     
import java.awt.image.BufferedImage;     
import java.io.File;     
import java.io.FileInputStream;     
import java.io.IOException;     
import java.util.Iterator;     
    
import javax.imageio.ImageIO;     
import javax.imageio.ImageReadParam;     
import javax.imageio.ImageReader;     
import javax.imageio.stream.ImageInputStream;     
    
import com.langhua.ImageUtils.ImageUtils;     
    
public class CutImage {     
    
    // 源图片路径名称如:c:\1.jpg     
    private String srcpath;     
    
    // 剪切图片存放路径名称.如:c:\2.jpg     
    private String subpath;     
    
    // 剪切点x坐标     
    private int x;     
    
    private int y;     
    
    // 剪切点宽度     
    private int width;     
    
    private int height;     
    
    public CutImage() {     
    
    }     
    
    public CutImage(int x, int y, int width, int height) {     
        this.x = x;     
        this.y = y;     
        this.width = width;     
        this.height = height;     
    }     
    
    /**   
     * 对图片裁剪,并把裁剪完蛋新图片保存 。   
     */    
    public void cut() throws IOException {     
    
        FileInputStream is = null;     
        ImageInputStream iis = null;     
    
        try {     
            // 读取图片文件     
            is = new FileInputStream(srcpath);     
    
            /**   
             * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。   
             * 参数:formatName - 包含非正式格式名称 . (例如 "jpeg" 或 "tiff")等 。   
             */    
            Iterator<ImageReader> it = ImageIO     
                    .getImageReadersByFormatName("jpg");     
            ImageReader reader = it.next();     
            // 获取图片流     
            iis = ImageIO.createImageInputStream(is);     
    
            /**   
             * iis:读取源.true:只向前搜索.将它标记为 ‘只向前搜索’。 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许   
             * reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。   
             */    
            reader.setInput(iis, true);     
    
            /**   
             * <p>   
             * 描述如何对流进行解码的类   
             * <p>   
             * .用于指定如何在输入时从 Java Image I/O 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其   
             * ImageReader 实现的 getDefaultReadParam 方法中返回 ImageReadParam 的实例。   
             */    
            ImageReadParam param = reader.getDefaultReadParam();     
    
            /**   
             * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象   
             * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。   
             */    
            Rectangle rect = new Rectangle(x, y, width, height);     
    
            // 提供一个 BufferedImage,将其用作解码像素数据的目标。     
            param.setSourceRegion(rect);     
    
            /**   
             * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的   
             * BufferedImage 返回。   
             */    
            BufferedImage bi = reader.read(0, param);     
    
            // 保存新图片     
            ImageIO.write(bi, "jpg", new File(subpath));     
        } finally {     
            if (is != null)     
                is.close();     
            if (iis != null)     
                iis.close();     
        }     
    }     
    
    /**   
     * 图像切割   
     *    
     * @param srcImageFile   
     *            源图像地址   
     * @param descDir   
     *            切片目标文件夹   
     * @param destWidth   
     *            目标切片宽度   
     * @param destHeight   
     *            目标切片高度 返回一个List,保存九张图片的图片名   
     */    
    public static java.util.List<String> cutImg(String srcImageFile,     
            String descDir, int destWidth, int destHeight) {     
        java.util.List<String> list = new java.util.ArrayList<String>(9);     
        try {     
            String dir = null;     
            // 读取源图像     
            BufferedImage bi = ImageIO.read(new File(srcImageFile));     
            int srcWidth = bi.getHeight(); // 源图宽度     
            int srcHeight = bi.getWidth(); // 源图高度     
            if (srcWidth > destWidth && srcHeight > destHeight) {     
                destWidth = 300; // 切片宽度     
                destHeight = 300; // 切片高度     
                int cols = 0; // 切片横向数量     
                int rows = 0; // 切片纵向数量     
    
                // 计算切片的横向和纵向数量     
                if (srcWidth % destWidth == 0) {     
                    cols = srcWidth / destWidth;     
                } else {     
                    cols = (int) Math.floor(srcWidth / destWidth) + 1;     
                }     
                if (srcHeight % destHeight == 0) {     
                    rows = srcHeight / destHeight;     
                } else {     
                    rows = (int) Math.floor(srcHeight / destHeight) + 1;     
                }     
                // 循环建立切片     
                for (int i = 0; i < rows; i++) {     
                    for (int j = 0; j < cols; j++) {     
                        CutImage cutImage = new CutImage(j * 300, i * 300, 300,     
                                300);     
                        cutImage.setSrcpath(srcImageFile);     
                        dir = descDir + "cut_image_" + i + "_" + j + ".jpg";     
                        cutImage.setSubpath(dir);     
                        cutImage.cut();     
                        list.add("cut_image_" + i + "_" + j + ".jpg");         
                    }     
                }     
            }     
        } catch (Exception e) {     
            e.printStackTrace();     
        }     
        return list;     
    }     
    
    public int getHeight() {     
        return height;     
    }     
    
    public void setHeight(int height) {     
        this.height = height;     
    }     
    
    public String getSrcpath() {     
        return srcpath;     
    }     
    
    public void setSrcpath(String srcpath) {     
        this.srcpath = srcpath;     
    }     
    
    public String getSubpath() {     
        return subpath;     
    }     
    
    public void setSubpath(String subpath) {     
        this.subpath = subpath;     
    }     
    
    public int getWidth() {     
        return width;     
    }     
    
    public void setWidth(int width) {     
        this.width = width;     
    }     
    
    public int getX() {     
        return x;     
    }     
    
    public void setX(int x) {     
        this.x = x;     
    }     
    
    public int getY() {     
        return y;     
    }     
    
    public void setY(int y) {     
        this.y = y;     
    }     
}

 

分享到:
评论

相关推荐

    java 水印 图像处理 图片分割 裁剪 缩放

    java 水印 图像处理 图片分割 裁剪 缩放 功能 且带整个程序的整合, 和单元测试对单独功能的处理 操作,并可以通过打印 发送传真,全部

    基于java的图像分割(数字图像处理)

    基于java的图像分割(数字图像处理),程序中包含 全局阈值分割,Roberts边缘检测分割,灰度图像,直方图。

    java源码包---java 源码 大量 实例

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    JAVA上百实例源码以及开源项目源代码

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    基于java的图像处理源代码

    此文件包含了基于java的图像处理源代码,具体有图像灰度变换、阈值变换、线性变换、伪彩色处理、图像融合、图像合成、内置变换、仿射变换、图像插值、边缘检测、图像分割、hough变换、图像编码、分形演示等等等等,...

    JAVA上百实例源码以及开源项目

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    java源码包4

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    java源码包3

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    java源码包2

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    数字图像处理 JAVA 边缘检测 图像增强

    数字 图像 处理 JAVA 边缘 检测 图像 增强 图像分割 平滑 有界面 图像变换

    Java图像分割

    图像分割Java版,可以把一个图像分割成几个大小相同的部分,适合用于剪裁RPG中的人物行走图像或者砖块地图素材,具体实现请访问: http://blog.csdn.net/u011351840/article/details/9298443 联系QQ:740382997 群...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    简单的java图片处理类(图片水印 图片缩放)

    本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能

    Java毕业论文 拼图游戏源码 文档.rar

    通过图形技术,实现图片的导入和分割。通过消息响应机制,使程序可以响应用户的鼠标操作,进行拼图游戏的操作。  调试:本实例代码编写完毕,存盘为:C: j2sdk1.4.0\javaprograms\ pintu.java。  打开计算机的...

    java jdk实列宝典 光盘源代码

    java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频文件,以及控制声音的大小和音量,Beep.java; 媒体播放器,JMFMediaPlayer.java; 12反射 是java程序开发的特征之一,允许java程序对自身...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    java工具类 utils.zip

    java开发工具类,包括日期格式化,字符串处理,字符串分割、替换,json处理,spingBean处理,随机数,加密解密,base64,图片处理,随机数,正则表达式

    java ffmpeg 简单视频处理

    ffmpeg 可已实现视频格式的转换,视频图片的截取,大视频的分割

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

Global site tag (gtag.js) - Google Analytics