当前位置: 首页 > 编程日记 > 正文

根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码

目录

1、根据传入坐标和图片URL地址对图片进行切图操作

2、将图片转化成Base64位编码、根据传入坐标 算出切点坐标


在开发过程的学习记录,此两个工具类主要是对图像的处理(切图),对文件的想换转化,将文件转化成字节数组、Base64位编码等。

1、根据传入坐标和图片URL地址对图片进行切图操作

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;/*** @program: process* @description: 切图工具类* @author: Huyande* @create: 2019-01-17 14:11**/public class CutImageUtils {/*** 传入坐标和图片URL地址  切图 生成图片到指定的目录* @param x* @param y* @param width* @param height* @param imgUrl* @throws Exception*/public static void cut(int x, int y, int width, int height, String imgUrl) throws Exception{byte[] imgBytes = getUrlFileData(imgUrl);FileInputStream is = byteToFile(imgBytes, "cutPic.jpg");ImageInputStream iis = null ;getUrlFileData(imgUrl);Iterator<ImageReader> it= ImageIO.getImageReadersByFormatName("jpg");ImageReader reader = it.next();iis = ImageIO.createImageInputStream(is);reader.setInput(iis, true) ;ImageReadParam param = reader.getDefaultReadParam();Rectangle rect =  new Rectangle(x, y, width, height);param.setSourceRegion(rect);BufferedImage bi=reader.read(0,param);ImageIO.write(bi, "jpg", new File("E:\\cutPic.jpg"));is.close() ;iis.close();}//获取链接地址文件的byte数据public static byte[] getUrlFileData(String fileUrl) throws Exception{URL url = new URL(fileUrl);HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();httpConn.connect();InputStream cin = httpConn.getInputStream();ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = cin.read(buffer)) != -1) {outStream.write(buffer, 0, len);}cin.close();byte[] fileData = outStream.toByteArray();outStream.close();return fileData;}/*** byte[] 转 FileInputStream* @param bytes* @param fileName* @return*/public static FileInputStream byteToFile(byte[] bytes, String fileName) {File file = new File(fileName);FileInputStream fileInputStream = null;try {OutputStream output = new FileOutputStream(file);BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);bufferedOutput.write(bytes);fileInputStream = new FileInputStream(file);file.deleteOnExit();return fileInputStream;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return fileInputStream;}
}

