`
benfreer
  • 浏览: 105215 次
  • 性别: Icon_minigender_2
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论
阅读更多
转自:http://blog.163.com/wmswu@126/blog/static/514385182008973163384/

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();
这种图片生成方式麻烦一些,在页面还要做个引用或者把这段代码直接写在页面上



(2)直接ImageIO对象写出来

  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"))

(3)以文件流读写的方式直接输出

   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();

这种方式没有进行过多探讨,但这种方式输出是成功的,我个人觉得似乎有些别扭,所以不用



还有中方式,在做web图片输出的时候可以用response.write()的方式写出,但具体怎样我也不太清楚,是同事告诉可以行得通的一种方式。



4.图片的操作

先前我有些图片从网上宕下来是倒置的,入库前想正过来,因为先前的项目设计没想到这些,为了不增加额外工作,于是想找方法把倒置图片正过来,有两种方法

(1)在网页上输出时用css做处理
<img src="1483013.jpg" style="FILTER: FlipV(color=silver)">

(2)用程序把图片正过来

在网上搜了半天,终于搜到一个高手写的三个操作图片的方法,试了试,很不错,有些地方进行了修改,很可惜忘记了这个高手的出处,在此感谢一下,借用


     // 得到图像缩放比率
     // @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 是否要对图片压缩
     // @return


    public 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  旋转角度
     // @return

public 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 目标图像
     // @return

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



这三个方法很简单的就把图片给正过来了,其实这些方法还有些缺陷,可以根据自己的用处进行更改。

纵观操作图片的方法,其主要在于BufferedImage对象的初始化和getGraphics().drawImage()的参数,搞清楚drawImage()参数不同的各中处理,比如:

image=new BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);
image.getGraphics().drawImage(bimage,0,0,200, 100, null);  //缩小图片200*100

image.getGraphics().drawImage(bimage,200, 100, null);  //截取图片200*100

等等操作。
分享到:
评论

相关推荐

    基于分布式文件系统的图片存储服务的研究

    ### 基于分布式文件系统的图片存储服务的研究 #### 概述 随着互联网技术的快速发展,数据量呈爆炸性增长,尤其是图像等非结构化数据的处理与存储问题变得日益突出。传统的关系型数据库在处理这类大数据时逐渐暴露...

    图片存储数据库以及页面读取显示源码

    图片存储数据库以及页面读取显示源码 图片存储:通过文件上传获取图片并转换成Byte[]字节数组,保存到数据库Image字段 数据库存储图片的读取和显示控制:从数据库中读取到字节流后把图片直接写入页面并对显示进行控制

    图片存储于数据库并显示在jsp页面

    在IT行业中,图片存储于数据库并显示在JSP页面是一个常见的需求,特别是在开发Web应用程序时。这个场景通常涉及前端用户上传图片,后端系统处理这些图片,并将它们以合适的方式展示在用户界面上。这里我们将深入探讨...

    Taobao海量图片存储与CDN系统-v2-系统架构师

    ### Taobao 海量图片存储与 CDN 系统解析 #### 一、系统全貌 在淘宝这样的电商平台中,图片的高效存储与快速分发至关重要。本次分享将围绕Taobao的图片存储与CDN系统展开,详细介绍其架构设计与关键技术。 #### ...

    图片存储大小批量处理。

    本文将详细介绍如何使用Photoshop(简称PS)软件进行批量处理图片存储大小,帮助你高效解决这一问题。 首先,我们需要将待处理的图片集中存放在同一个文件夹内,以便于后续的批量操作。确保所有需要调整的图片都在...

    图片存储到SQLServer数据库中

    本主题聚焦于如何将图片存储到SQL Server数据库中,主要涉及Java编程语言进行数据库开发的相关知识。 首先,我们有几种常见的图片存储方式: 1. **BLOB(Binary Large Object)存储**:这是最直接的方法,图片以二...

    淘宝海量图片存储与CDN系统

    为了应对如此庞大的图片存储需求和快速的图片访问速度,淘宝构建了一套高效的图片存储与CDN(内容分发网络)系统。本文将深入探讨这个系统的关键技术和设计原则。 首先,海量图片的存储问题是一个挑战。淘宝采用了...

    图片存储到数据库保存二进制文件,并在DATAGRIDVIEW中显示出来

    在C#编程中,将图片存储到数据库并以二进制数据的形式保存,以及在DataGridView控件中显示这些图片,是一项常见的任务。这种操作在处理大量图像数据时尤其有用,例如在开发一个需要展示产品图片的电子商务应用或者...

    图片存储系统

    标题中的“图片存储系统”指的是一个专门用于管理和存储图片的软件应用。这个系统可能是由编程语言PB9(PowerBuilder 9)开发,并结合了Access数据库技术来实现数据存储和检索功能。PB9是一种可视化的、面向对象的...

    将JPG图片存储到数据库.rar

    本教程将详细讲解如何使用Delphi编程语言将JPG图片存储到数据库中,以及相关的技术要点。 1. **Delphi与数据库交互**: Delphi是一款强大的集成开发环境(IDE),它内置了对多种数据库的支持,如Interbase、Firebird...

    将JPG图片存储到数据库-Delphi实例..rar

    本实例将详细讲解如何使用Delphi来实现将JPG图片存储到数据库的操作。 首先,我们需要了解数据库的基础知识。数据库是一个组织和存储数据的系统,它允许高效地检索、管理并更新这些数据。在Delphi中,常见的数据库...

    图片存储到sqlserver(java实现)并用jsp展示参考.pdf

    《图片存储到SQL Server(Java实现)并用JSP展示》 在Java开发中,有时候我们需要将图片数据存储到数据库中,并在网页上展示。这个过程涉及到Java与SQL Server数据库的交互,以及JSP页面的处理。下面我们将详细介绍...

    java实现本地读取图片存储到数据库中并在html网页显示

    首先,我们需要理解的是,将图片存储到数据库中通常采用的方法是将图片转换为二进制数据流。这是因为数据库系统更善于处理结构化数据,而不是像图片这样的非结构化数据。在Java中,我们可以使用`java.io`和`java.nio...

    图片存储到MySQL数据库中

    一、图片存储方式 1. BLOB类型:BLOB(Binary Large Object)是MySQL中的数据类型,专门用于存储二进制大对象,如图片、音频或视频文件。在Java编程中,可以使用PreparedStatement的setBlob方法将图片字节数组转换为...

    uditor自定义图片存储路径和图片读取域名2

    【uditor自定义图片存储路径和图片读取域名2】是一个关于优化和扩展富文本编辑器uditor的实践,主要涉及两个核心知识点:自定义图片存储路径和设置图片读取域名。uditor是一款广泛使用的JavaScript富文本编辑器,...

    Taobao海量图片存储与CDN系统

    为了有效存储和快速分发这些海量图片,淘宝建立了一套独特的图片存储与CDN系统。CDN即内容分发网络,是一种通过互联网将数据缓存至靠近用户端的服务器中,以提高数据传输速度、减轻源服务器压力的技术。 淘宝的图片...

    SavePic.rar_savepic_图片存储

    在IT行业中,图片存储是一个常见的需求,特别是在构建网站、应用程序或者大数据分析系统时。"SavePic.rar_savepic_图片存储"这个标题暗示我们讨论的是一个关于如何将图片以流的形式存储到数据库的程序。这个程序可能...

    淘宝网图片存储系统架构

    ### 淘宝网图片存储系统架构解析 #### 一、背景及挑战 淘宝网作为中国乃至全球最大的电子商务平台之一,面临着极其庞大的图片存储与访问压力。据流量统计,淘宝网的整体流量中,图片访问流量占比高达90%以上,而...

Global site tag (gtag.js) - Google Analytics