Qt:图片文字转base64程序

news2024/11/24 8:43:33

目录

一.Base64

1.编码原理

2.应用场景

3.优点

4.限制

5.变种

二.文字与Base64互转

1.ui设计

2.文字转Base64

3.Base64转文字

三.图片与Base64互转

1.ui设计

2.选择图片与图片路径

3.图片转Base64

4.Base64转图片

四.清空设置

五.效果

六.代码

base64convert.h

base64convert.cpp

base64.h

base64.cpp


一.Base64

Base64是一种基于64个可打印字符来表示二进制数据的编码方法。

1.编码原理

Base64编码通过将二进制数据每三个字节分为一组,每个字节8位,共24位。然后将这24位划分为四组,每组6位。由于6位二进制可以表示64种不同的状态(2^6=64),因此可以用64个字符来表示这些状态。标准的Base64编码表包括大写字母A-Z、小写字母a-z、数字0-9以及“+”和“/”,有时还使用“=”作为填充字符。

2.应用场景

Base64广泛应用于网络传输中,特别是在电子邮件、网页传输、数据存储等领域。它使得二进制数据可以通过文本协议安全传输,同时保持数据的完整性。

3.优点

Base64编码可以将二进制数据转换为文本形式,方便在不支持二进制数据的系统中传输和存储。同时,Base64编码后的数据可以在文本协议中安全传输,不会被误解析。

4.限制

Base64编码会导致数据膨胀,因为每3个字节的二进制数据会被编码为4个字符,增加了约33%的数据大小。Base64编码不是加密算法,不能用于保护敏感信息。如果需要保护信息安全,应该使用专门的加密技术。

5.变种

为了满足不同的应用需求,Base64有多种变种,如URL安全的Base64、Base64url等,它们通过替换某些特殊字符来避免在特定环境下的问题。

二.文字与Base64互转

1.ui设计

1拖动Label控件,分别输入文字与Base64标签;

2.拖动QLineEdit控件,设置objectName分别为Text与Text64;

3.拖动QPushButton控件,设置objectName分别为TextToBase64与Base64ToText;

2.文字转Base64

1.获取输入框Text中的数据

2.判断是否为空,为空直接返回

3.将text作为参数传递,并将返回的结果存储在名为resultQString变量中

4.将转换结果在Text64控件中显示

5.将传过来的text值进行文字转换成Base64值后返回

3.Base64转文字

1.获取输入框Text64中的数据

2.判断是否为空,为空直接返回

3.将text作为参数传递,并将返回的结果存储在名为resultQString变量中

4.将转换结果在Text控件中显示

5.将传过来的text值进行Base64转换成文字后返回

三.图片与Base64互转

1.ui设计

1拖动Label控件,分别输入图片,图片路径,Base64,Image;

2.拖动QLineEdit控件,设置objectName为Image64;

3.拖动QPushButton控件,设置objectName分别为SelectImage,ImageTo64Base,Clear,Base64ToImage;

2.选择图片与图片路径

1.选择一个符合指定格式(PNG、BMP或JPG)的图片文件。选择的文件路径将被存储在名为ImageNameQString变量中

2.如果选择的图片不为空,则将选择图片路径在ImagePath中显示

3.创建一个QPixmap对象,用于加载和显示图片

4.将图片缩放到与界面上的一个标签(假设名为Image)相同的大小,同时保持图片的纵横比不变。

3.图片转Base64

1.获取ImagePath中保存的图片路径

2.判断是否为空,为空直接返回

3.将image作为参数传递,并将返回的结果存储在名为text的QString变量中

4.将转换结果在Image64控件中显示

5.将传过来的image数据转换为Base64后返回

4.Base64转图片

1.获取Image64中保存的Base64数据

2.判断是否为空,为空直接返回

3.将data作为参数传递

4.将转换结果在Image控件中显示

5.将传过来的data数据转换后返回

四.清空设置

将所有控件中的值全部清空

五.效果

六.代码

base64convert.h

#ifndef BASE64CONVERT_H
#define BASE64CONVERT_H

