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

java 图片转字节流 字节流转图片

    博客分类:
  • java
阅读更多

最近做一个活动,需要上传logo并压缩图片到适合的尺寸,但是这次由于给予使用率不高,所以想把图片压缩存到数据库里面,然后再前台通过流将图片转换回来


主要使用了java的       

           <dependency>
                <groupId>im4java</groupId>
                <artifactId>im4java</artifactId>
                <version>1.1.0</version>
            </dependency>

 

1、前台从controller过来

 

@RequestMapping(method = RequestMethod.POST,value="/logo")
    public String uploadCompanyLogo(ModelMap model,@PathVariable Integer companyId,HttpServletRequest request) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        MultipartFile logo = multipartRequest.getFile("logo");
        MultipartFile portrait = multipartRequest.getFile("portrait");
        this.putCompanyInfo(model,companyId);
        try {
            if(logo!=null && !logo.isEmpty()){
                byte[] big = imageOperationService.resiizeImage(ImageSizeEnum.LOGOBIGWIDTH.getValue(), ImageSizeEnum.LOGOBIGHEIGHT.getValue(), logo.getInputStream());
                byte[] small = imageOperationService.resiizeImage(ImageSizeEnum.LOGOSMALLWIDTH.getValue(), ImageSizeEnum.LOGOSMALLHEIGHT.getValue(), logo.getInputStream());               
                companyService.saveLogo(big, companyId);
                companyService.saveLogoSmall(small, companyId);               
            }
            if(portrait!=null && !portrait.isEmpty()){
                byte[] data = imageOperationService.resiizeImage(ImageSizeEnum.PORTRAITHEIGHT.getValue(), ImageSizeEnum.PORTRAITHEIGHT.getValue(), portrait.getInputStream());
                companyService.updatePortrait(data, companyId);
            }
           
        } catch (IOException e) {
            // FIXME Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // FIXME Auto-generated catch block
            e.printStackTrace();
        }
        return "company/manage/logo";
    }

 

 

 

2,主要是我们service方法的实现了

@Override
    public byte[] resiizeImage(int height, int width,InputStream Stream) throws IOException, InterruptedException {
        // FIXME Auto-generated method stub
        IMOperation op = new IMOperation();
         op.addImage("-");
         op.resize(height, width);
         op.addImage("-");

            Pipe pipeIn  = new Pipe(Stream,null);
            ByteArrayOutputStream fos = new ByteArrayOutputStream();
            Pipe pipeOut = new Pipe(null,fos);

           
            // set up command
            ConvertCmd convert = new ConvertCmd();
            convert.setInputProvider(pipeIn);
            convert.setOutputConsumer(pipeOut);

            try {
                convert.run(op);
            } catch (IM4JavaException e) {
                // FIXME Auto-generated catch block
                e.printStackTrace();
            }
            Stream.close();       
            return fos.toByteArray();
    }

 

这样我们就把这个图片的字节流放到了数据库中

 

3、再来,我们就来显示这张图片

 

public class ImageShowUtil {
   
    @Value(value = "#{globalProperties['company.business.big']}")
    private String biglogurl;
    @Value(value = "#{globalProperties['company.business.small']}")
    private String smalllogurl;
    @Value(value = "#{globalProperties['company.business.logo']}")
    private String logourl;

    private static final Logger logger = LoggerFactory.getLogger(ImageShowUtil.class);
    /**
     * 显示byte流图片
     * @param data
     * @param res
     * @throws IOException
     */
    @Cacheable(cacheName = "icoCache")
    public void showByteImage(byte data[],HttpServletResponse res,String type) throws IOException {

        try {
            res.setContentType("image/*"); // 设置返回的文件类型
            OutputStream toClient = res.getOutputStream(); // 得到向客户端输出二进制数据的对象
            if(data!=null&&data.length>0){
             toClient.write(data); // 输出数据
            }else{
             if("big".equals(type)){
               URL url = new URL(biglogurl);
               InputStream bis = new BufferedInputStream(url.openStream());
               toClient.write(getBytes(bis)); // 输出数据
               bis.close();
             }else if("small".equals(type)){
               URL url = new URL(smalllogurl);
               InputStream bis = new BufferedInputStream(url.openStream());
               toClient.write(getBytes(bis)); // 输出数据
               bis.close();
             }else{
                URL url = new URL(logourl);
                InputStream bis = new BufferedInputStream(url.openStream());
                toClient.write(getBytes(bis)); // 输出数据
                bis.close();
             }
             toClient.close();
            }
        } catch (IOException e) // 错误处理
        {
            logger.error("---------->error:"+e.getMessage());
//            PrintWriter toClient = res.getWriter(); // 得到向客户端输出文本的对象
//            res.setContentType("text/html;charset=UTF-8");
//            toClient.write("无法打开图片!");
//            toClient.close();
        }
    }
   
   
     public byte[] getBytes(InputStream is) throws IOException { 
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
            byte[] b = new byte[2048]; 
            int len = 0; 
            while ((len = is.read(b, 0, 2048)) != -1) { 
             baos.write(b, 0, len); 
            } 
            baos.flush(); 
            byte[] bytes = baos.toByteArray();    
            return bytes; 
         }

}

 

