图片的编码存储与解码输出(基于Android将图片转Base64编码后再次解码会导致图片失真的解决办法)

这篇具有很好参考价值的文章主要介绍了图片的编码存储与解码输出(基于Android将图片转Base64编码后再次解码会导致图片失真的解决办法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    Android将经Bsae64编码后的图片存储到MySQL,并解码输出查看(问题:图片失真)

    Android项目下载:

链接:https://pan.baidu.com/s/1hvVupGcCf1f41fizF08SNg?pwd=9988 
提取码:9988

部分源码:

package com.example.testandroidmysqlphplogin;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Message;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;


import android.os.Handler;

import android.app.Activity;
import android.content.Intent;


public class MainActivity extends AppCompatActivity {
    protected static final int ERROR = 2;
    protected static final int SUCCESS = 1;
    private EditText et_qq;
    private EditText et_psd;

    Button button,button1;



    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SUCCESS:
                    Toast.makeText(MainActivity.this,(String)msg.obj, Toast.LENGTH_LONG).show();
                    break;

                case ERROR:
                    Toast.makeText(MainActivity.this,"传输失败", Toast.LENGTH_LONG).show();
                    break;

            }
        };
    };



    private Object StreamTools;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_qq = (EditText) findViewById(R.id.et_qq);
        et_psd = (EditText) findViewById(R.id.et_pwd);




        button1 = findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ImageView image1 = (ImageView) findViewById(R.id.image1);
                EditText et_pwd = (EditText) findViewById(R.id.et_pwd);
                et_pwd.setMovementMethod(new ScrollingMovementMethod());
                et_pwd.setVerticalScrollBarEnabled(true);
                et_pwd.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);


                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.qq);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 0, baos);
                byte[] imageBytes = baos.toByteArray();
                String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
                et_pwd.setText(imageString);

                /*decode base64 string to image*/
                imageBytes = Base64.decode(imageString, Base64.DEFAULT);
                Bitmap decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
                image1.setImageBitmap(decodedImage);



            }});




        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ImageView image = (ImageView) findViewById(R.id.image);
                TextView et_pwd = (EditText) findViewById(R.id.et_qq);
                et_qq.setMovementMethod(new ScrollingMovementMethod());
                et_qq.setVerticalScrollBarEnabled(true);
                et_qq.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);


                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ww);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 0, baos);
                byte[] imageBytes = baos.toByteArray();
                String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);


                imageBytes = Base64.decode(imageString, Base64.DEFAULT);
                Bitmap decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
                image.setImageBitmap(decodedImage);
                et_pwd.setText(imageString);




            }});




        }

    public void login(View view){
        final String qq = et_qq.getText().toString();

        Intent i=new Intent(MainActivity.this,MainActivity.class);
        startActivity(i);

        if(TextUtils.isEmpty(qq)){
            Toast.makeText(this, "不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        new Thread(){
            public void run(){
                try {
                    String path = "http://192.168.228.1/PHP/MySQL/10.php";
                    URL url = new  URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    //区别2、请求方式post
                    conn.setRequestMethod("POST");
                    conn.setRequestProperty("User-Agent", "Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)");
                    //区别3、必须指定两个请求的参数
                    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//请求的类型  表单数据
                    String data = "username="+qq+"&button=";
                    ;
                    conn.setRequestProperty("Content-Length", data.length()+"");//数据的长度
                    //区别4、记得设置把数据写给服务器
                    conn.setDoOutput(true);//设置向服务器写数据
                    byte[] bytes = data.getBytes();
                    conn.getOutputStream().write(bytes);//把数据以流的方式写给服务器
                    int code = conn.getResponseCode();
                    System.out.println(code);
                    if(code == 200){
                        InputStream is = conn.getInputStream();
                        String  result = com.example.testandroidmysqlphplogin.StreamTools.readStream(is);
                        Message mas= Message.obtain();
                        mas.what = SUCCESS;
                        mas.obj = result;
                        handler.sendMessage(mas);

                    }else{
                        Message mas = Message.obtain();
                        mas.what = ERROR;
                        handler.sendMessage(mas);
                    }
                }catch (IOException e) {
                    // TODO Auto-generated catch block
                    Message mas = Message.obtain();
                    mas.what = ERROR;
                    handler.sendMessage(mas);
                }
            }
        }.start();

    }




    public void login1(View view){

        Intent i=new Intent(MainActivity.this,MainActivity.class);
        startActivity(i);

        final String psd = et_psd.getText().toString();

        if(TextUtils.isEmpty(psd)){
            Toast.makeText(this, "不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        new Thread(){
            public void run(){
                try {
                    String path = "http://192.168.228.1/PHP/MySQL/10.php";
                    URL url = new  URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    //区别2、请求方式post
                    conn.setRequestMethod("POST");
                    conn.setRequestProperty("User-Agent", "Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)");
                    //区别3、必须指定两个请求的参数
                    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//请求的类型  表单数据
                    String data = "username="+psd+"&button=";
                    ;
                    conn.setRequestProperty("Content-Length", data.length()+"");//数据的长度
                    //区别4、记得设置把数据写给服务器
                    conn.setDoOutput(true);//设置向服务器写数据
                    byte[] bytes = data.getBytes();
                    conn.getOutputStream().write(bytes);//把数据以流的方式写给服务器
                    int code = conn.getResponseCode();
                    System.out.println(code);
                    if(code == 200){
                        InputStream is = conn.getInputStream();
                        String  result = com.example.testandroidmysqlphplogin.StreamTools.readStream(is);
                        Message mas= Message.obtain();
                        mas.what = SUCCESS;
                        mas.obj = result;
                        handler.sendMessage(mas);

                    }else{
                        Message mas = Message.obtain();
                        mas.what = ERROR;
                        handler.sendMessage(mas);
                    }
                }catch (IOException e) {
                    // TODO Auto-generated catch block
                    Message mas = Message.obtain();
                    mas.what = ERROR;
                    handler.sendMessage(mas);
                }
            }
        }.start();

    }
}

转Base64编码部分:

ByteArrayOutputStream baos = new ByteArrayOutputStream()Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ww);
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, baos);
byte[] imageBytes = baos.toByteArray();
String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);