2、将图片转化成Base64位编码、根据传入坐标 算出切点坐标

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @program: process* @description: 图像操作工具包* @author: Huyande* @create: 2019-01-17 14:21**/public class OperateImageUtils {private Logger log = LoggerFactory.getLogger(getClass());public static final String DEFAULT_IMG_NAME = "tmpImgName";public static final String DEFAULT_IMG_FORMAT = "jpg";public static final String DEFAULT_DATA_URI = "data:application/octet-stream;base64,";private int x;private int y;private int width;private int height;public OperateImageUtils() {}/*** 构造方法* @param x* @param y* @param width* @param height*/public OperateImageUtils(int x, int y, int width, int height) {this.x = x;this.y = y;this.width = width;this.height = height;}/**** 构造方法  传入一个集合坐标值  算出 x,y,width,height* @param bboxes*/public OperateImageUtils(List<List<Integer>> bboxes) {int upLeftX = ((Integer) ((List) bboxes.get(0)).get(0)).intValue();int upLeftY = ((Integer) ((List) bboxes.get(0)).get(1)).intValue();int upRightX = ((Integer) ((List) bboxes.get(1)).get(0)).intValue();int downLeftY = ((Integer) ((List) bboxes.get(3)).get(1)).intValue();int width = Math.abs(upRightX - upLeftX);int height = Math.abs(downLeftY - upLeftY);this.x = upLeftX;this.y = upLeftY;this.width = width;this.height = height;}/**** @param imgBytes* @param suffix* @return*/public byte[] cut(byte[] imgBytes, String suffix) {try {ImageInputStream iis = null;FileInputStream is = byteToFile(imgBytes, "tmpImgName");Iterator it = ImageIO.getImageReadersByFormatName(suffix);ImageReader reader = (ImageReader) it.next();iis = ImageIO.createImageInputStream(is);reader.setInput(iis, true);ImageReadParam param = reader.getDefaultReadParam();Rectangle rect = new Rectangle(this.x, this.y, this.width, this.height);param.setSourceRegion(rect);BufferedImage bi = reader.read(0, param);byte[] cutImg = imageToBytes(bi, "jpg");return cutImg;} catch (IOException e) {this.log.error("image file cut fail, error information is : {} ", e);}return null;}public byte[] imageToBytes(BufferedImage bImage, String format) {ByteArrayOutputStream out = new ByteArrayOutputStream();try {ImageIO.write(bImage, format, out);} catch (IOException e) {e.printStackTrace();}return out.toByteArray();}public int getX() {return this.x;}public void setX(int x) {this.x = x;}public int getY() {return this.y;}public void setY(int y) {this.y = y;}public int getWidth() {return this.width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return this.height;}public void setHeight(int height) {this.height = height;}/*** 	通过文件地址 获取到文件 将文件转化成 byte 数组* @param fileUrl* @return*/public byte[] getUrlFileData(String fileUrl) {try {URL url = new URL(fileUrl);HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();httpConn.connect();InputStream cin = httpConn.getInputStream();ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = cin.read(buffer)) != -1) {outStream.write(buffer, 0, len);}cin.close();byte[] fileData = outStream.toByteArray();outStream.close();return fileData;} catch (IOException e) {this.log.error("get imageFile by fileUrl fail, error information is : {} ", e);}return null;}/*** 将byte 数组 转化成文件输入流* @param bytes* @param fileName* @return*/public FileInputStream byteToFile(byte[] bytes, String fileName) {File file = new File(fileName);FileInputStream fileInputStream = null;try {OutputStream output = new FileOutputStream(file);BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);bufferedOutput.write(bytes);fileInputStream = new FileInputStream(file);file.deleteOnExit();return fileInputStream;} catch (IOException e) {this.log.error("bytes to Image file fail, error information is : {} ", e);}return fileInputStream;}/*** * @param imageUrl* @param suffix* @return*/public String getBase64Url(String imageUrl, String suffix) {byte[] imgBuffer = null;if (imageUrl.contains("data:application/octet-stream;base64,"))imgBuffer = getBytesByBase64(imageUrl);else {imgBuffer = getUrlFileData(imageUrl);}if ((suffix.isEmpty()) || (null == suffix)) {suffix = "jpg";}byte[] cutImg = cut(imgBuffer, suffix);String result = Base64.getEncoder().encodeToString(cutImg);return "data:application/octet-stream;base64," + result;}public byte[] getBytesByBase64(String base64Uri) {String base64Code = base64Uri.substring(base64Uri.indexOf(",") + 1);byte[] buffer = Base64.getDecoder().decode(base64Code);return buffer;}/*** 	将本地文件转换成字节数组* @param fileUrl* @return*/public byte[] getFileData(String filePath) {try {File file = new File(filePath);InputStream cin =new FileInputStream(file);ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = cin.read(buffer)) != -1) {outStream.write(buffer, 0, len);}cin.close();byte[] fileData = outStream.toByteArray();outStream.close();return fileData;} catch (IOException e) {this.log.error("get imageFile by fileUrl fail, error information is : {} ", e);}return null;}/*** * @param imageUrl* @param suffix* @return*/public String getBase64Url_Flie(String imageUrl, String suffix) {byte[] imgBuffer = null;imgBuffer = getFileData(imageUrl);if ((suffix.isEmpty()) || (null == suffix)) {suffix = "jpg";}byte[] cutImg = cut(imgBuffer, suffix);String result = Base64.getEncoder().encodeToString(cutImg);return "data:application/octet-stream;base64," + result;}}

相关文章:

SQL语句 goto

代码 /*********************求1234......................100的和*******************************/declaresumsmallint,ismallintseti1setsum0label: if(i<100) beginsetsumsumisetii1gotolabel endprintsum 都说不要用goto,可我看了一些经典sql 代码,…

zookeeper 和 dubbo 配置

转载于:https://www.cnblogs.com/tian1993/p/10807996.html

学习总结--团队项目

《一》团队项目 小组成员思维活跃&#xff0c;仅仅在一节课的时间里提出了n个颠覆软件开发界的思维的idea&#xff0c;最后在层层pk最后留下了八个惊世骇俗的想法。其中包括了要重振中国游戏界&#xff0c;打破王者农药的垄断地位要重写的贪吃蛇小游戏和2D游戏&#xff1b;还有…

markdown自动生成侧边栏TOC /目录

markdown自动生成侧边栏TOC /目录 模板地址 &#xff1a; https://github.com/huyande/MarkdownTemplate.git

[英文面試]如何寫面試後的感謝信

Dear Mr. X:尊敬的X先生&#xff1a; Thank you very much for the interview yesterday. I learned a great deal about your company, its major projects, and its ambitious plans for future development in Guangzhou. 非常感謝您昨天的面試。我了解到許多有關貴公司的情…

