1、总体描述
(1)图片压缩
(2)读取压缩后的图片文件,base64进行编码,拼接xml字符串
(3)使用http传输xml
(4)接收端解析xml,还原图片文件
2、图片压缩demo
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class ImageCompress {
public static void ImageScale(String path, String fileName, String toFileName) {
try {
Image image = javax.imageio.ImageIO.read(new File(path + fileName));
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
//计算缩放比例
float scale = getRatio(imageWidth, imageHeight, 130, 130);
imageWidth = (int) (scale * imageWidth);
imageHeight = (int) (scale * imageHeight);
image = image.getScaledInstance(imageWidth, imageHeight,Image.SCALE_AREA_AVERAGING);
// Make a BufferedImage from the Image.
BufferedImage mBufferedImage = new BufferedImage(imageWidth,imageHeight, BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphics2D g2 = mBufferedImage.createGraphics();
//绘制图像到目标位置
g2.drawImage(image, 0, 0, imageWidth, imageHeight, Color.white, null);
g2.dispose();
float[] kernelData2 = { -0.125f, -0.125f, -0.125f, -0.125f, 2,-0.125f, -0.125f, -0.125f, -0.125f };
Kernel kernel = new Kernel(3, 3, kernelData2);
//使用卷积核的卷积是一种通过输入像素来计算输出像素的空间运算,方法是将核与输入像素邻域相乘。这种运算使得直接邻域可按核数学指定的方式影响输出像素
//ConvolveOp.EDGE_NO_OP将位于源图像边缘的像素复制为目标中相应的像素,不加修改。
//构造给定 Kernel、边缘条件和 RenderingHint 对象(可以为 null)的 ConvolveOp。
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
//对 BufferedImage 执行卷积运算。
mBufferedImage = cOp.filter(mBufferedImage, null);
FileOutputStream out = new FileOutputStream(path + toFileName);
//可以正常实现bmp转jpg、png转jpg、gif转jpg
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(mBufferedImage);
out.close();
} catch (FileNotFoundException fnf) {
fnf.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public static float getRatio(int width, int height, int maxWidth,int maxHeight) {
float Ratio = 1.0f;
float widthRatio;
float heightRatio;
widthRatio = (float) maxWidth / width;
heightRatio = (float) maxHeight / height;
if (widthRatio < 1.0 || heightRatio < 1.0) {
Ratio = widthRatio <= heightRatio ? widthRatio : heightRatio;
}
return Ratio;
}
public static void main(String[] args) {
ImageScale("", "SNV31539.JPG", "SNV31539_small.JPG");
}
}
3、读取压缩后的图片文件,base64进行编码,拼接xml字符串
public static String bin2XmlString(File file) {
byte[] data = null;
FileInputStream input = null;
String ret = null;
int n;
try {
data = new byte[(int) file.length()];
input = new FileInputStream(file);
n = input.read(data);
input.close();
ret = new String(Base64.encodeBase64(data, true));
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
4、接收端解析xml,还原图片文件
public static boolean xmlString2Bin(String base64String, File file) {
byte[] data;
FileOutputStream output = null;
boolean ret = false;
try {
data = Base64.decodeBase64(base64String.getBytes());
output = new FileOutputStream(file);
output.write(data);
output.close();
ret = true;
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}