#include <QWidget>
#include <QFileDialog>
#include "base64.h"

namespace Ui {
class Base64Convert;
}

class Base64Convert : public QWidget
{
    Q_OBJECT

public:
    explicit Base64Convert(QWidget *parent = 0);
    ~Base64Convert();

private slots:
    void on_TextToBase64_clicked();

    void on_Base64ToText_clicked();

    void on_SelectImage_clicked();

    void on_ImageTo64Base_clicked();

    void on_Base64ToImage_clicked();

    void on_Clear_clicked();

private:
    Ui::Base64Convert *ui;
};

#endif // BASE64CONVERT_H

base64convert.cpp

#include "base64convert.h"
#include "ui_base64convert.h"
#include <QImage>
#include <QThread>
#include "mythread.h"

Base64Convert::Base64Convert(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Base64Convert)
{
    ui->setupUi(this);
}

Base64Convert::~Base64Convert()
{
    delete ui;
}

void Base64Convert::on_TextToBase64_clicked()
{
    QString text = ui->Text->text().trimmed();
    if(text.isEmpty()){
        return;
    }
    QString result = base64::TextTo64(text);
    ui->Text64->setText(result);
}

void Base64Convert::on_Base64ToText_clicked()
{
    QString text = ui->Text64->text().trimmed();
    if(text.isEmpty()){
        return;
    }
    QString result = base64::Base64ToText(text);
    ui->Text->setText(result);
}

void Base64Convert::on_SelectImage_clicked()
{
    QString ImageName = QFileDialog::getOpenFileName(this, "选择文件", "", "图片(*.png *.bmp *.jpg)");
    if(!ImageName.isEmpty()){
        ui->ImagePath->setText(ImageName);
        QPixmap pix(ImageName);
        pix = pix.scaled(ui->Image->size() , Qt::KeepAspectRatio);\
        ui->Image->setPixmap(pix);
    }
}

void Base64Convert::on_ImageTo64Base_clicked()
{
    QString ImageName = ui->ImagePath->text().trimmed();
    if(ImageName.isEmpty()){
        return;
    }
    QImage image(ImageName);

    QString text = base64::ImageToBase64(image);

    ui->Image64->setText(text);
}

void Base64Convert::on_Base64ToImage_clicked()
{
    QString ImageName = ui->ImagePath->text().trimmed();
    QString data = ui->Image64->toPlainText().trimmed();
    if(data.isEmpty()){
        return;
    }
    QImage image = base64::TransferBase64(data);
    QPixmap pix = QPixmap::fromImage(image);
    pix = pix.scaled(ui->Image->size() , Qt::KeepAspectRatio);
    ui->Image->setPixmap(pix);
}

void Base64Convert::on_Clear_clicked()
{
    ui->Text->clear();
    ui->Text64->clear();
    ui->Image->clear();
    ui->Image64->clear();
    ui->ImagePath->clear();
}

base64.h

#ifndef BASE64_H
#define BASE64_H

#include <QObject>
#include <QImage>

class base64
{
public:
    base64();

  static  QString TextTo64(const QString &text);
  static  QString Base64ToText(const QString &text);

  static QString TransferImage(const QImage &image);
  static QByteArray ImageToBase64(const QImage &image);

  static QImage TransferBase64(const QString &data);

  static QImage Base64ToImage(const QByteArray &data);


};

#endif // BASE64_H

base64.cpp

#include "base64.h"
#include <QByteArray>
#include <QBuffer>
#include <QDebug>
base64::base64()
{

}

QString base64::TextTo64(const QString &text)
{
    return QString(text.toUtf8().toBase64());
}

QString base64::Base64ToText(const QString &text)
{
  return QString(QByteArray::fromBase64(text.toUtf8()));
}

QString base64::TransferImage(const QImage &image)
{
    return QString(ImageToBase64(image));
}

QByteArray base64::ImageToBase64(const QImage &image)
{
    QByteArray data;
    QBuffer buffer(&data);
    image.save(&buffer, "JPG");
    data = data.toBase64();
    return data;
}

QImage base64::TransferBase64(const QString &data)
{
    return Base64ToImage(data.toUtf8());
}