【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)

震惊&#xff01;世上最接地气的字符串浅谈(HASHKMP) 笔者过于垃圾&#xff0c;肯定会有些错的地方&#xff0c;欢迎各位巨佬指正&#xff0c;感激不尽&#xff01; 引用&#xff1a;LYD的蓝书&#xff0c;一本通&#xff0c;DFC的讲稿&#xff0c;网上各路巨佬 Luguo id: 章鱼…

SQL Server2008及以上 表分区操作详解

SQL Server 表分区之水平表分区 转自&#xff1a;https://www.cnblogs.com/Brambling/p/6766482.html什么是表分区&#xff1f; 表分区分为水平表分区和垂直表分区&#xff0c;水平表分区就是将一个具有大量数据的表&#xff0c;进行拆分为具有相同表结构的若干个表&#xff1b…

浅谈New关键字

new关键字在我们的程序中可谓是无时不刻在用到&#xff0c;那么new关键字都可以用在哪些地方呢&#xff1f;考虑以下几个问题&#xff1a; 1、new一个class对象和new一个struct或者new一个enum有什么不同&#xff1f; 答&#xff1a;new一个class时&#xff0c;new完成2个内容&…

SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录

1、开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 2、创建注解 因需要在方法层面上进行控制 所以使用注解 import java.…

Linux下屏蔽Ctrl+Alt+Delete

1、Redhat 5.X/CentOS5.X--------------------------------------使用Root账户登陆系统&#xff0c;修改/etc/inittab# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r now这句前面加“#”注销掉 就可以了&#xff01;--------------------------------------2、Fe…

Python网络爬虫--urllib

本篇随便记录学习崔庆才老师编著的《Python3 网络爬虫开发实战》以及urllib标准库使用 urllib库是Python内置的HTTP请求库&#xff0c;包含四个模块&#xff1a; request&#xff1a;最基本的HTTP请求模块&#xff0c;可以用来模拟发送请求。error&#xff1a;异常处理模块&…

Python基础三--字典,集合,编码,深浅copy,元祖、文件操作

字典 dict数据类型划分&#xff1a;可变数据类型&#xff0c;不可变数据类型不可变数据类型&#xff1a; 元组&#xff0c;bool值&#xff0c;int&#xff0c;str 可哈希可变数据类型&#xff1a; list&#xff0c;dict&#xff0c;set 不可哈希dict key…

springboot +security +mybatis+thymeleaf 实现简单的用户 角色 权限(资源) 管理

1、用户 角色 资源的关系 2、实现思路 3、参考资料 Spring Boot Security Redis 实现简单权限控制 将返回结果变成json 响应改客户端 在第六项 4、实现代码 https://github.com/huyande/springsecurity.git 5、其他问题记录 在使用springboot 2.1.X 版本 &#xff0…

在JS中最常看到切最容易迷惑的语法(转)

发现一篇JS中比较容易迷惑的语法的解释,挺有用的,转载下,与大家分享: js中大括号有四种语义作用语义1&#xff0c;组织复合语句,这是最常见的 Js代码 if( condition ) { //... }else { //... } for() { //... } if( condition ) {//... }else {//... } f…

三、类型设计规范

一、类型的逻辑分组从CLR的角度来看&#xff0c;只有两种类型&#xff1a;引用类型和值类型。但从框架设计来说&#xff0c;可以进行更细致的分类 1、引用类型&#xff0c;包括&#xff1a;类、静态类、集合、数组、异常、属性2、值类型&#xff0c;包括&#xff1a;枚举和结构…

使用mybatis一次性添加多条数据 在oracle 数据库上

1、sql 语句 #sql 语句 insert into STD_XXXX &#xff08;表名&#xff09; (ID,NAME,CLASSNAME ) select STD_XXX_SEQUENCE.Nextval,&#xff08;自增序列名称&#xff09; XXX.* from (select 1,3 from dual unionselect 2,3 from dual)XXX 2、mybatis #多条插入 &…

使用SharpPCap在C#下进行网络抓包

转自http://www.cnblogs.com/billmo/archive/2008/11/09/1329972.html 在做大学最后的毕业设计了,无线局域网络远程安全监控策略那么抓包是这个系统设计的基础以前一直都是知道用winpcap的,现在网上搜了一下,有用C#封装好了的,很好用下面是其中的几个用法这个类库作者的主页:ht…

Spring Security的RBAC数据模型嵌入

1.简介 ​ 基于角色的权限访问控制&#xff08;Role-Based Access Control&#xff09;作为传统访问控制&#xff08;自主访问&#xff0c;强制访问&#xff09;的有前景的代替受到广泛的关注。在RBAC中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得…

