相关文章推荐
阳光的青蛙  ·  在 Oracle 数据库上使用 ...·  2 年前    · 
酒量小的小虾米  ·  Azure OpenAI 服务 REST ...·  2 年前    · 
潇洒的硬币  ·  关于触发器死循环的问题_百度知道·  2 年前    · 
沉着的太阳  ·  重定向的九种方案及性能比较 - 知乎·  2 年前    · 
Code  ›  BufferedImage与byte[]互转开发者社区
https://cloud.tencent.com/developer/article/1343416
任性的砖头
2 年前
作者头像
bear_fish
0 篇文章

BufferedImage与byte[]互转

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 用户2442861的专栏 > BufferedImage与byte[]互转

BufferedImage与byte[]互转

作者头像
bear_fish
发布 于 2018-09-19 16:04:50
1.7K 0
发布 于 2018-09-19 16:04:50
举报

一、需要用到的类

java.awt.image.BufferedImage;

javax.imageio.ImageIO;

java.io.*;

二、为什么要将BufferedImage转为byte数组

在传输中,图片是不能直接传的,因此需要把图片变为字节数组,然后传输比较方便;只需要一般输出流的write方法即可;

而字节数组变成BufferedImage能够还原图像;

三、如何取得BufferedImage

BufferedImage image = ImageIO.read(new File("1.gif"));

四、BufferedImage  ---->byte[]

ImageIO.write(BufferedImage image,String format,OutputStream out);方法可以很好的解决问题;

参数image表示获得的BufferedImage;

参数format表示图片的格式,比如“gif”等;

参数out表示输出流,如果要转成Byte数组,则输出流为ByteArrayOutputStream即可;

执行完后,只需要toByteArray()就能得到byte[];

五、byte[] ------>BufferedImage

ByteArrayInputStream in = new ByteArrayInputStream(byte[]b);    //将b作为输入流;

BufferedImage image = ImageIO.read(InputStream in);     //将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();

六、显示BufferedImage

public void paint(Graphics g){

super.paint(g);

g.drawImage(image,x,y,width,height,null);    //image为BufferedImage类型

}

如果要自动调用paint方法,则需要调用 repaint ()方法;

七、实例

要求:编写一个网络程序,通过Socket将图片从 服务器 端传到客户端,并存入文件系统;

Server端:

[java] view plain copy

  1. package org.exam3;
  2. import java.awt.image.BufferedImage;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.File;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import javax.imageio.ImageIO;
  9. public class T6Server {
  10. public static void main(String[] args) throws Exception {
  11. ServerSocket server = new ServerSocket(8889);
  12. System.out.println("服务器开启连接...端口为8889");
  13. Socket s = server.accept();
  14. while ( true ){
  15. System.out.println("一客户端连接服务器,服务器传输图片...");
  16. DataOutputStream dout = new DataOutputStream(s.getOutputStream());
  17. BufferedImage image = ImageIO.read( new File("1.gif"));  //读取1.gif并传输
  18. ByteArrayOutputStream out = new ByteArrayOutputStream();
  19. boolean flag = ImageIO.write(image, "gif", out);
  20. byte [] b = out.toByteArray();
  21. dout.write(b);
  22. s.close();
  23. System.out.println("图片传送完毕,服务器开启连接...端口为8889");
  24. s = server.accept();
  25. }
  26. }
  27. }

Client端:

[java] view plain copy

  1. package org.exam3;
  2. import java.awt.BorderLayout;
  3. import java.awt.Graphics;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.image.BufferedImage;
  7. import java.io.ByteArrayInputStream;
  8. import java.io.ByteArrayOutputStream;
  9. import java.io.DataInputStream;
  10. import java.io.File;
  11. import java.io.PrintWriter;
  12. import java.net.Socket;
  13. import javax.imageio.ImageIO;
  14. import javax.swing.JButton;
  15. import javax.swing.JFrame;
  16. import javax.swing.JPanel;
  17. public class T6Client extends JFrame {
  18. JButton button;
  19. JPanel panel;
  20. int count = 0;
  21. BufferedImage image ;
  22. public T6Client() {
  23. setSize(300, 400);
  24. button = new JButton("获取图像");
  25. add(button,BorderLayout.NORTH);
  26. button.addActionListener( new ActionListener() {
  27. public void actionPerformed(ActionEvent event) {
  28. try {
  29. Socket s = new Socket("localhost",8889);
  30. PrintWriter out = new PrintWriter(s.getOutputStream());
  31. out.print("a");
  32. DataInputStream in = new DataInputStream(s.getInputStream());
  33. byte []b = new byte [1024];
  34. ByteArrayOutputStream bout = new ByteArrayOutputStream();
  35. int length = 0;
  36. while ((length=in.read(b))!=-1){
  37. bout.write(b, 0, length);
  38. }
  39. ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
  40. image = ImageIO.read(bin);
  41. repaint();
  42. ImageIO.write(image, "gif", new File("output-"+count+".gif"));
  43. count++;
  44. s.close();
  45. } catch (Exception e) {
  46. }
  47. }
  48. });
  49. panel = new JPanel();
  50. add(panel);
  51. }
  52. @Override
  53. public void paint(Graphics g){
  54. super .paint(g);
  55. g.drawImage(image, 20, 20, 300, 150, null );//image为BufferedImage类型
  56. }
  57. public static void main(String[] args) throws Exception {
  58. T6Client frame = new T6Client();
  59. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  60. frame.setVisible( true );
  61. }
  62. }
点击展开阅读全文
本文参与 腾讯云自媒体分享计划 ,分享自作者个人站点/博客。
原始发表:2016年08月04日, 如有侵权请联系 cloudcommunity@tencent.com 删除
其他

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

其他
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
关于作者
bear_fish
0
文章
0
累计阅读量
0
获赞
前往专栏
目录
  • 一、需要用到的类
  • 二、为什么要将BufferedImage转为byte数组
  • 三、如何取得BufferedImage
  • 四、BufferedImage  ---->byte[]
  • 五、byte[] ------>BufferedImage
  • 六、显示BufferedImage
  • 七、实例
切换旧版
领券
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2023 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
 
推荐文章
阳光的青蛙  ·  在 Oracle 数据库上使用 Visual Studio 2005 或 2008 构建 .NET 应用程序
2 年前
酒量小的小虾米  ·  Azure OpenAI 服务 REST API 参考 - Azure OpenAI | Microsoft Learn
2 年前
潇洒的硬币  ·  关于触发器死循环的问题_百度知道
2 年前
沉着的太阳  ·  重定向的九种方案及性能比较 - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号