这样我们页面的图片的src只想这个servlet就行了,图片就显示出来了

,这样不好就是,如果图片过多的话,每个图片相当于一个http请求,增加系统的负载

分享到:
评论

相关推荐

    Java实现字节流与图片的转化

    在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流来转换和处理图片。 首先,我们需要理解字节流的概念。在...

    Java实现字节流与图片的转化Java源码

    在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流与图片之间的转换,这对于在网络上传输或者存储图片等二...

    Java字节流 .pdf

    Java字节流 Java字节流是一种用于处理字节数据的流处理机制,在Java中,字节流不包含边界数据的连续流,字节流是由字节组成的,Java里字符由两个字节组成。字节流是最基本的,它是按字节来处理二进制数据。 字节流...

    JAVA 字符流与字节流

    字节流适用于处理所有类型的数据,包括文本、图片、音频、视频等,因为它们可以处理任何二进制数据。 #### 常见的字节流类: - **FileInputStream** 和 **FileOutputStream**:用于从文件中读取和向文件中写入字节...

    Java IO 字节流 字符流

    字节流主要用于处理任何类型的原始数据,如图片、音频文件或者二进制文件,而字符流则专注于处理基于文本的数据。本文将深入探讨这两类流的原理、用途以及它们之间的关联。 首先,我们来看字节流。字节流由...

    Java字节流与字符流的介绍.pdf

    Java 字节流与字符流的介绍 Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流,而字符流是指以 char 为单位进行读写操作的流。 字节流的介绍 字节流的所有读操作都继承自...

    将图片以字节流存到数据库再从数据库获取显示

    1. **图片转字节流** 在Java或.NET等编程语言中,我们可以使用相关的类库来读取图片文件并将其转换为字节流。例如,在Java中,可以使用`java.io.FileInputStream`和`java.nio`包中的`ByteBuffer`来读取图片文件,并...

    Java基础11-(字节流、字符流)

    字节流处理的是二进制数据,适用于任何类型的文件,包括文本文件和非文本文件(如图片、音频、视频等)。字符流则用于处理字符数据,主要针对文本文件。 在学习Java基础时,掌握字节流和字符流是必不可少的。字节流...

    Java字节流数据逐行读取(readLine)

    在Java编程中,字节流(Byte Stream)是处理数据的一种基本方式,它适用于任何类型的数据,包括文本、图片、音频等。字节流主要分为输入流和输出流,其中InputStream类是所有字节输入流的基类,而OutputStream类则是...

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...

    Java实现字节流与图片的转化Java实用源码整理learns.

    这个"Java实现字节流与图片的转化Java实用源码整理learn"资料包,很显然,提供了关于如何在Java中进行这种转化的源代码实例。 首先,让我们了解字节流的基本概念。字节流分为输入流和输出流,它们分别是InputStream...

    JAVA_字节流和字符流

    在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。字节流主要用于处理任何类型的二进制数据,如图片、音频、视频等,而字符流则专为处理基于Unicode编码的...

    java 字节与字符流,字符流转换

    java 字节与字符流,字符流转换

    字节流字符流

    InputStreamReader将字节流转换为字符流,它需要一个字符集作为参数,用来解释字节流中的数据。OutputStreamWriter则执行相反的操作,将字符流转换回字节流,以便写入到输出流中。 在实际应用中,我们通常会根据...

    JavaIO字节输出流的总结共6页.pdf.zip

    - 字节流主要用于处理二进制数据,如图片、音频、视频等非文本文件,以及跨平台的数据传输。 2. **基本的字节输出流类** - `FileOutputStream`: 用于将数据写入到文件。通过构造函数传入文件路径,即可创建一个...

    字节流字符流练习

    字节流主要用于处理二进制数据,如图片、音频、视频等非文本格式的文件。Java中的字节流主要由InputStream和OutputStream两大类构成,它们分别代表数据的输入和输出。InputStream是所有字节输入流的基类,包括...

    Java 字节流、字符流题目.docx

    字节流和字符流之间的转换是通过`InputStreamReader`和`OutputStreamWriter`实现的,它们可以将字节流转换为字符流,反之亦然。在处理文本数据时,如果使用字节流,需要考虑到字符编码问题,因为字节流不关心字符...

    IO流学习(字节流 字符流 文本流)!

    转换流如InputStreamReader和OutputStreamWriter,它们起到了字节流和字符流之间的桥梁作用,可以根据指定的字符编码将字节流转换为字符流,反之亦然。 此外,Java的IO流还提供了一些高级特性,比如**过滤流**。...

    图片流转存Base64编码然后转图片 Spring 框下的

    图片流是指图片数据的一种序列化形式,它可以是字节流或字符流,通常用于读取、写入或传输图片数据。Base64是一种编码方式,它将二进制数据转换为可打印的ASCII字符串,便于在网络上传输,因为HTTP协议和大多数电子...

Global site tag (gtag.js) - Google Analytics