Java 保存String流图片为bytes不能在本地打开,照片出错的问题
在我们前端和服务器通信时,常常会存在一下文件传输,我在用Android前端和Myeclipse服务器进行图片传输时,常常是把图片的地址存在数据库,再通过这个地址去get图片,在Android前端 我们传输图片 常常是 将Bitmap转换为Bytes
public static byte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
但由于传输时长度太长,所以通常用Base64将Bytes转换为String字符串进行传输
public static String Bitmap2String(Bitmap bitmap)
{
return Base64.encodeToString(Bitmap2Bytes(bitmap), Base64.DEFAULT);
}
到服务器端 我犯了一个严重的错误,将传送上来的String字符串直接用 byte[] b = str.getbyte();的方式将字符串转换为字节流,然后将图片存在服务器本地
File imageFile = new File("G:\\Tomcat\\apache-tomcat-9.0.2\\webapps\\FleaMarket\\Image\\"+type);
if(!imageFile.exists())
imageFile.mkdirs();
//创建输出流
FileOutputStream outStream = new FileOutputStream(imageFile.getPath()+"\\"+uid+sdf.format(d)+".png");
//写入数据
outStream.write(bitmapArray);
//关闭输出流
outStream.close();
这样存储后
在本地文件夹打开后看到的图片是默认图片,而且怎么都打不开
或者打开后是黑乎乎的一片
这不是电脑照片查看的问题,而是照片编码出错问题,虽然在电脑上打不开,但是同样能在Android进行解码然后变成Byitmap
问题的关键就是 我们在Android端用Base64编码后的字符串不能直接转化为bytes流而是要通过Base的方式转换为正常的字节流
byte[] b= decoder.decodeBuffer(str);取代 byte[] b = str.getbyte();
下面是正确解码并保存在服务器本地能查看
public static String SaveImage(String str,int uid,String type)
{
//获取时间
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
BASE64Decoder decoder = new BASE64Decoder();
try
{
byte[] bitmapArray= decoder.decodeBuffer(str);
for(int i=0;i<bitmapArray.length;++i)
{
if(bitmapArray[i]<0){
bitmapArray[i]+=256;
}
}
File imageFile = new File("G:\\Tomcat\\apache-tomcat-9.0.2\\webapps\\FleaMarket\\Image\\"+type);
if(!imageFile.exists())
imageFile.mkdirs();
//创建输出流
FileOutputStream outStream = new FileOutputStream(imageFile.getPath()+"\\"+uid+sdf.format(d)+".png");
//写入数据
outStream.write(bitmapArray);
//关闭输出流
outStream.close();
return "Image/"+type+"/"+uid+sdf.format(d)+".png";
}
catch(IOException e)
{
System.out.println(e);
}
return null;
}
这样在服务器就能正确查看了
虽然在电脑上能不能看见,只要能在Android上解码就可以了,但是如果用其他没有Bitmap的前端来get这张图片就会出错比如c# winform来获取这张照片在pictureBox上就显示不出来,因为他获取的就会是我们用str.getbytes转错的字节流,他就不能转回正确的图片编码了。
---------------------
作者:飞娃扑火
来源:CSDN
原文:https://blog.csdn.net/m0_37655297/article/details/80031243
版权声明:本文为博主原创文章,转载请附上博文链接!
Java 保存String流图片为bytes不能在本地打开,照片出错的问题相关推荐
- Chrome保存的知乎网页,本地打开后闪频刷新问题处理
Chrome保存的知乎网页,本地打开后闪频刷新问题处理 问题描述: 系统:Window 10 浏览器: Chrome Chrome保存的知乎网页后,在本地打开出现闪频刷新的问题. 原因分析: 分析网页 ...
- java 字符流图片_java 字节流、字符流(复制图片、复制文本)
1.File 1)构造方法 2)创建 3)判断.获取 4)删除 2.字节流 1)字节流写数据的3种方式 FileOutputStream fos = new FileOutputStream(&quo ...
- 精通java图片_面试必备:详解Java I/O流,掌握这些就可以说精通了?
Java IO概述 IO就是输入/输出.Java IO类库基于抽象基础类InputStream和OutputStream构建了一套I/O体系,主要解决从数据源读入数据和将数据写入到目的地问题.我们把数 ...
- JAVA 通过url下载图片保存到本地(亲测)
//java 通过url下载图片保存到本地 public static void download(String urlString, int i) throws Exception { ...
- Java 字节数组流之图片转成字节数组
Java 字节数组流之图片转成字节数组,相当于图片的复制 字符串可以直接读取到字节数组中用(getBytes) 问题:将一张图片读到字节数组里面(所有的东西都能够读到字节数组里面) 思路:先使用文件输 ...
- 【FFmpeg】java实现利用ffmpeg视频上传转码同时截取一帧保存为同名图片,并获取视频分辨率
〇.前情提要 完成了视频上传,接下来是给上传的视频保存一张同名的jpg文件在同样文件夹中,并且获取到视频的分辨率. macOS Catalina 10.15.1 ffmpeg version 4.3. ...
- JAVA上传文件图片到服务器保存
这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存! 首先是页面 html的 我这是提交一个文件和类型 <div style="border: 1px solid ...
- java保存当前页面为图片大小_java用BufferedImage转换图片大小并保存
java用BufferedImage转换图片大小并保存,保存的图片总是一片黑色 程序实现将一个图片缩小成256*256像素图片并保存,源图片为jpg格式,但是每次转换后存在文件夹中的文件均为一片黑色, ...
- java上传文件图片到服务器保存,Java上传文件图片到服务器的方法
这里我记录一个比较简单方便操作的java上传文件图片到服务器并且保存,具体内容如下 首先是页面html的 我这是提交一个文件和类型 我是添加一张临时图片得到微信的media_id保存数据库! en ...
最新文章
- 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)
- word2vec安装以及使用
- mysql开启事务_MySQL入门之事务(上)
- python学习笔记(四)字典(dict)
- Jupyter notebook: TypeError: __init__() got an unexpected keyword argument 'io_loop 问题
- Workbox-Window v4.x 中文版
- 实例化Java对象_Java面向对象基础之对象实例化
- Oracle11 startup报错,oracle11g 启动报错 缺少系统参数
- js实现关于分页的一种实现方式
- python 脚本所在目录,Python 获取当前所在目录的方法详解
- Spring Cloud实战(六)-Spring Cloud Netflix Bus
- 项目系统架构-微服务框架
- 尝试在UE的材质节点中进行高斯模糊
- 阿里数据分析师面试准备二:对阿里数据分析师岗位的理解
- 爬取各个高校自主招生名单
- GOOGLE卫星地图 计算方式
- android小动画之Running Pig
- 图像处理冷知识——dpi和ppi
- Java XML教程
- RACTuple分析
热门文章
- Dobot机械臂 Arduino二次开发详细教程
- 有道云-markdown使用(流程图)
- 设计UI - Adobe xd文本和钢笔
- ppt打开提示以安全模式启动失败
- E3 1200 系列服务器,另类的Xeon E3-1200 v4:我们都误会它了!
- 摄像头录像 及视频保存压缩
- 宾馆房间C++一解:宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开,第二个服务员把所有编号是2的倍数的房间相反处理……以后每个服务员都是如此。共100个服务员哪几扇门是打开的
- 英语口语练习系列-C14-常用片语
- 公派访问学者签证申请需提交的材料
- 在什么特殊情况下延长劳动者工作时间可不受限制