实用Jquery开发自己的插件

实用Jquery开发自己的插件 jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。 jQuery.fn.extend(object);给jQuery对象添加方法。 fn 是什么东西呢。查看jQuery代码&#xff0c;就不难发现。 jQuery.fn jQuery…

无线网中的一些技术名词和解释

现在大家到处都可以听到在说WLAN&#xff0c;到底 个WLAN是什么意思呢&#xff1f;WLAN&#xff1a;Wireless Local Area Network的缩写&#xff0c;也是无线局域网的意思。AP&#xff1a;Access Point,无线接入器&#xff0c;常常缩写为AP。SSID&#xff1a;也缩写国ESSID&…

说到心里的哲理个性签名 学生时代的恋爱无非就是陪伴二字

学生时代的恋爱无非就是陪伴二字 也许因为得不到所以空想总是美好 . 让一个男人哭了 没错你赢了 但是你玩大了 曾经我们都那样嚣张后来怎么也学会了退让. 爱一个人成为习惯就会失去放手的勇敢. 有时沉默并不是因为词穷而是因为心空. 前任也曾是对的人 别打听我我没故事可说. 你…

切换用户启动程序

#!/bin/bash su - elasticsearch <<EOF /opt/elasticsearch-6.6.2/bin/elasticsearch -d exit EOF转载于:https://www.cnblogs.com/divl/p/10826803.html

即将到来的日子 ,你会寂寞吗?

见到如此的数字&#xff0c;不知道身边的你是否会想起一些往事&#xff0c;我想这一刻很难去形容&#xff0c;因为哥也会有寂寞的一天。 从来不太喜欢的节日&#xff0c;但是每逢到来的时候&#xff0c;总会有一阵阵的痛。今天不是好的节日&#xff0c;在地球上某一个角落&…

Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

目录 1、Mybatis 获取当前序列和下一个序列值 2、Mybatis 在一个方法中写多条SQL 语句 1、Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_sequence.currval from dual#获取下一个序列值 select XXX_sequence.Nextval from dual2、Mybatis 在一个方法中写多条…

MikuMikuDance 6 菜单汉化补丁

MikuMikuDance是日本人樋口优所开发&#xff0c; 将VOCALOID2的初音未来等角色制作3D模组的免费软件。 简称为MMD。 汉化过程中 有同学反映 原来4.0 完全汉化版会出错 而不得不用回原版故这次 汉化仅汉化菜单部分 理论上不会出错如果是日文模式请选择ヘルプ(&H)-&…

收缩临时库 shrink tempdb

tempdb实际占用空间40mb,文件大小70G, 原始大小2GB 无法使用dbcc shrinkfile进行收缩. 看到的解决方案是 重启数据库DBCC FREESYSTEMCACHE (ALL) ,然后再收缩.http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/7b45f0de-2aa3-4de0-930b-d9d0fe931b3a http…

H5如何测试?

它跟安卓APP与IOS APP有什么样的区别呢&#xff1f;★ 我们以往的APP是使用原生系统内核的&#xff0c;相当于直接在系统上操作&#xff0c;是我们传统意义上的软件&#xff0c;更加稳定★ H5的APP先得调用系统的浏览器内核&#xff0c;相当于是在网页中进行操作&#xff0c;较…

二维数组练习--矩阵的加法和乘法

数组的练习示例展示&#xff1a; package arrayList; /*** 矩阵的集中运算法则&#xff1a;求和&#xff0c;求积&#xff0c;求逆矩阵&#xff0c;转置矩阵......* author Drew**/ public class Arrays {/*** 两个二维数组&#xff08;矩阵&#xff09;求和。* param a 矩阵&a…

文件分享微信小程序的设计与开发 Java开发微信小程序 毕业设计

目录 使用的技术 2、功能介绍 3、此小程序未部署 所以体验不了 4、如何联系我或需要源码进行联系 使用的技术 SpringbootMybatisMysql 微信小程序Mpvue 1、小程序展示 后台管理 2、功能介绍 用户第一次使用小程序 用户授权上传视频和图片设置密码和有效期分享给微信好友…

Silverlight 3发布新版3.0.50106.0

微软1月19日发布Silverlight 3新版本3.0.50106.0.该版本主要修复以下几个问题&#xff1a;问题一&#xff1a; 当使用图形硬件加速功能&#xff08;GPU&#xff09;的时候&#xff0c;如果GPU驱动报错&#xff0c;Silverlight 3应用将不再正确显示内容。该问题是因为Silverligh…