imageBytes = Base64.decode(imageString, Base64.DEFAULT);
Bitmap decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
image.setImageBitmap(decodedImage);
et_pwd.setText(imageString);

Android要存储的目标图片:

base64图片解码,android

    Android项目运行:

以上Android程序运行后会将图片的转为Base64编码进行存储,以下是图片转码后的结果。

base64图片解码,android

     php将MySQL中编码解码后输出验证:

下面是进行验证的php代码:

<?php

$link=mysqli_connect("localhost","your_username","your_password","your_database");
$sql = "SELECT * FROM user WHERE Id =1";

$res =    mysqli_query($link,$sql);

$data = array();

$imgStr = '';
while ($row = mysqli_fetch_assoc($res)) {

    $imgStr .= $row['ws_username'];

}

$binaryStr = base64_decode($imgStr);
header("Content-type:image/jpg");
echo $binaryStr;

?>

但是解码后输出后的照片出现了严重失真

base64图片解码,android

     图片失真原因:

  1. 数据量增加:Base64 编码使用64个字符表示原始二进制数据,因此会对原始图片数据进行扩展。编码后的数据量通常会比原始二进制数据大约 33%。这意味着编码后的数据量更大,可能导致传输和存储方面的效率下降。

  2. 在写程序时对图片进行了压缩,导致很多像素点丢失,致使图片存储时就是不完整的。

经过资料查询与多次验证,找到了解决方法:

将图片转为二进制数存储到MySQL,再通过对二进制码转为图片输出可以完整的输出图片,通过php对图片的存储过可以确定,Android不失真的存储图片,可以将图片转为二进制图片进行存储。

存储图片:

base64图片解码,android

转码后存到MySQL:

base64图片解码,android

 将二进制码转图片输出:

base64图片解码,android

 该理论应用于上传的Android程序中可顺利解决Android存图片输出失真问题。

php将图片转二进制码:

<?php
// 连接到数据库
$conn = mysqli_connect("localhost", "rttt", "128", "my");

$imageData = file_get_contents("F:/编号图片/手指/001.jpg");// 读取图片文件的二进制数据

$escapedImageData = mysqli_real_escape_string($conn, $imageData);
//echo $escapedImageData;


// 执行INSERT语句将图片数据插入到数据库表中
$sql = "INSERT INTO images (`image_data`) VALUES ('$escapedImageData')";



mysqli_query($conn, $sql);
?>

php将二进制码转图片验证:文章来源地址https://www.toymoban.com/news/detail-801597.html

