对图片处理的工具类

**对上传图文件进行格式转换和改变大小的工具类

自己有重新整理了一下图片转换的工具类

**
1.将上传图片转为字节流
2.将字节流转成图片
3.设置图片大小
4.二进制字符流转16进制和十进制

package com.tit.taomao.util;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferInt;
import java.awt.image.DirectColorModel;
import java.awt.image.PixelGrabber;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.awt.image.WritableRaster;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.springframework.web.multipart.MultipartFile;

public class BinaryImageUtil {

	//图片到byte数组
	  public static byte[] image2byte(MultipartFile object){
	    byte[] data = null;
	    InputStream input = null;
	    try {
	      input = object.getInputStream();
	      ByteArrayOutputStream output = new ByteArrayOutputStream();
	      byte[] buf = new byte[1024];
	      int numBytesRead = 0;
	      while ((numBytesRead = input.read(buf)) != -1) {
	      output.write(buf, 0, numBytesRead);
	      }
	      data = output.toByteArray();
	      output.close();
	      input.close();
	    }
	    catch (FileNotFoundException ex1) {
	      ex1.printStackTrace();
	    }
	    catch (IOException ex1) {
	      ex1.printStackTrace();
	    }
	    return data;
	  }
	  
	  
	  //byte数组到图片,将字节流转换成BufferedImage
	  public static BufferedImage byte2image(byte[] data) throws IOException{
	    
	    	ByteArrayInputStream in = new ByteArrayInputStream(data); 
	    	System.out.println("输出data:"+data);
	    	//将b作为输入流;
	    	BufferedImage image = ImageIO.read(in);     //将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();
	    	System.out.println("Make Picture success,Please find image in "+image );
	    	in.close();
		return image;
	  }
	  //byte数组到图片 ,将字节流直接列转换成图片
	  public static void byte2Image(byte[] data,File file) throws Exception{
		 
		  InputStream in = new ByteArrayInputStream(data);
	        FileOutputStream fos=new FileOutputStream(file);
	        byte[] b = new byte[1024];
	        int nRead = 0;
	        while ((nRead = in.read(b)) != -1) {
	            fos.write(b, 0, nRead);
	        }
	        fos.flush();
	        fos.close();
	        in.close();
	  }
	  //byte数组到16进制字符串
	  public static String byte2string(byte[] data){
	    if(data==null||data.length<=1) return "0x";
	    if(data.length>200000) return "0x";
	    StringBuffer sb = new StringBuffer();
	    int buf[] = new int[data.length];
	    //byte数组转化成十进制
	    for(int k=0;k<data.length;k++){
	      buf[k] = data[k]<0?(data[k]+256):(data[k]);
	    }
	    //十进制转化成十六进制
	    for(int k=0;k<buf.length;k++){
	      if(buf[k]<16) sb.append("0"+Integer.toHexString(buf[k]));
	      else sb.append(Integer.toHexString(buf[k]));
	    }
	    return "0x"+sb.toString().toUpperCase();
	  }
	  
	  
        //确保图片的文件的二进制格式是jpg;图片格式转换,改变大小
		public static BufferedImage change2jpg(File f){
			
	        try {
	        	Image i = Toolkit.getDefaultToolkit().createImage(f.getAbsolutePath());
	            PixelGrabber pg = new PixelGrabber(i, 0, 0, -1, -1, true);
				pg.grabPixels();
				int width = pg.getWidth(), height = pg.getHeight();
		        final int[] RGB_MASKS = { 0xFF0000, 0xFF00, 0xFF };
		        final ColorModel RGB_OPAQUE = new DirectColorModel(32, RGB_MASKS[0], RGB_MASKS[1], RGB_MASKS[2]);
		        DataBuffer buffer = new DataBufferInt((int[]) pg.getPixels(), pg.getWidth() * pg.getHeight());
		        WritableRaster raster = Raster.createPackedRaster(buffer, width, height, width, RGB_MASKS, null);
		        BufferedImage img = new BufferedImage(RGB_OPAQUE, raster, false, null);
		        return img;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
	        
			
		}
		
		public static void resizeImage(File srcFile,int width,int height,File destFile){
			try {
	            if(!destFile.getParentFile().exists())
	                destFile.getParentFile().mkdirs();
	            Image i = ImageIO.read(srcFile);
	            i = resizeImage(i, width, height);
	            ImageIO.write((RenderedImage) i, "jpg", destFile);
	        } catch (IOException e) {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
	        }
		
		}
		
		 public static Image resizeImage(Image srcImage, int width, int height) {
		        try {
		  
		            BufferedImage buffImg = null;
		            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		            buffImg.getGraphics().drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
		  
		            return buffImg;
		        } catch (Exception e) {
		            // TODO Auto-generated catch block
		            e.printStackTrace();
		        }
		        return null;
		    }
}

对上面的调用

@RequestMapping("admin_category_add")
	public String add(Category c,HttpSession session,UpLoadImage upLoadImage) throws Exception, IOException{
		/*
		 * 1.要添加的category对象
		 */
		categoryService.add(c);
        /*
         * 2.上传图片的绝对地址到服务器
         */
		File imageFolder = new File(session.getServletContext().getRealPath("img/category"));
		
		/*
		 * 上窜图片到本地图片地址
		 * File imageFolder = new File("D:\\javadata1\\image");
		 */
		System.out.println(imageFolder);
		/*
		 * 将上传图片重新编名字,并存放到指定文件下
		 */
		File file = new File(imageFolder,c.getId()+".jpg");
		/*
		 * 将上传图片转换成二进制字符流
		 */
		byte []a = BinaryImageUtil.image2byte(upLoadImage.getImage());
		System.out.println("二进制数:"+a);
		/* 二进制流转换成图片 
		 * 方法一
		 * BufferedImage img = BinaryImageUtil.byte2image(a);
		 *  ImageIO.write(img, "jpg", file);
		 *  
		 *  方法二,没有使用二进制,将上传图片之间转成bufferedImage
         * upLoadImage.getImage().transferTo(file);
         * BufferedImage img = BinaryImageUtil.change2jpg(file); 
		 * ImageIO.write(img, "jpg", file);
		 */
		
         
		/*
		 * 方法三
		 */
		BinaryImageUtil.byte2Image(a, file);
		return "redirect:/admin_category_list";
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值