QImage base64::Base64ToImage(const QByteArray &data)
{
    QImage image;
    image.loadFromData(QByteArray::fromBase64(data));
    return image;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二十三篇:网络拥塞了,TCP/IP如何解决的?

一.显示拥塞通知 当发生网络拥塞时&#xff0c;发送主机应该减少数据包的发送量。作为IP上层协议&#xff0c;TCP虽然也能控制网络拥塞&#xff0c;不过它是通过数据包的实际损坏情况来判断是否发生拥塞。然而这种方法不能在数据包损坏之前减少数据包的发送量。 为了解决这个…

linux下使用mpi求自然数和

搭建MPI并行计算环境&#xff0c;编写 MPI程序&#xff0c;求和 1 23....1 0000。 要求: 1.使用100个进程; 2.进程0计算1 2...100, 进程1计算101 102... 200, ..... 进程99计算9901 9902... 10000; 3.调用计时函数,分别输出每个进程的计算时间; 4.需使用MPI集群通信函数和同…

三、ElementPlus下拉搜索加弹窗组件的封装

近期产品提出了一个需求&#xff0c;要求一个form的表单里面的一个组件既可以下拉模糊搜索&#xff0c;又可以弹窗搜索&#xff0c;我就为这个封装了一个组件&#xff0c;下面看效果图。 效果大家看到了&#xff0c;下面就看组件封装和实现方法 第一步&#xff0c;组件封装&…

第1章 开发板功能及使用介绍

1.开发板功能及使用介绍 本章主要内容 1.开发板功能介绍 2.开发板使用方法 介绍 STM32介绍 本章主要内容&#xff1a; 1.什么是STM32 2.STM32与ARM的关系 3.STM32F407ZGT6介绍 4.STM32能做什么 1.什么是STM32 从字面意义来看&#xff1a; ST&#xff1a;意法半导体&#xf…

HarmonyOS NEXT 应用开发实战(三、ArkUI页面底部导航TabBar的实现)

在开发HarmonyOS NEXT应用时&#xff0c;TabBar是用户界面设计中不可或缺的一部分。本文将通过代码示例&#xff0c;带领大家一同实现一个常用的TabBar&#xff0c;涵盖三个主要的内容页&#xff1a;首页、知乎日报和我的页面。以模仿知乎日报的项目为背景驱动&#xff0c;设定…

【Spring AI】Java实现类似langchain的第三方函数调用_原理与详细示例

Spring AI 介绍 &#xff1a;简化Java AI开发的统一接口解决方案 在过去&#xff0c;使用Java开发AI应用时面临的主要困境是没有统一且标准的封装库&#xff0c;导致开发者需要针对不同的AI服务提供商分别学习和对接各自的API&#xff0c;这增加了开发难度与迁移成本。而Sprin…

Android常用界面控件——ProgressBar

ProgressBar 目录 ProgressBar 在XML中定义ProgressBar ProgressBar风格样式 ProgressBar常用XML属性 在Java代码中控制ProgressBar 实例 什么是ProgressBar&#xff1f; ProgressBar是Android中的一个视图控件&#xff0c;主要用于表示一个任务的进度情况&#xff0c;…

针对Ubuntu20.04 中的 Docker 配置可用镜像源(包含国内可用镜像源)

文章目录 写在前面一、Docker 官方源二、更换Docker 国内可用镜像源 &#xff08;推荐使用&#xff09;参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0c;docker-27.3.1 一、Docker 官方源 打开 /etc/docker/daemon.json文件&#xff1a; sudo gedit …

Python快速编程小案例--逢7拍手小游戏

提示&#xff1a;&#xff08;个人学习&#xff09;&#xff0c;案例来自工业和信息化“十三五”人才培养规划教材&#xff0c;《Python快速编程入门》第2版&#xff0c;黑马程序员◎编著 逢7拍手游戏的规则是&#xff1a;从1开始顺序数数&#xff0c;数到有7或者包含7的倍数的…

查缺补漏----时间复杂度

1.如果每一次循环变量都是&#xff0c;那么直接将每一层变量的最大遍历次数相乘 第一个代码段&#xff1a;O&#xff08;n^3&#xff09; 第二个代码段&#xff1a;O&#xff08;n*i*j&#xff09;,由于 i 的范围0~n-1&#xff0c;所以取n&#xff0c;j 同理&#xff0c;所以最…

Java | Leetcode Java题解之第473题火柴拼正方形

题目&#xff1a; 题解&#xff1a; class Solution {public boolean makesquare(int[] matchsticks) {int totalLen Arrays.stream(matchsticks).sum();if (totalLen % 4 ! 0) {return false;}int len totalLen / 4, n matchsticks.length;int[] dp new int[1 << n…

【hot100-java】从前序与中序遍历序列构造二叉树

二叉树篇 首先创建一个映射来存储中序遍历中值与索引的关系&#xff0c;然后通过递归调用函数dfs来构建二叉树。函数dfs接受前序遍历和中序遍历的左右边界索引以及前序遍历和中序遍历的列表和映射作为参数&#xff0c;在每次递归中&#xff0c;先判断边界条件&#xff0c;如果左…

部署 Open WebUI

1. 安装docker 2.启动Hyper-v 3.下载 安装 WSL 4. 打开 DeskDocker 5. 打开 运行 ollama 参考 Windows 部署 ollama-CSDN博客 6. 部署 运行 open webui docker docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data -…

Flutter Transform 学习

Transform可以在其子组件绘制时对其应用一些矩阵变换来实现一些特效,允许在渲染子部件之前对它们进行变换。 一、Transform构造函数与属性 class Transform extends SingleChildRenderObjectWidget {/// Creates a widget that transforms its child.const Transform({super.k…

C语言 | 第十六章 | 共用体 家庭收支软件-1

P 151 结构体定义三种形式 2023/3/15 一、创建结构体和结构体变量 方式1-先定义结构体&#xff0c;然后再创建结构体变量。 struct Stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩 }; struct Stu stu1, stu2; //…

InternVL2-40B 荣登开源模型榜首丨SuperCLUE中文多模态大模型基准10月榜单

在今年 7 月 4 日举行的 2024 WAIC 科学前沿主论坛上&#xff0c;书生万象多模态大模型&#xff08;InternVL 2.0&#xff09;正式发布&#xff0c;并陆续开源了 1B、2B、4B、8B、26B、40B 以及 76B 共 7 个参数版本的模型。书生万象支持图像、视频、文字、语音、三维点云等模态…

Qt媒体播放器实现

本文介绍Qt媒体播放器实现。 Qt应用程序有时会涉及到视频文件的播放&#xff0c;Qt提供了QVideoWidget类实现视频和音频的播放&#xff0c;本文基于QVideoWidget类实现一个简单的媒体播放器。 1.自定义类&#xff08;基于QVideoWidget类&#xff09; 由于Qt并未提供专门的控…

手写简易shell

我们如果要写一个简易的shell我们要&#xff0c;其实我们搞一个程序替换就行了。 我们分为五部完成 在其中我们最难搞的就是环境变量的更新&#xff0c;因为当我们搞一个子程序出来时&#xff0c;我们子进程的环境变量表是从父进程继承下来的&#xff0c;当我们用cd命令时只会更…

C# 屏幕录制工具

屏幕录制工具 开发语音&#xff1a;C# vb.net 下载地址&#xff1a;https://download.csdn.net/download/polloo2012/89879996 功能&#xff1a;屏幕录制&#xff0c;声卡采集&#xff0c;麦克风采集。 屏幕录制&#xff1a;录制屏幕所有操作&#xff0c;并转换视频格式&…

电脑无线网wifi和有线网同时使用(内网+外网同时使用)

一、要求 我这里以无线网wifi为外网&#xff0c;有线网卡为内网为例&#xff1a; 一、基本信息 无线wifi&#xff08;外网&#xff09;&#xff1a;ip是192.168.179.235&#xff0c;网关是192.168.179.95有线网&#xff08;内网&#xff09;&#xff1a;ip是192.168.10.25&…