<?php
// 连接到数据库
$conn = mysqli_connect("localhost", "rttt", "128", "my");


// 执行查询语句获取图片数据
$sql = "SELECT image_data FROM images WHERE id = '1'";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);


header("Content-type: image/jpeg");// 设置HTTP标头为图像类型


echo $row['image_data'];


mysqli_close($conn);// 关闭数据库连接
?>

到了这里,关于图片的编码存储与解码输出(基于Android将图片转Base64编码后再次解码会导致图片失真的解决办法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java base64编码和解码

    Base64 编码会将字符串编码得到一个含有 A-Za-z0-9+/ 的字符串。 base64 编码和解码网上有些地方称为 base64 加密和解密,这是不准确的。base64 是不能用来加密和解密的,它只是一种编码解码方式,不能用于加密和解密,如果你想加密和解密可以选择如 AES、RSA 等加密算法。 标准的

    2024年02月15日
    浏览(30)
  • JS Base64编码和解码

    Base64 是一种编码方式,可以将任意字符(包括二进制字符流)转成可打印字符。JavaScript 定义了两个与 Base64 相关的全局方法。 btoa():字符串或二进制值转为 Base64 编码。 atob():把 Base64 编码转为原来的字符。 Base64 方法不能够操作非 ASCII 字符。 示例 要将非 ASCII 码字符转为

    2024年02月16日
    浏览(41)
  • Python中的Base64编码和解码

    Python3中Base64编码和解码,使用的是base64模块中的b64encode 和 b64decode方法,关于怎么使用,首先查看源码中的说明: b64encode : Encode the bytes-like object s using Base64 and return a bytes object b64decode : Decode the Base64 encoded bytes-like object or ASCII string s… The result is returned as a bytes object. 要点

    2024年02月13日
    浏览(31)
  • 前端Base64 编码和解码的使用方法

    使用 Base64 类从 ‘js-base64’ 库进行 Base64 编码和解码 vue: 使用 npm 或 yarn 包管理器来安装‘js-base64’ 库 原生: 通过 vue: 导入 Base64 类: 或者: vue: Base64 编码的使用示例: Base64 解码的使用示例: 或者,导入 encode 和 decode 函数: Base64 编码的使用示例: Base64 解码的使用示例

    2024年02月07日
    浏览(34)
  • 【JS】实现 Base64 编码和解码(及中文乱码问题)

    JavaScript 定义了两个与 Base64 相关的全局方法。 遇到中文编码需要先做一次 URI 组件编码或对解码后的内容进行 URI 解码 示例:Base64 编码 示例:Base64 解码 中文乱码处理方法: 按照 Base64 插件:编解码: js-base64 ,判断是否是Base64编码格式: is-base64 插件使用

    2024年02月15日
    浏览(28)
  • php的Url 安全的base64编码解码类

    2024年02月04日
    浏览(33)
  • Linux系统下使用命令行进行Base64编码和解码

    大家知道,编码是将数据转换为有效传输或存储所需格式的过程。相反,解码是将编码数据转换回其原始格式的过程。今天在这里向大家介绍一下 Base64 编码和解码,以便大家理解与学习。 Base64 是将二进制数据转换为 ASCII 的编码方式之一。通常,当二进制数据传输到无法正

    2024年02月11日
    浏览(40)
  • C# 采用3DES-MAC进行签名 base64解码与编码

    ** ** 3DES-MAC(Triple Data Encryption Standard Message Authentication Code)是一种消息认证码(MAC)算法,用于验证消息的完整性和真实性。3DES-MAC使用了3DES(Triple Data Encryption Standard)加密算法的一部分来生成MAC值。以下是使用C#示例演示如何使用3DES-MAC签名一个消息: 首先,你需要确保在

    2024年02月09日
    浏览(31)
  • 深入了解图片Base64编码

    title: 深入了解图片Base64编码 date: 2024/4/8 10:03:22 updated: 2024/4/8 10:03:22 tags: Base64编码 图片转换 HTTP请求 前端开发 移动应用 性能优化 图片压缩 Base64编码是一种将二进制数据转换为文本字符串的编码方式,通过将数据转换为一种可打印的ASCII字符集,以便在文本协议中传输。对图

    2024年04月08日
    浏览(42)
  • 【tips】base64编码怎么反显出图片

    实际的数据展示是这样的 然后把以上的文件内容放置到html文件中 点击这个 展示出来是这样的

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包