`
liuxi1024
  • 浏览: 384710 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

图片网络传输

阅读更多

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;
	}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics