java对图片进行操作,仅仅是小demo

package com.cy.thumb;

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class Thumb {
    public static void main(String[] args) throws IOException {

        //把图片image.png 长宽等比缩小5倍。
        reduceImage("E:/image.png", "E:/image1.png", 5);

        //把图片image.png 长宽各设置为100
        reduceImage("E:/image.png", "E:/image2.png", 100, 100);

    }

    /**
     * 对图片进行剪裁   返回字节数组
     * @param is            图片输入流
     * @param width            裁剪图片的宽
     * @param height        裁剪图片的高
     * @param imageFormat    输出图片的格式 "jpeg jpg等"
     * @return
     */
    public static byte[] clipImage(InputStream is,int width, int height, String imageFormat){
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            // 构造Image对象
            BufferedImage src = javax.imageio.ImageIO.read(is);
            // 缩小边长
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 绘制 缩小  后的图片
            tag.getGraphics().drawImage(src, 0, 0, width, height, null);
            ImageIO.write(tag, imageFormat, bos);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bos.toByteArray();
    }

    /**
     * 重置图片大小
     * @param srcImagePath            读取图片路径
     * @param toImagePath            写入图片路径
     * @param width                    重新设置图片的宽
     * @param height                重新设置图片的高
     * @throws IOException
     */
    public static void reduceImage(String srcImagePath,String toImagePath,int width, int height) throws IOException{
        FileOutputStream out = null;
        try{
            //读入文件
            File file = new File(srcImagePath);
            // 构造Image对象
            BufferedImage src = javax.imageio.ImageIO.read(file);
            // 缩小边长
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 绘制 缩小  后的图片
            tag.getGraphics().drawImage(src, 0, 0, width, height, null);
            out = new FileOutputStream(toImagePath);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(out != null){
                  out.close();
            }
        }
    }

    /**
     * 按倍率缩小图片
     * @param srcImagePath        读取图片路径
     * @param toImagePath        写入图片路径
     * @param ratio                缩小比率  宽、高一起等比率缩小
     * @throws IOException
     */
    public static void reduceImage(String srcImagePath,String toImagePath,int ratio) throws IOException{
        FileOutputStream out = null;
        try{
            //读入文件
            File file = new File(srcImagePath);
            // 构造Image对象
            BufferedImage src = javax.imageio.ImageIO.read(file);
            int width = src.getWidth();
            int height = src.getHeight();
            // 缩小边长
            BufferedImage tag = new BufferedImage(width / ratio, height / ratio, BufferedImage.TYPE_INT_RGB);
            // 绘制 缩小  后的图片
            tag.getGraphics().drawImage(src, 0, 0, width / ratio, height / ratio, null);
            out = new FileOutputStream(toImagePath);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(out != null){
                  out.close();
            }
        }
    }

    /**
     * 对图片裁剪,并把裁剪新图片保存
     * @param srcPath               读取源图片路径
     * @param toPath             写入图片路径
     * @param x                     剪切起始点x坐标
     * @param y                     剪切起始点y坐标
     * @param width                 剪切宽度
     * @param height             剪切高度
     * @param readImageFormat     读取图片格式
     * @param writeImageFormat   写入图片格式
     */
    public static void cropImage(String srcPath, String toPath, int x,int y,int width,int height, String readImageFormat,String writeImageFormat){
        FileInputStream fis = null ;
        ImageInputStream iis =null ;
        try{
            //读取图片文件
            fis = new FileInputStream(srcPath);
            Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(readImageFormat);
            ImageReader reader = readers.next();
            //获取图片流
            iis = ImageIO.createImageInputStream(fis);
            reader.setInput(iis, true);
            ImageReadParam param = reader.getDefaultReadParam();
            //定义一个矩形
            Rectangle rect = new Rectangle(x, y, width, height);
            //提供一个 BufferedImage,将其用作解码像素数据的目标。
            param.setSourceRegion(rect);
            BufferedImage bi = reader.read(0, param);
            //保存新图片
            ImageIO.write(bi, writeImageFormat, new File(toPath));
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(fis!=null){
                    fis.close();
                }
                if(iis!=null){
                    iis.close();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

}

上面部分参考文章:http://blog.csdn.net/u012486840/article/details/52937823                           

下面转载自:http://blog.csdn.net/u012481520/article/details/51802469#t0

Java之BufferedImage简谈

 int width = 100;
 int height = 100;
  // 1.创建一个不带透明色的BufferedImage对象
BufferedImage bimage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);

// 2.创建一个带透明色的BufferedImage对象
 bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

// 3.创建一个与屏幕相适应的BufferedImage对象
。。。。

。。。。

四、BufferedImage  —->byte[]
ImageIO.write(BufferedImage image,String format,OutputStream out);方法可以很好的解决问题;
参数image表示获得的BufferedImage;
参数format表示图片的格式,比如“gif”等;
参数out表示输出流,如果要转成Byte数组,则输出流为ByteArrayOutputStream即可;
执行完后,只需要toByteArray()就能得到byte[];

五、byte[] ——>BufferedImage
ByteArrayInputStream in = new ByteArrayInputStream(byte[]b);    //将b作为输入流;
BufferedImage image = ImageIO.read(InputStream in);     //将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();

时间: 2024-08-27 09:33:00

java对图片进行操作,仅仅是小demo的相关文章

js操作数组的小Demo

var telStr=$("#TELNUM").val(); var telsPre=telStr.split(","); var tels=telsPre.reverse(); var size = tels.length; for(var i=0; i<size; i++){ if(""!=tels[i]) { var index=0; if(i==0){ d["CUSTOMER_TEL"] =tels[i]; in

spark集群配置以及java操作spark小demo

spark 安装 配置 使用java来操作spark spark 安装 tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz rm spark-2.4.0-bin-hadoop2.7.tgz mv spark-2.4.0-bin-hadoop2.7 spark sudo vim /etc/profile export SPARK_HOME=/usr/local/storm export PATH=$PATH:$SPARK_HOME/bin source /etc/pro

java操作memcached入门教程demo代码

原文:java操作memcached入门教程demo代码 源代码下载地址:http://www.zuidaima.com/share/1550463754996736.htm 参考地址: http://www.open-open.com/lib/view/open1357831114183.html http://tech.idv2.com/2008/07/10/memcached-001/ 感谢 京-java牛-ID号1  感谢 锡-SuperPrivate-195 在网上搜索了部分代码,一个

java poi 操作excel,xssf 读excel 2007,将某些单元格为固定值

本来想看一下java IO,NIO,发现这块知识体系还挺大.暂时写一个操作excel的demo.由于时间关系,完成了功能,后期继续完善. 功能:读取excel表格(该表格为测试结果表格,共十几列,第一行是标题),将第0列标记为id(递增),第9列标记为结果(默认是PASS),第10列标记为姓名. 本可以使用excel的拖拽功能,但由于excel中的内容和样式经常需要修改,因此导致重复工作.暂写这个小demo,期待完善后功能更详尽. import org.apache.poi.hssf.userm

2、链接数据库+mongodb基础命令行+小demo

链接数据库并且打印出数据的流程:1.在CMD里面输入 mongod 2.在CMD里面输入 mongo 3.在输入mongodb命令行里面进行操作,首先输入 show dbs 来查看是否能够链接得上库4.定义db var db = connect('log'); //链接数据库 链接的是哪一个数据库?5.插入数据:db.login.insert(jsonData); //插入数据 5.命令行一:基础命令行(1).查看存在数据库命令 : show dbs (2).查看数据库版本命令 : db.ver

在JAVA中记录日志的十个小建议

JAVA日志管理既是一门科学,又是一门艺术.科学的部分是指了解写日志的工具以及其API,而选择日志的格式,消息的格式,日志记录的内容,哪种消息对应于哪一种日志级别,则完全是基于经验.从过去的实践证明,JAVA的日志记录会严重的影响性能.我也曾多次亲眼见到在DEBUG模式下运行的在线股票交易程序,比在WARN或是其它更高层次模式下运行时延时要严重的多.延时和速度是任何电子交易平台或是股票交易平台的一个重大关注点,所以我们必须了解并掌握JAVA日志及其最佳实践.这不仅仅只是为了用在金融或是投资银行领

SpringBoot-Vue实现增删改查及分页小DEMO

前言 主要通过后端 Spring Boot 技术和前端 Vue 技术来简单开发一个demo,实现增删改查.分页功能以及了解Springboot搭配vue完成前后端分离项目的开发流程. 开发栈 前端 开发工具:WebStorm 开发框架:vue + axios 包管理工具: npm 打包工具:webpack 后端 开发工具:IDEA 开发框架:Springboot + mybatis 打包工具:maven 数据库: MySQL PS:假设以上的的工具你都安装好啦,写CRUD小DEMO时进坑了,这篇

Androidstudio如何制作一个高仿小米计算器小demo

Androidstudio如何制作一个高仿小米计算器小demo ————安德风 一.最终成品效果图: 二.界面设计布局源代码:文件名activity_main.xml (存放在jsj(我的模块名为jsj)/res/layout/activity_main.xml) 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.a

用backbone实现的一个MVC的小demo

一.Apache配置 本实例需要使用php支持.要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码 <VirtualHost *:80> DocumentRoot "D:/htdocs/backbone_demo" ServerName www.backbonedemo.cn </VirtualHost> 在windows的hosts文件中添加配置,hosts文件的位置在c:\windows\system32