java实现图片的缩放,合成,旋转,dpi读取
上代码
图片缩放
import java.awt.;
import java.awt.image.BufferedImage;
import java.io.;
/**
* 缩小图片
*
* @param inputStream
* @param imageShrinkPath 缩小之后图片的存储路径
* @param ext 图片的后缀
* @throws IOException
*/
public void imageShrink(InputStream inputStream, String imageShrinkPath, String ext) throws IOException {
BufferedImage img = ImageIO.read(inputStream);
int width = img.getWidth();
int height = img.getHeight();
//图片高和宽的比值
double scale = height * 1.0 / width;
//缩小之后图片的宽度(可以自己设置)
int width2 = 600;
//缩小之后图片的高度(可以自己设置)
int height2 = (int) (scale * 600);
//获取缩放后的Image对象
Image img2 = img.getScaledInstance(width2, height2, Image.SCALE_DEFAULT);
//新建一个和Image对象相同大小的画布
BufferedImage image = new BufferedImage(width2, height2, BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics2D graphics = image.createGraphics();
//去除掉png的黑色背景(PNG格式的图片需要特殊处理)
if ("png".equalsIgnoreCase(ext)) {
image = graphics.getDeviceConfiguration().createCompatibleImage(image.getWidth(null), image.getHeight(null), Transparency.TRANSLUCENT);
graphics = image.createGraphics();
}
//将Image对象画在画布上,最后一个参数,ImageObserver:接收有关 Image 信息通知的异步更新接口,没用到直接传空
graphics.drawImage(img2, 0, 0, null);
//释放资源
graphics.dispose();
//使用ImageIO的方法进行输出,记得关闭资源
OutputStream out = new FileOutputStream(imageShrinkPath);
ImageIO.write(image, ext, out);
out.close();
inputStream.close();
}
两张图片的合成(包含底图的旋转)
import org.apache.commons.imaging.ImageInfo;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.Imaging;
import java.time.LocalDate;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
/**
* 图片合成
* @param original 底层图片网络url
* @param add 上层图片网络url
* @param rotationAngle 旋转角度
* @return
*/
public String imageSynthesis(String original, String add, int rotationAngle) {
//存储根目录
String localFilePath ="D:";
//存储文件夹(不含根目录)
String dateStr = "img/defaultCustomer";
LocalDate now = LocalDate.now();
//每天创建一个新的文件夹
dateStr = dateStr + "/" + now.getYear() + "/" + now.getMonth() + "/" + now.getDayOfMonth();
//完整文件夹
String basedir = localFilePath + "/" + dateStr;
File dir = new File(basedir);
if (!dir.exists() && !dir.isDirectory()) {
dir.mkdirs();
}
//合成之后的图片为png格式
String fileName = "www-" + System.currentTimeMillis() + ".png";
InputStream oUrl = null;
InputStream aUrl = null;
try {
oUrl = new URL( original).openStream();
aUrl = new URL( add).openStream();
BufferedImage big = ImageIO.read(oUrl);
BufferedImage small = ImageIO.read(aUrl);
//旋转之后的底图ImageIO对象
big = ImageUntil.rotateImage(big, rotationAngle);
//获取画笔
Graphics2D g = big.createGraphics();
//绘制图片
g.drawImage(small, 0, 0, big.getWidth(), big.getHeight(), null);
g.dispose();
ImageIO.write(big, "png", new File(basedir + "/" + fileName));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (aUrl!=null){
aUrl.close();
}
if (oUrl!=null){
oUrl.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//虚拟路径
return "/aaa/" + dateStr + "/" + fileName;
}
获取图片dpi
maven
<!--获取图片分辨率-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>1.0-alpha1</version>
</dependency>
代码
被压缩过的图片和ps强制修改dpi的图片 该方法读取出的dpi为-1
/**
* 获取图片dpi
* @param file 文件对象
* @return
*/
public int getDpi(File file ) {
ImageInfo imageInfo = null;
try {
InputStream inputStream=file.getInputStream();
String fileName= file.getName();
imageInfo = Imaging.getImageInfo(inputStream,fileName);
return imageInfo.getPhysicalHeightDpi();
} catch (ImageReadException | IOException e) {
logger.error(e.getMessage());
return 0;
}
}