Java对图片的处理
1.图片存储
在图片的存储字段方面,SQL Server和My SQL都有相应的字段,而在Oracle里没有明确的字段,但也提供了几个大型字段,一般,我们存储在BLOB类型里。这里有个CLOB和BLOB字段的讨论,网上学习之后知道,BLOB存储的是二进制流,而CLOB存储的是大容量的字符串,当然就应该由BLOB来承担重任了。
2.读取
BLOB的读取也是一麻烦事,在不同平台上的读取不就不一样.
3.生成图片
这是想写的重点。上次有朋友在群里问过,图片生成质量不好,其实图片的生成有好多种方法。下面一一给出代码
(1)最复杂但生成图片质量较好的方法
BLOB blob =(BLOB)rs.getObject("fimage"); //这是在Tomcat环境下取BLOB的值//Blob blob=rs.getBlob("fimage"); //这是在weblogic环境下取BLOB的值InputStream in=blob.getBinaryStream(); //生成输入流BufferedImage bimage = null; //缓存图片对象BufferedInputStream ins = new BufferedInputStream(in); //生成缓存输入流bimage=ImageIO.read(ins); //由ImageIO对象读成缓存图片对象。ImageIO是个很重要的对象ServletOutputStream sos = response.getOutputStream(); //取得输出流,这里是把图片输出到客户端,如果想把图片生成本地图片文件可以这样//FileOutputStream sos=new FileOutputStream(new File("C:/cs.jpg"));BufferedOutputStream bos = new BufferedOutputStream(sos); //生成输出缓存JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); //生成JPEG图片对象encoder.encode(bimage); //按格式把图片流进行编码bos.close();sos.close();
BLOB blob =(BLOB)rs.getObject("fimage");//Blob blob=rs.getBlob("fimage");InputStream in=blob.getBinaryStream();BufferedImage bimage = null;BufferedInputStream ins = new BufferedInputStream(in);bimage=ImageIO.read(ins);ImageIO.write(bimage,"JPEG",response.getOutputStream()); //主要的是这句,直接就把图片画出来了,但图片质量并不太好,一般在做网页识别码时用,第二个参数可以设置图片的类型,第三个参数为输出对象,这里也可以换成在本地生成图片文件,只需把文件流改写成new FileOutputStream(new File("C:/cs.jpg"))
BLOB blob =(BLOB)rs.getObject("fimage");//Blob blob=rs.getBlob("fimage");InputStream in=blob.getBinaryStream();response.setContentType("image/jpeg");BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());int n;while ((n=in.read())!=-1){bos.write(n);}bos.flush();bos.close();in.close();
// 得到图像缩放比率// @param sourceWidth 源图宽// @param sourceHeight 源图高// @param scaled 变化比例值 要想把图片放大变小只需改变该值// @return scaling缩放比率public static double getScaling(int sourceWidth, int sourceHeight,double scaled) {int snapHeightMax = 120; // 缩放后最小高度int snapWidthMax = 150; // 缩放后最小宽度double widthScaling = ((double) snapWidthMax * (double) scaled) / (double) sourceWidth;double heightScaling = ((double) snapHeightMax * (double) scaled) / (double) sourceHeight;double scaling = (widthScaling < heightScaling) ? widthScaling: heightScaling;return scaling;}//按比例压缩图片// @param bufferedimage 目标图像// @scaled 缩放倍数// @param flg 是否要对图片压缩// @returnpublic static BufferedImage resizeImage(final BufferedImage bufferedimage,final double scaled,final boolean flg){int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;int wg = bufferedimage.getWidth();int hg = bufferedimage.getHeight();if(flg){double scaleds=getScaling(wg,hg,scaled); //得到倍率int w=(int)(wg*scaleds);int h=(int)(hg*scaleds);System.out.println(w+" "+h);(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.drawImage(bufferedimage,0,0,w,h,null);}else{(graphics2d = (img = new BufferedImage(wg, hg, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.drawImage(bufferedimage,0,0,wg,hg, null);}graphics2d.dispose();return img;}
// 旋转图片为指定角度// @param bufferedimage 目标图像// @param degree 旋转角度// @returnpublic static BufferedImage rotateImage(final BufferedImage bufferedimage,final int degree){int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();return img;}
// 水平翻转图像// @param bufferedimage 目标图像// @returnpublic static BufferedImage flipImage(final BufferedImage bufferedimage){int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(w, h, bufferedimage.getColorModel().getTransparency())).createGraphics()).drawImage(bufferedimage, 0, 0, w, h, w, 0, 0, h, null);graphics2d.dispose();return img;}