`

图片通用处理类(缩放、左右拼接、上下拼接)

    博客分类:
  • java
阅读更多

package com.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.WritableRaster;
import java.io.File;

import javax.imageio.ImageIO;

public class ImageUtil {
    /**
     * 处理图像
     *
     * @param source
     *            原图像
     * @param targetW
     *            目标宽度
     * @param targetH
     *            目标高度
     * @return 处理完图像(略缩图)
     */
    public static BufferedImage resize(BufferedImage source, int targetW,
            int targetH) {

        // targetW,targetH分别表示目标长和宽
        int type = source.getType();
        BufferedImage target = null;
        double sx = (double) targetW / source.getWidth();
        double sy = (double) targetH / source.getHeight();
        // 这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
        // 则将下面的if else语句注释即可
        if (sx > sy) {
            sx = sy;
            targetW = (int) (sx * source.getWidth());
        } else {
            sy = sx;
            targetH = (int) (sy * source.getHeight());
        }

        if (type == BufferedImage.TYPE_CUSTOM) { // handmade
            ColorModel cm = source.getColorModel();
            WritableRaster raster = cm.createCompatibleWritableRaster(targetW,
                    targetH);
            boolean alphaPremultiplied = cm.isAlphaPremultiplied();
            target = new BufferedImage(cm, raster, alphaPremultiplied, null);
        } else {
            target = new BufferedImage(targetW, targetH, type);
        }

        Graphics2D g = target.createGraphics();
        // smoother than exlax:
        g.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
        g.dispose();

        return target;
    }

    /**
     * 保存图片
     *
     * @param fromFileStr
     *            来自图片
     * @param saveToFileStr
     *            保存图片
     * @param width
     *            保存宽度
     * @param hight
     *            保存高度
     * @throws Exception
     *             异常
     */
    public static void saveImageAsJpg(String fromFileStr, String saveToFileStr,
            int width, int hight) throws Exception {
        BufferedImage srcImage;
        // String ex =
        // fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
        String imgType = "JPEG";
        if (fromFileStr.toLowerCase().endsWith(".png")) {
            imgType = "PNG";
        }
        File saveFile = new File(saveToFileStr);
        File fromFile = new File(fromFileStr);
        srcImage = ImageIO.read(fromFile);
        if (width > 0 || hight > 0) {
            srcImage = resize(srcImage, width, hight);
        }
        ImageIO.write(srcImage, imgType, saveFile);
    }

    /**
     * 左右连接2张图片
     *
     * **/
    public static BufferedImage leftJoin(BufferedImage ImageOne,
            BufferedImage ImageTwo) {
        int width1, width2, height1, height2, height;
        try {
            width1 = ImageOne.getWidth();// 图片宽度
            height1 = ImageOne.getHeight();// 图片高度
            width2 = ImageTwo.getWidth();// 图片宽度
            height2 = ImageTwo.getHeight();// 图片高度
            if (height1 > height2)
                height = height1;
            else
                height = height2;
            // 从图片中读取RGB
            int[] ImageArrayOne = new int[width1 * height1];
            ImageArrayOne = ImageOne.getRGB(0, 0, width1, height1,
                    ImageArrayOne, 0, width1);

            int[] ImageArrayTwo = new int[width2 * height2];
            ImageArrayTwo = ImageTwo.getRGB(0, 0, width2, height2,
                    ImageArrayTwo, 0, width2);

            // 生成新图片
            BufferedImage ImageNew = new BufferedImage(width1 + width2, height,
                    BufferedImage.TYPE_INT_RGB);
            ImageNew.setRGB(0, 0, width1, height1, ImageArrayOne, 0, width1);// 设置左半部分的RGB
            ImageNew
                    .setRGB(width1, 0, width2, height, ImageArrayTwo, 0, width2);// 设置右半部分的RGB
            return ImageNew;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 上下连接2张图片
     *
     * **/
    public static BufferedImage topJoin(BufferedImage ImageOne,
            BufferedImage ImageTwo) {
        int width1, width2, height1, height2, width;
        try {
            width1 = ImageOne.getWidth();// 图片宽度
            height1 = ImageOne.getHeight();// 图片高度
            width2 = ImageTwo.getWidth();// 图片宽度
            height2 = ImageTwo.getHeight();// 图片高度
            if (width1 > width2)
                width = width1;
            else
                width = width2;
            // 从图片中读取RGB
            int[] ImageArrayOne = new int[width1 * height1];
            ImageArrayOne = ImageOne.getRGB(0, 0, width1, height1,
                    ImageArrayOne, 0, width1);

            int[] ImageArrayTwo = new int[width2 * height2];
            ImageArrayTwo = ImageTwo.getRGB(0, 0, width2, height2,
                    ImageArrayTwo, 0, width2);

            // 生成新图片
            BufferedImage ImageNew = new BufferedImage(width,
                    height1 + height2, BufferedImage.TYPE_INT_RGB);
            ImageNew.setRGB(0, 0, width1, height1, ImageArrayOne, 0, width1);// 设置上半部分的RGB
            ImageNew.setRGB(0, height1, width2, height2, ImageArrayTwo, 0,
                    width);// 设置下半部分的RGB
            return ImageNew;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 图片切割
     *
     * @param fromImage
     *            图片
     * @param startX
     *            开始x结点(left)
     * @param startY
     *            开始y结点(top)
     * @param w
     *            切割宽度
     * @param h
     *            切割高度
     */

    public static BufferedImage cut(BufferedImage fromImage, int startX,
            int startY, int w, int h) {
        try {
            Image img;
            ImageFilter cropFilter;
            // 读取源图像
            int height = fromImage.getHeight();
            int width = fromImage.getWidth();
            if (width >= w && height >= h) {
                Image image = fromImage.getScaledInstance(width, height,
                        Image.SCALE_DEFAULT);
                // 剪切起始坐标点
                int x = startX;
                int y = startY;
                int destWidth = w; // 切片宽度
                int destHeight = h; // 切片高度
                // 图片比例
                double pw = width;
                double ph = height;
                double m = (double) width / pw;
                double n = (double) height / ph;
                int wth = (int) (destWidth * m);
                int hth = (int) (destHeight * n);
                int xx = (int) (x * m);
                int yy = (int) (y * n);
                // 四个参数分别为图像起点坐标和宽高
                // 即: CropImageFilter(int x,int y,int width,int height)
                cropFilter = new CropImageFilter(xx, yy, wth, hth);
                img = Toolkit.getDefaultToolkit().createImage(
                        new FilteredImageSource(image.getSource(), cropFilter));
                BufferedImage tag = new BufferedImage(w, h,
                        BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.drawImage(img, 0, 0, null); // 绘制缩小后的图
                g.dispose();
                return tag;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**图片上加文字**/
    public static void image_text(BufferedImage tag,String text,Font font, int x, int y) {
        Graphics g = tag.getGraphics();
        // g.setColor(Color.BLACK); //以下设置前景色
        g.setXORMode(Color.GREEN);
        g.setFont(font);//new Font("宋体", Font.ITALIC, 24));
        g.drawString(text, x, y);
        g.dispose();
    }

    public static void main(String args[]) {
        try {
//            File f1 = new File("d:\\1.jpg");
//            File f2 = new File("d:\\2.jpg");
//            BufferedImage img1 = ImageIO.read(f1);
//            BufferedImage img2 = ImageIO.read(f2);
//            BufferedImage out = leftJoin(img2, img1, 0, 100);
//            // out = resize(out, 200, 200);
//            File outFile = new File("d:\\out.jpg");
//            ImageIO.write(out, "jpg", outFile);// 写图片
             File f1 = new File("d:\\3.jpg");
             BufferedImage img1 = ImageIO.read(f1);
             int height=img1.getHeight();
             int width=img1.getWidth();
             for(int i=0;i<height;i+=100){
                 for(int j=0;j<width;j+=100){
                    BufferedImage tmp=ImageUtil.cut(img1, j, i, 100, 100);
                     File outFile = new File("d:\\tmp\\"+i+"_"+j+".jpg");
                     ImageIO.write(tmp, "jpg", outFile);// 写图片
                     
                 }
             }
//             img1=ImageUtil.cut(img1, 0, 0, 100, 100);
//             File outFile = new File("d:\\out.jpg");
//             ImageIO.write(img1, "jpg", outFile);// 写图片
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

分享到:
评论

相关推荐

    拼接屏控制软件

    3. **图像缩放与调整**:对于需要跨屏显示的内容,软件能自动处理图像的缩放和定位,确保画面在多个屏幕间平滑过渡。 4. **多窗口显示**:支持在同一拼接屏上同时显示多个窗口,每个窗口可以显示不同的内容,实现...

    分布式拼接屏系统通用接入方案.pdf

    拼接屏系统的核心设备包括各种类型解码器,负责接收控制指令,并对视频信号进行处理,如显示、缩放、分割、漫游和拼接等功能。但由于其品牌和型号众多,没有统一标准协议,难以实现统一管理和控制,影响用户体验。 ...

    液晶拼接控制软件

    5. **myCtrl.GroupCtrl.dll**:这可能是一个自定义的控制模块,专门用于处理多屏拼接控制的逻辑,比如组屏管理、窗口漫游、画中画等高级功能。 这些文件共同构成了液晶拼接控制软件的核心组成部分,提供了丰富的...

    图片模板匹配,多张图片自适应拼接

    5. **拼接处理**:根据找到的匹配位置,对多张图片进行几何变换(如旋转、缩放、平移),使它们能够正确地拼接在一起。 实现这一过程通常会涉及到OpenCV、PIL等Python图像处理库。在`app.py`和`test.py`中,可能...

    拼接屏控制软件通用吗-通用控制力度加大.docx

    【标题】: 拼接屏控制软件通用性分析及控制强化 【描述】: 本文探讨了拼接屏控制软件的通用性问题,并强调了通用控制的重要性,特别是在相关行业的应用中。 【标签】: 计算机 【正文】: 拼接屏控制软件在现代...

    iOS开发 通用Utilities类 工具函数集合

    5. **图片处理**:图片的压缩、缩放、裁剪等,优化内存占用和显示效果。 6. **网络请求辅助**:提供URL编码、HTTP请求参数构建等辅助函数,简化网络请求的准备工作。 7. **JSON序列化与反序列化**:快速将字典或...

    图像拼接摘要.docx

    这些特征匹配方法在处理旋转、缩放等变换时表现良好,但仍有改进空间,以适应更复杂的图像拼接环境。 总的来说,图像拼接技术是一个涵盖多个层面的复杂问题,需要在特征提取、配准策略、融合规则等方面不断优化,以...

    基于SURF的图像拼接

    标题中的“基于SURF的图像拼接”是一个关于计算机视觉领域的技术话题,主要涉及的是图像处理和特征检测。SURF(Speeded Up Robust Features)是SIFT(Scale-Invariant Feature Transform)的一种快速版本,由荷兰TUE...

    ITK图像配准拼接介绍.docx

    仿射变换是一种更为通用的线性变换,它可以实现图像的旋转、缩放、剪切和平移操作,适用于复杂场景下的图像配准。 #### 四、插值(Interpolators) 插值是图像配准过程中一个重要的环节,用于计算变换后图像的新位置...

    博睿拼接控制器使用手册.doc

    - 内置处理单元:处理视频信号的解码、缩放、拼接等功能。 - 电源部分:提供稳定的工作电压,确保控制器正常运行。 **二、安全操作指南** 在安装、使用和维护BR-VPII拼接控制器时,遵循以下安全注意事项至关重要,...

    Unity 通用的一些图片

    在这个名为“Unity 通用的一些图片”的压缩包中,我们可能找到了一些在Unity项目中常用到的图像资源,如ICON(图标)和背景图。这些图像对于构建用户界面(UI)、游戏场景或应用程序的视觉效果至关重要。 首先,...

    基于SIFT特征点及RANSAC筛选的图像拼接

    在图像处理领域,图像拼接是一项重要的技术,它主要用于将多张视角相近或者覆盖部分重叠的图片合并成一张全景图。"基于SIFT特征点及RANSAC筛选的图像拼接"是一个利用计算机视觉技术实现图像融合的系统,其核心在于...

    基于ARM9 FPGA方案的电视拼接墙主控系统设计.pdf

    系统中的多路视频信号通过业务单板进行处理,包括视频缩放、视频叠加、视频格式转换等。之后,处理后的信号通过业务背板总线传送给主控板上的FPGA信号处理系统。FPGA系统负责视频图像的局部补偿和校正,再将处理后的...

    Android-Java开发中用到的工具类收集

    - 图片处理可能涉及到缩放、裁剪、旋转、颜色转换等功能。Android提供了`Bitmap`类进行基本操作,而` Glide`、`Picasso`或` Fresco`等库则更加强大。 - 例如:`ImageUtil`类可能包含`compressImage()`用于压缩图片...

    DotNet基础类大全.zip

    7. **PicDeal.cs**:图片处理类,可能包含图片的上传、缩放、裁剪、旋转等图像操作功能,常用于网站的图像展示和管理。 8. **UrlOper.cs**:URL操作类,可能包括URL编码解码、参数解析、构建URL等方法,对于处理...

    常用工具类

    2. **图片处理**:缩放、裁剪、旋转、调整亮度对比度等图像处理操作,常用于图片预览、上传等场景。 3. **图片转换**:将图片转换为二进制流或Base64编码,便于在网络传输中使用。 总结起来,"jutils-master"压缩包...

    在GPU上快速实现图像拼接

    图像拼接是摄影测量学、计算机视觉、图像处理和计算机图形学领域的一个活跃的研究方向。它是一种从不同视角获得的局部图像序列构造全景图像马赛克的过程。图像拼接的初始应用主要集中在从一系列图像构建大型航空和...

    DotNet基础类大全-完整

    7. **PicDeal.cs** - 图像处理类,用于处理图片的读取、保存、缩放、裁剪、旋转等操作,可以用于图像处理或图形设计的场景。 8. **UrlOper.cs** - URL操作类,可能提供了URL解析、拼接、编码解码等方法,常用于处理...

    Android快速开发系列 10个常用工具类

    2. **BitmapUtil**: 用于图片处理,包括压缩图片大小、裁剪图片、转换图片格式等功能。在内存有限的移动设备上,有效地管理和处理图片至关重要,BitmapUtil能帮助我们避免内存溢出问题。 3. **DateUtil**: 时间日期...

    Android常用的工具类

    8. **图片处理工具类** (ImageUtil) 包含图片的加载、压缩、裁剪、缩放等方法,尤其在处理用户上传的图片或者加载网络图片时非常实用。 9. **对话框工具类** (DialogUtil) 可以快速创建和展示各种类型的对话框,...

Global site tag (gtag.js) - Google Analytics