Java 图片处理 格式转换
Java开源工具Jimi处理图片大小及格式转换
double height = (double) src.getHeight(null); // 得到源图长
System.out.println("源图宽:"+wideth);
String temp = desc;
File _file = null;
if (desc == null || desc.trim().equals(""))
desc = source;
if (!desc.toLowerCase().trim().endsWith("jpg")) {
writer.setSource(image);
// 加入属性设置,非必要
// /*
writer.setOptions(options);
// */
writer.putImage(outfile);
} catch (JimiException je) {
* @param quality
* 图片格式转换
*/
public void toJPG(String source, String type, int quality) {
//0<quality<100
if (quality < 0 || quality > 100 || (quality + "") == null || (quality + "").equals("")) {
Java开源工具Jimi处理图片大小及格式转换
java中bufferedimage的用法
文章标题:深度解析Java中BufferedImage的用法与应用一、介绍在Java编程中,BufferedImage是一个常用的类,用于处理图像的像素数据。
它提供了丰富的方法和功能,可以用于图像的读取、处理和保存,同时也支持图像的格式转换和像素操作。
在本文中,我们将深度探讨BufferedImage的用法与应用,并介绍其在Java图像处理中的重要性。
二、BufferedImage的基本用法1. BufferedImage的创建在Java中,我们可以通过ImageIO类的read()方法来创建一个BufferedImage对象,例如:```BufferedImage image = ImageIO.read(new File("image.jpg")); ```2. BufferedImage的基本操作BufferedImage类提供了getRGB()和setRGB()方法来读取和修改像素值,同时也支持获取宽度、高度和颜色模型等属性。
三、BufferedImage的高级功能1. 图像格式转换BufferedImage可以方便地进行图像格式的转换,例如将JPEG格式的图像转换为PNG格式:```BufferedImage originalImage = ImageIO.read(newFile("image.jpg"));ImageIO.write(originalImage, "png", new File("image.png"));```2. 像素级操作BufferedImage支持对图像进行像素级操作,例如修改像素颜色、绘制图形和文字等。
四、BufferedImage的应用场景1. 图像处理在图像处理应用中,BufferedImage可以用于图像的读取、编辑和保存,同时也支持图像的缩放、裁剪和旋转等操作。
2. 视频处理在实时视频处理中,BufferedImage可以用于处理视频帧的像素数据,例如视频流的转换、滤镜效果的应用和视频数据的提取等。
Java图像处理:使用Java 2D API实现图片处理
Java图像处理:使用Java 2D API实现图片处理引言:随着数字摄影技术的发展,我们每天都会拍摄大量的照片。
然而,有时候我们可能需要对这些照片进行一些处理,以使它们更加美观或符合特定的需求。
在本文中,我们将介绍如何使用Java 2D API来实现图片处理,帮助您更好地处理和优化您的图片。
第一部分:Java 2D API简介Java 2D API是Java平台中用于处理图形和图像的强大工具。
它提供了一组丰富的类和方法,使我们能够创建和操作各种图形对象,如线条、矩形、多边形和图像。
Java 2D API还支持图形渲染、颜色管理和图像转换等高级功能。
第二部分:加载和显示图片在开始处理图片之前,我们首先需要加载和显示图片。
Java 2D API提供了Image类来处理图像。
我们可以使用ImageIO类的静态方法read()来从文件中读取图像,并将其保存在一个Image对象中。
然后,我们可以使用Graphics类的drawImage()方法将图像绘制到指定的位置上。
第三部分:图片缩放有时候,我们可能需要调整图片的大小,使其适应特定的显示区域或满足特定的要求。
Java 2D API提供了AffineTransform类来处理图像的变换操作。
我们可以使用AffineTransform类的scale()方法来缩放图像。
通过指定缩放因子,我们可以按比例增加或减小图像的大小。
第四部分:图片旋转除了缩放,有时候我们还需要将图片旋转一定角度。
Java 2D API同样提供了AffineTransform类来实现图像的旋转操作。
我们可以使用AffineTransform类的rotate()方法来指定旋转的角度,并将其应用于图像。
第五部分:图片滤镜效果为了给图片增加一些特殊的效果,Java 2D API提供了一些内置的滤镜类。
我们可以使用这些滤镜类来对图像进行模糊、锐化、亮度调整等操作。
通过创建一个Filter对象,并将其应用于图像,我们可以很容易地实现这些效果。
Java图像处理工具类剖析
Java图像处理工具类这里给大家分享了一个java常用的图像处理工具类,包含缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等,有需要的小伙伴参考下。
本工具类的功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等复制代码代码如下:package net.kitbox.util;import java.awt.AlphaComposite;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.color.ColorSpace;import java.awt.image.BufferedImage;import java.awt.image.ColorConvertOp;import java.awt.image.CropImageFilter;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;import java.awt.image.ImagingOpException;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;/*** author:lldy* time:2012-5-6下午6:37:18* 图片处理工具类:<br>* 功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等*/public class ImageUtils {/*** 相对于图片的位置*/private static final int POSITION_UPPERLEFT=0;private static final int POSITION_UPPERRIGHT=10;private static final int POSITION_LOWERLEFT=1;private static final int POSITION_LOWERRIGHT=11;/*** 几种常见的图片格式*/public static String IMAGE_TYPE_GIF = "gif";// 图形交换格式public static String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组public static String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组public static String IMAGE_TYPE_BMP = "bmp";// 英文Bitmap(位图)的简写,它是Windows 操作系统中的标准图像文件格式public static String IMAGE_TYPE_PNG = "png";// 可移植网络图形private static ImageUtils instance;private ImageUtils() {instance = this;}/*** 获取实例* @return*/public static ImageUtils getInstance() {if (instance == null) {instance = new ImageUtils();}return instance;}public BufferedImage image2BufferedImage(Image image){System.out.println(image.getWidth(null));System.out.println(image.getHeight(null));BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);Graphics2D g = bufferedImage.createGraphics();g.drawImage(image, null, null);g.dispose();System.out.println(bufferedImage.getWidth());System.out.println(bufferedImage.getHeight());return bufferedImage;}/*** 缩放并转换格式后保存* @param srcPath源路径* @param destPath目标路径* @param width:目标宽* @param height:目标高* @param format:文件格式* @return*/public static boolean scaleToFile(String srcPath, String destPath, int width, int height,String format) {boolean flag = false;try {File file = new File(srcPath);File destFile = new File(destPath);if (!destFile.getParentFile().exists()) {destFile.getParentFile().mkdir();}BufferedImage src = ImageIO.read(file); // 读入文件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();flag = ImageIO.write(tag, format, new FileOutputStream(destFile));// 输出到文件流} catch (IOException e) {e.printStackTrace();}return flag;}/*** 缩放Image,此方法返回源图像按百分比缩放后的图像* @param inputImage* @param percentage 百分比允许的输入0<percentage<10000* @return*/public static BufferedImage scaleByPercentage(BufferedImage inputImage,int percentage){//允许百分比if(0>percentage||percentage>10000){throw new ImagingOpException("Error::不合法的参数:percentage->"+percentage+",percentage 应该大于0~小于10000");}//获取原始图像透明度类型int type = inputImage.getColorModel().getTransparency();//获取目标图像大小int w=inputImage.getWidth()*percentage;int h=inputImage.getHeight()*percentage;//开启抗锯齿RenderingHints renderingHints=new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_ANTIALIAS_ON);//使用高质量压缩renderingHints.put(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_RENDER_QUALITY);BufferedImage img = new BufferedImage(w, h, type);Graphics2D graphics2d =img.createGraphics();graphics2d.setRenderingHints(renderingHints);graphics2d.drawImage(inputImage, 0, 0, w, h, 0, 0, inputImage.getWidth(), inputImage.getHeight(), null);graphics2d.dispose();return img;/*此代码将返回Image类型return inputImage.getScaledInstance(inputImage.getWidth()*percentage,inputImage.getHeight()*percentage, Image.SCALE_SMOOTH);*/}/*** 缩放Image,此方法返回源图像按给定最大宽度限制下按比例缩放后的图像* @param inputImage* @param maxWidth:压缩后允许的最大宽度* @param maxHeight:压缩后允许的最大高度* @throws java.io.IOException* return*/public static BufferedImage scaleByPixelRate(BufferedImage inputImage, int maxWidth, int maxHeight) throws Exception {//获取原始图像透明度类型int type = inputImage.getColorModel().getTransparency();int width = inputImage.getWidth();int height = inputImage.getHeight();int newWidth = maxWidth;int newHeight =maxHeight;//如果指定最大宽度超过比例if(width*maxHeight<height*maxWidth){newWidth=(int)(newHeight*width/height) ;}//如果指定最大高度超过比例if(width*maxHeight>height*maxWidth){newHeight=(int)(newWidth*height/width);}//开启抗锯齿RenderingHints renderingHints=new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_ANTIALIAS_ON);//使用高质量压缩renderingHints.put(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_RENDER_QUALITY);BufferedImage img = new BufferedImage(newWidth, newHeight, type);Graphics2D graphics2d =img.createGraphics();graphics2d.setRenderingHints(renderingHints);graphics2d.drawImage(inputImage, 0, 0, newWidth, newHeight, 0, 0, width, height, null); graphics2d.dispose();return img;}/*** 缩放Image,此方法返回源图像按给定宽度、高度限制下缩放后的图像* @param inputImage* @param maxWidth:压缩后宽度* @param maxHeight:压缩后高度* @throws java.io.IOException* return*/public static BufferedImage scaleByPixel(BufferedImage inputImage, int newWidth, int newHeight) throws Exception {//获取原始图像透明度类型int type = inputImage.getColorModel().getTransparency();int width = inputImage.getWidth();int height = inputImage.getHeight();//开启抗锯齿RenderingHints renderingHints=new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//使用高质量压缩renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); BufferedImage img = new BufferedImage(newWidth, newHeight, type);Graphics2D graphics2d =img.createGraphics();graphics2d.setRenderingHints(renderingHints);graphics2d.drawImage(inputImage, 0, 0, newWidth, newHeight, 0, 0, width, height, null); graphics2d.dispose();return img;}/*** 切割图像,返回指定范围的图像* @param inputImage* @param x 起点横坐标* @param y 起点纵坐标* @param width 切割图片宽度:如果宽度超出图片,将改为图片自x剩余宽度* @param height 切割图片高度:如果高度超出图片,将改为图片自y剩余高度* @param fill 指定目标图像大小超出时是否补白,如果true,则表示补白;false表示不补白,此时将重置目标图像大小* @return*/public static BufferedImage cut(BufferedImage inputImage,int x,int y,int width,int height,boolean fill){//获取原始图像透明度类型int type = inputImage.getColorModel().getTransparency();int w = inputImage.getWidth();int h = inputImage.getHeight();int endx=x+width;int endy=y+height;if(x>w)throw new ImagingOpException("起点横坐标超出源图像范围");if(y>h)throw new ImagingOpException("起点纵坐标超出源图像范围");BufferedImage img;//补白if(fill){img = new BufferedImage(width, height, type);//宽度超出限制if((w-x)<width){width=w-x;endx=w;}//高度超出限制if((h-y)<height){height=h-y;endy=h;}//不补}else{//宽度超出限制if((w-x)<width){width=w-x;endx=w;}//高度超出限制if((h-y)<height){height=h-y;endy=h;}img = new BufferedImage(width, height, type);}//开启抗锯齿RenderingHints renderingHints=new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_ANTIALIAS_ON);//使用高质量压缩renderingHints.put(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_RENDER_QUALITY);graphics2d.setRenderingHints(renderingHints);graphics2d.drawImage(inputImage, 0, 0, width, height, x, y, endx, endy, null);graphics2d.dispose();return img;}/*** 切割图像,返回指定起点位置指定大小图像* @param inputImage* @param startPoint 起点位置:左上:0、右上:10、左下:1、右下:11* @param width 切割图片宽度* @param height 切割图片高度* @param fill 指定目标图像大小超出时是否补白,如果true,则表示补白;false表示不补白,此时将重置目标图像大小* @return*/public static BufferedImage cut(BufferedImage inputImage,int startPoint,int width,int height,boolean fill){//获取原始图像透明度类型int type = inputImage.getColorModel().getTransparency();int w = inputImage.getWidth();int h = inputImage.getHeight();BufferedImage img;//补白if(fill){img = new BufferedImage(width, height, type);if(width>w)width=w;if(height>h)height=h;//不补}else{if(width>w)width=w;if(height>h)height=h;img = new BufferedImage(width, height, type);}//开启抗锯齿RenderingHints renderingHints=new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_ANTIALIAS_ON);//使用高质量压缩renderingHints.put(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_RENDER_QUALITY);graphics2d.setRenderingHints(renderingHints);switch(startPoint){//右上case POSITION_UPPERRIGHT:graphics2d.drawImage(inputImage, w-width, 0, w, height, 0, 0, width, height, null);break;//左下case POSITION_LOWERLEFT:graphics2d.drawImage(inputImage, 0, h-height, width, h, 0, 0, width, height, null);break;//右下case POSITION_LOWERRIGHT:graphics2d.drawImage(inputImage, w-width, h-height, w, h, 0, 0, width, height, null);break;//默认左上case POSITION_UPPERLEFT:default:graphics2d.drawImage(inputImage, 0, 0, width, height, 0, 0, width, height, null);}graphics2d.dispose();return img;}/*** 以指定角度旋转图片:使用正角度theta 进行旋转,可将正x 轴上的点转向正y 轴。
Java 将图片转为PDF
Java 将图片转为PDF下面以Java代码介绍如何将图片转换PDF格式的文件,并保存到本地路径。
【方法解释】加载图片时,通过PdfImage类提供的方法fromFile(String imagepath)方法;转为PDF格式时没有直接的方法来实现转换,这里是将图片通过drawImage(PdfImage image, double x, double y, double width, double height)方法绘制到PDF页面的方式来实现,最后保存PDF文件。
【程序运行环境】●Windows 10●IntelliJ IDEA(jdk 1.8.0)●Free Spire.PDF for Java(Jar包)●测试文件:.jpg格式的图片【具体步骤】1.导入jar包按照如下图步骤,将jar文件导入Java程序:完成导入后,如下效果:2. Java 代码import com.spire.pdf.*;import com.spire.pdf.graphics.PdfImage;public class ImgToPDF {public static void main(String[] args) {//新建Pdf 文档PdfDocument pdf = new PdfDocument();//添加一页PdfPageBase page = pdf.getPages().add();//加载图片PdfImage image = PdfImage.fromFile("logo.jpg");double widthFitRate = image.getPhysicalDimension().getWidth() / page.getCanvas().getClientSize().getWidth();double heightFitRate = image.getPhysicalDimension().getHeight() / page.getCanvas().getClientSize().getHeight();double fitRate = Math.max(widthFitRate, heightFitRate);//图片大小double fitWidth = image.getPhysicalDimension().getWidth() / fitRate;double fitHeight = image.getPhysicalDimension().getHeight() / fitRate;//绘制图片到PDFpage.getCanvas().drawImage(image, 0, 30, fitWidth, fitHeight);//保存文档pdf.saveToFile("ImgToPDF.pdf");pdf.dispose();}}注:代码中的文件路径为IDEA程序项目文件夹路径,如:F:\IDEAProject\Conversion_PDF\logo.jpg ,文件路径也可以自定义。
java图片处理(文字水印、图片水印、缩放、补白)
java图片处理(文字水印、图片水印、缩放、补白)1package com.hmw.picMark;23import java.awt.AlphaComposite;4import java.awt.Color;5import java.awt.Font;6import java.awt.Graphics2D;7import java.awt.Image;8import java.awt.geom.AffineTransform;9import java.awt.image.AffineTransformOp;10import java.awt.image.BufferedImage;11import java.io.File;12import java.io.IOException;1314import javax.imageio.ImageIO;1516/**17 * 图片工具类,图片水印,文字水印,缩放,补白等18 * @author Carl He19*/20public final class ImageUtils {21/**图片格式:JPG*/22private static final String PICTRUE_FORMATE_JPG = "jpg";2324private ImageUtils(){}25/**26 * 添加图片水印27* @param targetImg 目标图片路径,如:C://myPictrue//1.jpg28* @param waterImg 水印图片路径,如:C://myPictrue//logo.png29 * @param x 水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间30 * @param y 水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间31 * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)32*/33public final static void pressImage(String targetImg, String waterImg, int x, int y, float alpha) {34try {35 File file = new File(targetImg);36 Image image = ImageIO.read(file);37int width = image.getWidth(null);38int height = image.getHeight(null);39BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);40 Graphics2D g = bufferedImage.createGraphics();41 g.drawImage(image, 0, 0, width, height, null);4243Image waterImage = ImageIO.read(new File(waterImg)); // 水印文件44int width_1 = waterImage.getWidth(null);45int height_1 = waterImage.getHeight(null);46g.setComposite(AlphaComposite.getInstance(AlphaComposite.S RC_ATOP, alpha));4748int widthDiff = width - width_1;49int heightDiff = height - height_1;50if(x < 0){51 x = widthDiff / 2;52 }else if(x > widthDiff){53 x = widthDiff;54 }55if(y < 0){56 y = heightDiff / 2;57 }else if(y > heightDiff){58 y = heightDiff;59 }60 g.drawImage(waterImage, x, y, width_1, height_1, null); // 水印文件结束61 g.dispose();62ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);63 } catch (IOException e) {64 e.printStackTrace();65 }66 }6768/**69 * 添加文字水印70* @param targetImg 目标图片路径,如:C://myPictrue//1.jpg71 * @param pressText 水印文字,如:中国证券网72 * @param fontName 字体名称,如:宋体73* @param fontStyle 字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)74 * @param fontSize 字体大小,单位为像素75 * @param color 字体颜色76 * @param x 水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间77 * @param y 水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间78 * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)79*/80public static void pressText(String targetImg, String pressText, String fontName, int fontStyle, int fontSize, Color color, int x, int y, float alpha) {81try {82 File file = new File(targetImg);8384 Image image = ImageIO.read(file);85int width = image.getWidth(null);86int height = image.getHeight(null);87BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);88 Graphics2D g = bufferedImage.createGraphics();89 g.drawImage(image, 0, 0, width, height, null);90 g.setFont(new Font(fontName, fontStyle, fontSize));91 g.setColor(color);92g.setComposite(AlphaComposite.getInstance(AlphaComposite.S RC_ATOP, alpha));9394int width_1 = fontSize * getLength(pressText);95int height_1 = fontSize;96int widthDiff = width - width_1;97int heightDiff = height - height_1;98if(x < 0){99 x = widthDiff / 2;100 }else if(x > widthDiff){101 x = widthDiff;102 }103if(y < 0){104 y = heightDiff / 2;105 }else if(y > heightDiff){106 y = heightDiff;107 }108109 g.drawString(pressText, x, y + height_1);110 g.dispose();111ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);112 } catch (Exception e) {113 e.printStackTrace();114 }115 }116117/**118 * 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符119 * @param text120* @return字符长度,如:text="中国",返回2;text="test",返回 2;text="中国ABC",返回 4.121*/122public static int getLength(String text) {123int textLength = text.length();124int length = textLength;125for (int i = 0; i < textLength; i++) {126if (String.valueOf(text.charAt(i)).getBytes().length > 1) {127 length++;128 }129 }130return (length % 2 == 0) ? length / 2 : length / 2 + 1;131 }132133/**134 * 图片缩放135 * @param filePath 图片路径136 * @param height 高度137 * @param width 宽度138 * @param bb 比例不对时是否需要补白139*/140public static void resize(String filePath, int height, int width, boolean bb) {141try {142double ratio = 0; //缩放比例143 File f = new File(filePath);144 BufferedImage bi = ImageIO.read(f);145 Image itemp = bi.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH);146//计算比例147if ((bi.getHeight() > height) || (bi.getWidth() > width)) {148if (bi.getHeight() > bi.getWidth()) {149 ratio = (new Integer(height)).doubleValue() / bi.getHeight();150 } else {151 ratio = (new Integer(width)).doubleValue() / bi.getWidth();152 }153AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);154 itemp = op.filter(bi, null);155 }156if (bb) {157BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);158 Graphics2D g = image.createGraphics();159 g.setColor(Color.white);160 g.fillRect(0, 0, width, height);161if (width == itemp.getWidth(null))162g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);163else164g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);165 g.dispose();166 itemp = image;167 }168 ImageIO.write((BufferedImage) itemp, "jpg", f);169 } catch (IOException e) {170 e.printStackTrace();171 }172 }173174public static void main(String[] args) throws IOException {175 pressImage("C://pic//jpg", "C://pic//test.gif", 5000, 5000, 0f);176pressText("C://pic//jpg", "旺仔之印", "宋体", Font.BOLD|Font.ITALIC, 20, Color.BLACK, 0, 0, 8f);177 resize("C://pic//4.jpg", 1000, 500, true);178 }179 }。
Java实现图片压缩代码,图片大小转换
Java实现图⽚压缩代码,图⽚⼤⼩转换在很多项⽬中我们会把上传的图⽚做处理,⽐较图⽚上传过多对服务器的容量和带宽有很多的浪费,如果不是必须的⾼清图⽚,我们可以通过代码来做压缩。
在我的项⽬中我们压缩图⽚的⽬的是让web页⾯打开的速度很快,并且节省空间。
下⾯先分享⼀下代码:package org.util;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.awt.image.CropImageFilter;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class ImgTools {/*** 按照宽⾼⽐例压缩** @param img* @param width* @param height* @param out* @throws IOException*/public static void thumbnail_w_h(File img, int width, int height,OutputStream out) throws IOException {BufferedImage bi = ImageIO.read(img);double srcWidth = bi.getWidth(); // 源图宽度double srcHeight = bi.getHeight(); // 源图⾼度double scale = 1;if (width > 0) {scale = width / srcWidth;}if (height > 0) {scale = height / srcHeight;}if (width > 0 && height > 0) {scale = height / srcHeight < width / srcWidth ? height / srcHeight: width / srcWidth;}thumbnail(img, (int) (srcWidth * scale), (int) (srcHeight * scale), out);}/*** 按照固定宽⾼原图压缩** @param img* @param width* @param height* @param out* @throws IOException*/public static void thumbnail(File img, int width, int height,OutputStream out) throws IOException {BufferedImage BI = ImageIO.read(img);Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.setColor(Color.RED);g.drawImage(image, 0, 0, null); // 绘制处理后的图g.dispose();ImageIO.write(tag, "JPEG", out);}/*** 按照宽⾼裁剪** @param srcImageFile* @param destWidth* @param destHeight* @param out*/public static void cut_w_h(File srcImageFile, int destWidth,int destHeight, OutputStream out) {cut_w_h(srcImageFile, 0, 0, destWidth, destHeight, out);}public static void cut_w_h(File srcImageFile, int x, int y, int destWidth,int destHeight, OutputStream out) {try {Image img;ImageFilter cropFilter;// 读取源图像BufferedImage bi = ImageIO.read(srcImageFile);int srcWidth = bi.getWidth(); // 源图宽度int srcHeight = bi.getHeight(); // 源图⾼度if (srcWidth >= destWidth && srcHeight >= destHeight) {Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);cropFilter = new CropImageFilter(x, y, 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();// 输出为⽂件ImageIO.write(tag, "JPEG", out);}} catch (Exception e) {e.printStackTrace();}}// #cut_w_hpublic static void main(String[] args) throws IOException {File img = new File("e:\\a\\a.jpg");FileOutputStream fos = new FileOutputStream("e:\\a\\b.jpg");// ImgTools.thumbnail(img, 100, 100, fos);// ImgTools.cut_w_h(img, 230, 200, fos);ImgTools.thumbnail_w_h(img, 100, 0, fos);}}其实我们很多⼈喜欢在上传的时候就做了限制了,这样在上传时就节省了带宽,可是很多客户是不会做图⽚处理的,5M的⼤图直接就给你上传,限制了说我们做的不⼈性化。
Java 图片处理 格式转换
Java 图片处理(包括 Jmagick 的应用) 图片处理( 的应用)作者: 佚名, 出处:IT 专家网,2010-10-29 08:30责任编辑: 谢妍妍,近期有使用到图片的压缩处理,由于在之前用 Java 处理时,在低像素的情况下, Java 处理的效果确实很差,然后尝试了用网上推荐的免费开源的第三方软件,利用 Java 的 jni 调用 dll 文件进行处理,效果还可以。
在此记录下,方便以后继续积累。
近期有使用到图片的压缩处理, 由于在之前用 Java 处理时, 在低像素的情况下, Java 处理的效果确实很差,然后尝试了用网上推荐的免费开源的第三方软件,利用 Java 的 jni 调用 dll 文件进行处理,效果还可以。
在此记录下,方便以后继续积累。
1、纯 Java 类处理图片代码Java 代码以下是代码片段: 以下是代码片段: /** * 转换图片大小,不变形 * * @param img * 图片文件 * @param width * 图片宽 * @param height * 图片高 */ public static void changeImge(File img, int width, int height) { try { Image image = ImageIO.read(img); //图片尺寸的大小处理, 如果长宽都小于规定大小, 则返回, 如果有一个大于规定大小, 则等比例缩放 int srcH = image.getHeight(null); int srcW = image.getWidth(null); if (srcH <= height && srcW <= width) { return;} int tmpH = width; int tmpW = height; //在长度和宽度都做了限制,不能超过设定值 while (srcH > height || srcW > width) { if(srcW > width) { tmpH = srcH * width / srcW; srcH = tmpH; srcW=width; } if(srcH > height) { tmpW = srcW * height / srcH; srcW = tmpW; srcH=height; } } BufferedImage bufferedImage = new BufferedImage(srcW, srcH, BufferedImage.TYPE_3BYTE_BGR); bufferedImage.getGraphics().drawImage( image.getScaledInstance(srcW, srcH, Image.SCALE_SMOOTH), 0, 0, srcW, srcH, null); FileOutputStream fos = new FileOutputStream(img); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos); encoder.encode(bufferedImage); fos.close(); // System.out.println("转换成功..."); } catch (IOException e) { e.printStackTrace(); throw new IllegalStateException("图片转换出错!", e); } }2、使用 Jmagick 辅助Html 代码(1)使用的 windows 下的 jmagick-win-6.3.9-q16.zip 地址是: /6.3.9/(2)doc 对应的 api 地址:/jmagick-doc/(3)安装 imagemagick,官方网站:/我使用的是:imagemagick-6.4.6-4-q16-windows-dll.exe :点击下载(4) 安装 imagemagick-6.4.6-4-q16-windows-dll.exe,将 安装目录下(按自己所 安装的目录找) 下的所有 dll 文件 copy 到系统盘下的 “c:\windows\system32\”文件 夹里(5) 配置环境变量再环境变量 path 里添加新的值 “c:\program files\imagemagick-6.4.6-4-q16“使 用 ide 可以不用配置(6)解压 jmagick-win-6.3.9-q16.zip将 jmagick.dll 复制到系统盘下的 “c:\windows\system32\”文件夹里 和 复制到 jdk 的 bin(例“d:\jdk6\bin”)文件里各一份将 jmagick.jar 复制到 tomcat 下的 lib 文件夹里 和 所使用项目的 web-inf 下 lib 文件里 各一份(7)web 应用如果部署到 tomcat 下,那么最好在 catalina.bat 文件中改变如下设置set java_opts=%java_opts% -xms256m -xmx768m -xx:maxpermsize=128m – djava.util.logging.manager=org.apache.juli.classloaderlogmanager – djava.util.logging.config.file=”${catalina.base}\conf\logging.properties”避免 heap 溢出的问题,参数看你自己的机器而定。
java将一个图片转换为字符串格式
java将⼀个图⽚转换为字符串格式package ylxControlServer.frame.util;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.File;import javax.imageio.ImageIO;import mons.logging.Log;import mons.logging.LogFactory;public class ImageToString {private static Log log = LogFactory.getLog(ImageToString.class);// 根据图⽚地址将图⽚转换为字符串类型的数据public String imageToString(String picture) {StringBuffer sb2 = new StringBuffer();BufferedImage image1 = getImage(picture);byte[] img = getBytes(image1);for (int i = 0; i < img.length; i++) {if (sb2.length() == 0) {sb2.append(img[i]);} else {sb2.append("," + img[i]);}}return sb2.toString();}// 将BufferImage 转换为字节数组private byte[] getBytes(BufferedImage image) {ByteArrayOutputStream baos = new ByteArrayOutputStream();try {ImageIO.write(image, "PNG", baos);} catch (Exception e) {(e);}return baos.toByteArray();}// 根据图⽚地址得到BufferedImagepublic static BufferedImage getImage(String picture) {try {BufferedImage bImage = ImageIO.read(new File(picture));return bImage;} catch (Exception ex) {(ex);return null;}}}(上⾯的类将⼀个图⽚转换为字符串)字符串的格式是:String a= "1,2,4,4,5,5,5,565";得到图⽚的字符串后,我们还得将字符串转换为图⽚:package ylxControlServer.frame.util;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.File;import java.io.IOException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import javax.imageio.ImageIO;public class StringToImage {public static String fileformat = "png";public static String fileNameFormat = "yyyy-MM-dd_HH-mm-ss";// 将字符串格式的图⽚转换为图⽚并保存public void stringToImage(String string, String saveDir) {if (string.contains(",")) {// 这⾥没有⾃带的那个分割⽅法,原因是分割速度没有这个快,有⼈考证在分割字符长度很⼤的情况下,系统的分割⽅法容易造成内存溢出。
java读取tiff格式图像、像素修改以及格式转换
java读取tiff格式图像、像素修改以及格式转换javatiff_0">java读取tiff图像的踩坑总结:1.环境:spring boot+maven2.包:imageio ,jai,codec,metadata;还有⼀个从github上⾯下载的。
这⼏个包都不⼤好找,等后续补上下载路径。
import javax.imageio.__;import javax.media.jai.JAI;import com.sun.media.jai.codec.;import com.github.jaiimageio.impl.plugins.tiff.*;主要就是这⼏个了,下⾯是接触到的有关代码。
注意:从外部下载的包加载到本地maven仓库需要使⽤cmd打开输⼊mvn install:install-file -DgroupId=com.sun.media -DartifactId=jai_codec -Dversion=1.1.3 -Dpackaging=jar -Dfile=E:\BaiduNetdiskDownload\jai_codec-1.1.3.jar metadatatiff_15">⾸先:metadata,是tiff图像的元数据,下⾯有两个⽅式。
1.调⽤tiffMetadataReader包,此⽅法⽐较简单,引⼊的包:import com.drew.imaging.tiff.TiffMetadataReader;import com.drew.imaging.tiff.TiffProcessingException;import com.drew.metadata.Directory;import com.drew.metadata.Metadata;import com.drew.metadata.Tag;import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.Iterator;//详细过程:File file = new File("C:/Users/86156/Desktop/Show.tif");BufferedImage bufferedImage = ImageIO.read(file);String[] image = ImageIO.getWriterFileSuffixes();System.out.println(image);System.out.println(bufferedImage);try{Metadata metadata = TiffMetadataReader.readMetadata(file);//输出元数据信息System.out.println(metadata);}catch (tiffProcessingException e){System.out.println("发⽣进程异常");System.out.println(e);}catch (IOException e) {System.out.println("发⽣读取异常");}try{Metadata metadata = TiffMetadataReader.readMetadata(file);Iterable<Directory> a = metadata.getDirectories();for(Directory directory : a) {Iterator<Tag> tag = directory.getTags().iterator();while (tag.hasNext()) {System.out.println(tag.next());}}}catch(TiffProcessingException e){System.out.println("发⽣异常!");System.out.println(e);}System.out.println("执⾏完毕");如果出现读取时是空值:执⾏部分结果如下:包含了tiff图像的长宽和位数即16,这也为后⾯的⼤坑做了铺垫。
Java图像处理图片处理和特效实现
Java图像处理图片处理和特效实现Java图像处理图片处理和特效实现Java是一种广泛应用于软件开发的编程语言,它具有强大的图像处理能力。
在现代社会中,图片处理和特效实现已经成为了许多应用领域的必备技术。
本文将介绍Java中实现图片处理和特效的方法和工具。
一、图像处理基础1. 像素操作在Java中,图像是由像素组成的。
每个像素包含了颜色信息。
通过读取和修改像素的颜色值,我们可以实现图像的处理。
在Java中,可以利用BufferedImage类来读取和操作像素。
2. 图像滤镜图像滤镜是一种常见的图像处理技术,它可以改变图像的外观和质感。
Java提供了一系列内置的图像滤镜,例如灰度化、模糊、锐化等。
这些滤镜可以通过使用Java提供的滤镜类和方法来实现。
二、图片处理1. 图片读取和保存在Java中,可以使用ImageIO类中的方法来读取和保存图片。
通过ImageIO类,我们可以将图片文件加载到内存中,并在处理完成后保存为新的图片文件。
2. 图片缩放和裁剪图片缩放和裁剪是常见的图片处理操作。
Java提供了AffineTransform类和BufferedImage类来实现图片的缩放和裁剪。
通过设置缩放和裁剪的参数,我们可以调整图片的大小和比例。
3. 图片旋转和翻转Java提供了AffineTransform类来实现图片的旋转和翻转。
通过设置旋转和翻转的角度和方向,我们可以实现各种不同的效果。
三、图片特效实现1. 图片滤镜效果使用Java的滤镜类和方法,我们可以实现各种图片特效,例如黑白、模糊、浮雕等。
通过组合不同的滤镜效果,我们可以创造出丰富多样的图片特效。
2. 图片融合和叠加通过使用Java提供的AlphaComposite类,我们可以将多张图片融合在一起,创造出新的特效效果。
3. 图片渐变效果Java提供了GradientPaint类和TexturePaint类,可以实现各种渐变和纹理效果。
通过调整参数,我们可以创建出丰富多样的渐变和纹理效果。
Java实现将png格式图片转换成jpg格式图片的方法【测试可用】
Java实现将png格式图⽚转换成jpg格式图⽚的⽅法【测试可⽤】本⽂实例讲述了Java实现将png格式图⽚转换成jpg格式图⽚的⽅法。
分享给⼤家供⼤家参考,具体如下:import java.awt.Color;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;public class ConvertImageFile {public static void main(String[] args) {BufferedImage bufferedImage;try {// read image filebufferedImage = ImageIO.read(new File("c:\\java.png"));// create a blank, RGB, same width and height, and a white// backgroundBufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(),BufferedImage.TYPE_INT_RGB);// TYPE_INT_RGB:创建⼀个RBG图像,24位深度,成功将32位图转化成24位newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0,Color.WHITE, null);// write to jpeg fileImageIO.write(newBufferedImage, "jpg", new File("c:\\java.jpg"));System.out.println("Done");} catch (IOException e) {e.printStackTrace();}}}PS:这⾥再为⼤家推荐⼏款图⽚处理相关在线⼯具供⼤家参考:更多java相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》及《》。
【tiff格式图片转换】Java处理工具
【tiff格式图⽚转换】Java处理⼯具0、补充知识点"TIFF(Tag Image File Format)图像⽂件是图形图像处理中常⽤的格式之⼀,其图像格式很复杂,但由于它对图像信息的存放灵活多变,可以⽀持很多⾊彩系统,⽽且独⽴于操作系统,因此得到了⼴泛应⽤。
在各种地理信息系统、摄影测量与遥感等应⽤中,要求图像具有地理编码信息,例如图像所在的坐标系、⽐例尺、图像上点的坐标、经纬度、长度单位及⾓度单位等等。
它最初由 Aldus公司与微软公司⼀起为PostScript打印开发。
TIFF最初的设计⽬的是为了1980年代中期桌⾯扫描仪⼚商达成⼀个公⽤的统⼀的扫描图像⽂件格式,⽽不是每个⼚商使⽤⾃⼰专有的格式。
在刚开始的时候, TIFF只是⼀个⼆值图像格式,因为当时的桌⾯扫描仪只能处理这种格式,随着扫描仪的功能越来越强⼤,并且计算机的磁盘空间越来越⼤,TIFF逐渐⽀持灰阶图像和彩⾊图像。
"------引⾃百度百科1、问题描述在项⽬过程中需要将word⽂档中内容结构化转换导⼊业务表,其中有⼤量的图⽚内容需要上传和处理展⽰,但在页⾯富⽂本框tiff格式展⽰不出来,⽽且这种⽮量图⽂件⼤⼩相对⽐较⼤,需要转换为png格式。
2、解决⽅案2.1、jar依赖<dependency><groupId>javax.media.jai</groupId><artifactId>com.springsource.javax.media.jai.core</artifactId><version>1.1.3</version></dependency>2.2、代码处理import java.awt.image.RenderedImage;import java.awt.image.renderable.ParameterBlock;import java.io.File;import java.io.IOException;import javax.media.jai.JAI;public class Test {public static void tifToPng(String otPath) throws IOException {File tiff = new File(otPath);if (null != tiff && tiff.exists()) {String fileNameIgnore = tiff.getName().replaceAll("[.][^.]+$", "");TIFFDecodeParam param0 = null;TIFFEncodeParam param = new TIFFEncodeParam();JPEGEncodeParam param1 = new JPEGEncodeParam();ImageDecoder dec = ImageCodec.createImageDecoder("tiff", tif, param0);int count = dec.getNumPages();System.out.println("count:{}"+ count);param.setCompression(PRESSION_GROUP4);param.setLittleEndian(false);for (int i = 0; i < count; i++) {RenderedImage page = dec.decodeAsRenderedImage(i);//设置转换后的png图⽚存储路径StringBuffer pngPath = new StringBuffer(tiff.getParent()).append(File.separator).append(fileNameIgnore);if (count > 1) {pngPath.append("(").append(++i).append(")");}pngPath.append(".png"); //png格式File pngFile = new File(pngPath.toString());ParameterBlock pb = new ParameterBlock();pb.addSource(page);pb.add(pngFile.toString());pb.add("JPEG");pb.add(param1);JAI.create("filestore", pb);}}}public static void main(String[] args) throws IOException {tifToPng("/Users/xiayangyang/Downloads/tiff/f43a8585-3cf2-4cbb-9150-fb93c10e4f21image1.tiff");}}。
使用Imagemagick convert进行图片处理(转)
画线为 -draw line 50,50 100,100
使用Imagemagick convert进行图片处理(转)
得到一个图片的尺寸,
identify test.png
结果为:
test.png PNG 178x15 178x15+0+0 16-bit PseudoClass 65536c 2.28kb
使用shell
identify test.png | cut -d ' ' -f 3 | cut -d 'x' -f 1
1、压缩一个图片,限定高度为60, 宽高比例不变,但如果宽大于90,截取中间一段
convert source.jpg -resize x60 result_60.jpg
获取result_60.jpg的宽和高
if( 宽 > 90 ){
convert result_60.jpg -gravity center -extent 90x60 result_60.jpg
横向+纵向
convert /( 1.jpg 2.jpg 3.jpg +append /) /
/( 4.jpg 5.jpg 6.jpg +append /) /
/( 7.jpg 8.jpg 9.jpg +append /) /
-append result.jpg
5、256色png压缩
例如:压缩为60x60, 这是一个特例,宽高正好相同,如果不同,计算会有所不同,但方法一样。
获取source.jpg的宽和高
if( 宽 > 高 ){
java转换tiff图片格式成gif和jpg
java转换tiff图⽚格式成gif和jpg从⽹上找了好久都没⽤找到⽤java转换tiff格式的图⽚,突然看到tiff转换成psd格式的,想能转成psd肯定能转成jpg和gif,先看了⼀下,原先需要其他的jar包,我是从:⽹上下载的,其中有:jai_codec-1.1.3.jarjai_core.jarjai_imageio-1.1.jariText-5.0.2.jar下载完后添加到⾃⼰的Java项⽬中代码需要引⽤1import java.awt.Color;2import java.awt.Graphics;34import java.awt.Image;5import java.awt.image.BufferedImage;6import java.io.File;7import java.io.FileNotFoundException;8import java.io.IOException;9101112import javax.imageio.ImageIO;13import javax.imageio.ImageReader;14import javax.imageio.stream.FileImageInputStream;15import javax.imageio.stream.ImageInputStream;16import javax.imageio.spi.IIORegistry;17import javax.imageio.spi.ImageReaderSpi;然后就是⽅法了放到Main中1 String tifPath="C:/1.tiff";2int pages=0;3 BufferedImage[] bi=null;4 File tiffFile = new File(tifPath);5 ImageReader tiffReader = null;6 ImageInputStream input = null;7try {8 input = new FileImageInputStream(tiffFile);9 } catch (FileNotFoundException e) {10// TODO Auto-generated catch block11 e.printStackTrace();12 } catch (IOException e) {13// TODO Auto-generated catch block14 e.printStackTrace();15 }16 IIORegistry iioreg = IIORegistry.getDefaultInstance();17 iioreg.registerApplicationClasspathSpis();18 ImageReaderSpi irs = new com.sun.media.imageioimpl.plugins.tiff.TIFFImageReaderSpi();19try {20 tiffReader = irs.createReaderInstance();21 } catch (IOException e) {22// TODO Auto-generated catch block23 e.printStackTrace();24 }25 tiffReader.setInput(input);2627try {28 pages = tiffReader.getNumImages(true);29 } catch (IOException e) {30// TODO Auto-generated catch block31 e.printStackTrace();32 }3334if(pages>0){35 bi=new BufferedImage[pages];36for (int i = 0; i < pages; i++) {37 System.out.println(i);38try {39 bi[i]=tiffReader.read(i);40 } catch (IOException e) {41// TODO Auto-generated catch block42 e.printStackTrace();43 }44 Image image = bi[i].getScaledInstance(bi[i].getWidth(), bi[i].getHeight(), Image.SCALE_DEFAULT);45 BufferedImage tag = new BufferedImage(bi[i].getWidth(), bi[i].getHeight(), BufferedImage.TYPE_INT_BGR);46 Graphics g = tag.getGraphics();47 g.drawImage(image, 0, 0, null);48 g.dispose();49try {50 ImageIO.write(tag, "GIF", new File("C:/"+i+"11.gif"));51 ImageIO.write(tag, "JPG", new File("C:/"+i+"11.JPG"));52 } catch (IOException e) {53// TODO Auto-generated catch block54 e.printStackTrace();55 }56 }57 }这⾥要说明的是读出的图⽚流不能直接⽤ImageIO.write⽅法进⾏输出图⽚,会报错,最后⾃⼰想既然不能直接⽣成就⽤来图⽚的放⼤缩⼩,成功了!!也不知道上⾯⽤的对不对,希望有⼈指出错误。
java将图片转换成二进制
java将图⽚转换成⼆进制package com.oumyye.图⽚;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class TestImageBinary {static BASE64Encoder encoder = new sun.misc.BASE64Encoder();static BASE64Decoder decoder = new sun.misc.BASE64Decoder();public static void main(String[] args) {System.out.println(getImageBinary());base64StringToImage(getImageBinary());}/*** 将图⽚转换成⼆进制* @return*/static String getImageBinary(){File f = new File("e:/1.jpg");BufferedImage bi;try {bi = ImageIO.read(f);ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(bi, "jpg", baos);byte[] bytes = baos.toByteArray();return encoder.encodeBuffer(bytes).trim();} catch (IOException e) {e.printStackTrace();}return null;}/*** 将⼆进制转换为图⽚* @param base64String*/static void base64StringToImage(String base64String){try {byte[] bytes1 = decoder.decodeBuffer(base64String);ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);BufferedImage bi1 =ImageIO.read(bais);File w2 = new File("e://QQ.jpg");//可以是jpg,png,gif格式ImageIO.write(bi1, "jpg", w2);//不管输出什么格式图⽚,此处不需改动} catch (IOException e) {e.printStackTrace();}}}需要导⼊sun.misc.BASE64Decoder.jar包导⼊以后在代码中有错误提⽰可以忽略。
Java图片转换Webp格式
Java图⽚转换Webp格式⼀、关于WebpWebP(发⾳:weppy)是⼀种同时提供了与(可逆压缩)的图⽚⽂件格式,派⽣⾃影像编码格式,被认为是WebM多媒体格式的姊妹项⽬,是由在购买后发展出来,以BSD授权条款发布。
WebP最初在2010年发布,⽬标是减少⽂件⼤⼩,但达到和格式相同的图⽚质量,希望能够减少图⽚档在⽹络上的发送时间。
2011年11⽉8⽇,Google开始让WebP⽀持⽆损压缩和透明⾊(alpha通道)的功能,⽽在2012年8⽉16⽇的参考实做libwebp 0.2.0中正式⽀持。
根据Google较早的测试,WebP的⽆损压缩⽐⽹络上找到的PNG档少了45%的⽂件⼤⼩,即使这些PNG档在使⽤pngcrush和PNGOUT处理过,WebP还是可以减少28%的⽂件⼤⼩。
WebP⽀持的像素最⼤数量是16383x16383。
有损压缩的WebP仅⽀持8-bit的YUV 4:2:0格式。
⽽⽆损压缩(可逆压缩)的WebP⽀持VP8L编码与8-bit之ARGB⾊彩空间。
⼜⽆论是有损或⽆损压缩皆⽀持Alpha透明通道、ICC⾊彩配置、XMP诠释数据。
WebP有静态与动态两种模式。
动态WebP(Animated WebP)⽀持有损与⽆损压缩、ICC⾊彩配置、XMP诠释数据、Alpha透明通道。
⼆、开始转换转换器bin⽬录中包括以下⼯具- cwebp:将图⽚转换为webp格式- dwebp:解码webp- gif2webp:gif动图转换为webp格式⼀般这要这样就可以转换好了cwebp [options] input_file -o output_file.webp.如果是gif就将⼯具换为gif2webp 其他都不⽤改.常⽤option为-q 设置压缩质量如75质量等.编写⼀个⼯具类package example;import java.io.*;import .HttpURLConnection;import .URL;import java.util.logging.Level;import java.util.logging.Logger;public class ImageFormatConverter {private static Logger log = Logger.getLogger(String.valueOf(ImageFormatConverter.class));public static boolean convertFromUrlToWebp(String fileUrl,String outPutFile,Integer quality) {//⾸先从url获得源⽂件File file = saveUrlAs(fileUrl,outPutFile,"");String filePath = file.getPath()+File.separator+"xxx.png";return convertToWebp(filePath);}public static boolean convertToWebp(String inputFile, String outputFile) {return convertToWebp(inputFile, outputFile, 75);}public static boolean convertToWebp(String inputFile, String outputFile, Integer quality) {if (!new File(inputFile).exists()) {return false;}/*if (!new File(outputFile).exists()) {new File(outputFile).mkdirs();}*/return executeCWebp(inputFile, outputFile, quality);}/*** execute cwebp command:cwebp [options] input_file -o output_file.webp*//**** @param inputFile* 原图⽚路径* @param outputFile* webp路径* @param quality* 图⽚质量1-100* @return*/private static boolean executeCWebp(String inputFile, String outputFile, Integer quality) {boolean result = false;Class cl = ImageFormatConverter.class;// 换成相应的路径String cwebpPath = cl.getResource("/META-INF/libwebp-0.4.1-rc1-windows-x64/bin/cwebp.exe").getPath();System.out.println("cwebpPath=" + cwebpPath);try {StringBuilder command = new StringBuilder(cwebpPath);command.append(" -q " + (quality == 0 ? 75 : quality));command.append(" " + inputFile);command.append(" -o " + outputFile);Runtime.getRuntime().exec(command.toString());result = true;} catch (Exception e) {e.printStackTrace();System.out.println(e.getMessage());}return result;}public static boolean convertToWebp(String inputFile) {String outputFile = inputFile.split("\\.")[0] + ".webp";return convertToWebp(inputFile, outputFile, 75);}public static void main(String[] args) {String inputFile = "https:///t_s1920x1200c5/g2/M00/0B/0C/ChMlWV5g8MuIEW7tAAW1SrkHhDsAANkcALNw6MABbVi878.jpg" String outputFile = "J:/⽂件暂存/jpg";if (convertFromUrlToWebp(inputFile, outputFile, 75)) {System.out.println("convert ok~");} else {System.out.println("sth wrong happened");}}public static File saveUrlAs(String url,String filePath,String method){//System.out.println("fileName---->"+filePath);//创建不同的⽂件夹⽬录File file=new File(filePath);//判断⽂件夹是否存在if (!file.exists()){//如果⽂件夹不存在,则创建新的的⽂件夹file.mkdirs();}FileOutputStream fileOut = null;HttpURLConnection conn = null;InputStream inputStream = null;try{// 建⽴链接URL httpUrl=new URL(url);conn=(HttpURLConnection) httpUrl.openConnection();//以Post⽅式提交表单,默认get⽅式if (method!=null&&!"".equals(method)){switch (method.toUpperCase()){case "GET":conn.setRequestMethod("GET");break;case "POST":conn.setRequestMethod("POST");break;}}conn.setDoInput(true);conn.setDoOutput(true);// post⽅式不能使⽤缓存conn.setUseCaches(false);//连接指定的资源conn.connect();//获取⽹络输⼊流inputStream=conn.getInputStream();BufferedInputStream bis = new BufferedInputStream(inputStream);//判断⽂件的保存路径后⾯是否以/结尾if (!filePath.endsWith("/")) {filePath += "/";将转换质量设置为75,⽣成转换后的的webp格式图⽚。
Java处理图片实现base64编码转换
Java处理图⽚实现base64编码转换前⾔环境:使⽤这个代码前:请确保你的JDk是JAVA8及其以上注意事项⼀般插件返回的base64编码的字符串都是有⼀个前缀的。
"data:image/jpeg;base64," 解码之前这个得去掉。
CodeMainTest/*** ⽰例* @throws UnsupportedEncodingException* @throws FileNotFoundException*/@SuppressWarnings("resource")public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {String strImg = getImageStr("Z:\\⽔印\\2.bmp");System.out.println(strImg);File file = new File("z://1.txt");FileOutputStream fos = new FileOutputStream(file);OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");try {osw.write(strImg);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//generateImage(strImg, "Z:\\⽔印\\444.bmp");}加密:*** @Description: 根据图⽚地址转换为base64编码字符串* @Author:* @CreateTime:* @return*/public static String getImageStr(String imgFile) {InputStream inputStream = null;byte[] data = null;try {inputStream = new FileInputStream(imgFile);data = new byte[inputStream.available()];inputStream.read(data);inputStream.close();} catch (IOException e) {e.printStackTrace();}// 加密Encoder encoder = Base64.getEncoder();return encoder.encodeToString(data);}解密:/*** @Description: 将base64编码字符串转换为图⽚* @Author:* @CreateTime:* @param imgStr base64编码字符串* @param path 图⽚路径-具体到⽂件* @return*/public static boolean generateImage(String imgStr, String path) {if (imgStr == null)return false;// 解密try {Decoder decoder = Base64.getDecoder();byte[] b = decoder.decode(imgStr);// 处理数据for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}OutputStream out = new FileOutputStream(path);out.write(b);out.flush();out.close();return true;} catch (IOException e) {return false;}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java 图片处理(包括 Jmagick 的应用) 图片处理( 的应用)作者: 佚名, 出处:IT 专家网,2010-10-29 08:30责任编辑: 谢妍妍,近期有使用到图片的压缩处理,由于在之前用 Java 处理时,在低像素的情况下, Java 处理的效果确实很差,然后尝试了用网上推荐的免费开源的第三方软件,利用 Java 的 jni 调用 dll 文件进行处理,效果还可以。
在此记录下,方便以后继续积累。
近期有使用到图片的压缩处理, 由于在之前用 Java 处理时, 在低像素的情况下, Java 处理的效果确实很差,然后尝试了用网上推荐的免费开源的第三方软件,利用 Java 的 jni 调用 dll 文件进行处理,效果还可以。
在此记录下,方便以后继续积累。
1、纯 Java 类处理图片代码Java 代码以下是代码片段: 以下是代码片段: /** * 转换图片大小,不变形 * * @param img * 图片文件 * @param width * 图片宽 * @param height * 图片高 */ public static void changeImge(File img, int width, int height) { try { Image image = ImageIO.read(img); //图片尺寸的大小处理, 如果长宽都小于规定大小, 则返回, 如果有一个大于规定大小, 则等比例缩放 int srcH = image.getHeight(null); int srcW = image.getWidth(null); if (srcH <= height && srcW <= width) { return;} int tmpH = width; int tmpW = height; //在长度和宽度都做了限制,不能超过设定值 while (srcH > height || srcW > width) { if(srcW > width) { tmpH = srcH * width / srcW; srcH = tmpH; srcW=width; } if(srcH > height) { tmpW = srcW * height / srcH; srcW = tmpW; srcH=height; } } BufferedImage bufferedImage = new BufferedImage(srcW, srcH, BufferedImage.TYPE_3BYTE_BGR); bufferedImage.getGraphics().drawImage( image.getScaledInstance(srcW, srcH, Image.SCALE_SMOOTH), 0, 0, srcW, srcH, null); FileOutputStream fos = new FileOutputStream(img); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos); encoder.encode(bufferedImage); fos.close(); // System.out.println("转换成功..."); } catch (IOException e) { e.printStackTrace(); throw new IllegalStateException("图片转换出错!", e); } }2、使用 Jmagick 辅助Html 代码(1)使用的 windows 下的 jmagick-win-6.3.9-q16.zip 地址是: /6.3.9/(2)doc 对应的 api 地址:/jmagick-doc/(3)安装 imagemagick,官方网站:/我使用的是:imagemagick-6.4.6-4-q16-windows-dll.exe :点击下载(4) 安装 imagemagick-6.4.6-4-q16-windows-dll.exe,将 安装目录下(按自己所 安装的目录找) 下的所有 dll 文件 copy 到系统盘下的 “c:\windows\system32\”文件 夹里(5) 配置环境变量再环境变量 path 里添加新的值 “c:\program files\imagemagick-6.4.6-4-q16“使 用 ide 可以不用配置(6)解压 jmagick-win-6.3.9-q16.zip将 jmagick.dll 复制到系统盘下的 “c:\windows\system32\”文件夹里 和 复制到 jdk 的 bin(例“d:\jdk6\bin”)文件里各一份将 jmagick.jar 复制到 tomcat 下的 lib 文件夹里 和 所使用项目的 web-inf 下 lib 文件里 各一份(7)web 应用如果部署到 tomcat 下,那么最好在 catalina.bat 文件中改变如下设置set java_opts=%java_opts% -xms256m -xmx768m -xx:maxpermsize=128m – djava.util.logging.manager=org.apache.juli.classloaderlogmanager – djava.util.logging.config.file=”${catalina.base}\conf\logging.properties”避免 heap 溢出的问题,参数看你自己的机器而定。
( -xms256m -xmx768m -xx:maxpermsize=128m )(8)还要注意如果部署到 web 应用,你在使用的 class 里面需要system.setproperty(“jmagick.systemclassloader”,”no”);要不然会报出 unsatisfiedlinkerror: no jmagick in java.library.path.工具类:Java 代码以下是代码片段: 以下是代码片段: import java.awt.Dimension; import java.awt.Rectangle; import java.text.SimpleDateFormat; import java.util.Date; import positeOperator; import pressionType; import magick.DrawInfo; import magick.ImageInfo; import magick.MagickException; import magick.MagickImage; import magick.PixelPacket; import magick.PreviewType; public class ImageUtils { static{ //不能漏掉这个,不然 jmagick.jar 的路径找不到 System.setProperty("jmagick.systemclassloader","no"); } /** * 压缩图片,不变形 * @param filePath 源文件路径 * @param toPath 缩略图路径 * @param width 设定宽 * @param height 设定长 */ public static void changeSize(String filePath, String toPath,int width,int height) throws MagickException{ ImageInfo info = null; MagickImage image = null;Dimension imageDim = null; MagickImage scaled = null; try{ info = new ImageInfo(filePath); image = new MagickImage(info); imageDim = image.getDimension(); //图片尺寸的大小处理, 如果长宽都小于规定大小, 则返回, 如果有一个大于规定大小, 则等比例缩放 int srcH = imageDim.width; int srcW = imageDim.height; if (srcH <= height && srcW <= width) { return; } int tmpH = width; int tmpW = height; //在长度和宽度都做了限制,不能超过设定值 while (srcH > height || srcW > width) { if(srcW > width) { tmpH = srcH * width / srcW; srcH = tmpH; srcW=width; } if(srcH > height) { tmpW = srcW * height / srcH; srcW = tmpW; srcH=height; } } scaled = image.scaleImage(srcW, srcH);//小图片文件的大小. scaled.setFileName(toPath); scaled.writeImage(info); }finally{ if(scaled != null){ scaled.destroyImages(); } } } /** * 水印(图片 logo) * @param filePath 源文件路径 * @param toImg 修改图路径* @param logoPath logo 图路径 * @throws MagickException */ public static void initLogoImg(String filePath, String toImg, String logoPath) throws MagickException { ImageInfo info = new ImageInfo(); MagickImage fImage = null; MagickImage sImage = null; MagickImage fLogo = null; MagickImage sLogo = null; Dimension imageDim = null; Dimension logoDim = null; try { fImage = new MagickImage(new ImageInfo(filePath)); imageDim = fImage.getDimension(); int width = imageDim.width; int height = imageDim.height; if (width > 660) { height = 660 * height / width; width = 660; } sImage = fImage.scaleImage(width, height); fLogo = new MagickImage(new ImageInfo(logoPath)); logoDim = fLogo.getDimension(); int lw = width / 8; int lh = logoDim.height * lw / logoDim.width; sLogo = fLogo.scaleImage(lw, lh); positeImage(CompositeOperator.AtopCompositeOp, sLogo, width-(lw + lh/10), height-(lh + lh/10)); sImage.setFileName(toImg); sImage.writeImage(info); } finally { if(sImage != null){ sImage.destroyImages(); } } }以下是代码片段: 以下是代码片段:/** * 水印(文字) * @param filePath 源文件路径 * @param toImg 修改图路径 * @param text 名字(文字内容自己随意) * @throws MagickException */ public static void initTextToImg(String filePath, String toImg, String text) throws MagickException{ ImageInfo info = new ImageInfo(filePath); if (filePath.toUpperCase().endsWith("JPG") || filePath.toUpperCase().endsWith("JPEG")) { info.setCompression(CompressionType.JPEGCompression); //压缩类别为 JPEG 格式 info.setPreviewType(PreviewType.JPEGPreview); //预览格式为 JPEG 格式 info.setQuality(95); } MagickImage aImage = new MagickImage(info); Dimension imageDim = aImage.getDimension(); int wideth = imageDim.width; int height = imageDim.height; if (wideth > 660) { height = 660 * height / wideth; wideth = 660; } int a = 0; int b = 0; String[] as = text.split(""); for (String string : as) { if(string.matches("[\u4E00-\u9FA5]")){ a++; } if(string.matches("[a-zA-Z0-9]")){ b++; } } int tl = a*12 + b*6 + 300; MagickImage scaled = aImage.scaleImage(wideth, height); if(wideth > tl && height > 5){ DrawInfo aInfo = new DrawInfo(info); aInfo.setFill(PixelPacket.queryColorDatabase("white"));aInfo.setUnderColor(new PixelPacket(0,0,0,100)); aInfo.setPointsize(12); //解决中文乱码问题,自己可以去随意定义个自己喜欢字体,对于移植有点问题,所以 暂且注释 // String fontPath = "C:/WINDOWS/Fonts/MSYH.TTF"; // aInfo.setFont(fontPath); aInfo.setTextAntialias(true); aInfo.setOpacity(0); aInfo.setText(" " + text + "于 权归作者所有!"); aInfo.setGeometry("+" + (wideth-tl) + "+" + (height-5)); scaled.annotateImage(aInfo); } scaled.setFileName(toImg); scaled.writeImage(info); scaled.destroyImages(); } /** * 切图 * @param imgPath 源图路径 * @param toPath 修改图路径 * @param w 宽度 * @param h 高度 * @param x 左上角的 X 坐标 * @param y 左上角的 Y 坐标 * @throws MagickException */ public static void cutImg(String imgPath, String toPath, int w, int h, int x, int y) throws MagickException { ImageInfo infoS = null; MagickImage image = null; MagickImage cropped = null; Rectangle rect = null; try { infoS = new ImageInfo(imgPath); image = new MagickImage(infoS); rect = new Rectangle(x, y, w, h); cropped = image.cropImage(rect); cropped.setFileName(toPath); cropped.writeImage(infoS); " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 上传于 XXXX 网,版} finally { if (cropped != null) { cropped.destroyImages(); } } } }。