一,将图片在pc上解析,然后将解析文件放到qrc文件中,读取qrc文件。
1,将图片解析后的二进制文件保存,源码如下,
下载地址:https://files.cnblogs.com/files/senior-engineer/imageTest.rar
main.cpp
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void saveImageToFile(); void refreshImage(); private: Ui::Widget *ui; private: QString m_fileName; int m_imgWidth; int m_imgHeight; }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QImage> #include <QFile> #include <QDebug> #include <QResource> #define IMAG_BIT 3 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //m_fileName = "radio_but_eq_p.png"; m_fileName = "bg.png"; ui->imageName->setText(m_fileName); // QResource resource; // resource.setFileName(":/main_bg.png"); // const uchar* imageData = resource.data(); // QImage desImage = QImage(imageData, 800,480,QImage::Format_RGB32); //RGB32 // QPixmap pixmag; // pixmag = QPixmap::fromImage(desImage); // ui->oldImage->setPixmap(pixmag); QPixmap pixmap(":/main_bg.png"); ui->oldImage->setPixmap(pixmap); // QPixmap pixmag; // pixmag.load(m_fileName); // ui->oldImage->setPixmap(pixmag); connect(ui->start, SIGNAL(clicked(bool)), this, SLOT(saveImageToFile())); connect(ui->refresh, SIGNAL(clicked(bool)), this, SLOT(refreshImage())); } Widget::~Widget() { delete ui; } void Widget::saveImageToFile() { QImage image(m_fileName); // QImage image = QImage(800,480,QImage::Format_RGB888); //RGB32 // image.load(m_fileName); int size = image.byteCount(); int sizePerLine = image.bytesPerLine(); int line = size / sizePerLine; m_imgWidth = image.width(); m_imgHeight = image.height(); qDebug() << "size:" <<size; qDebug() << "sizePerLine:" << sizePerLine; qDebug() << "line:" << line; qDebug() << "" << m_imgWidth; uchar* imgDataNew = image.bits(); FILE *pf = fopen("newfile.png", "wb"); if(pf == NULL) return; QFile file; file.open(pf, QIODevice::WriteOnly); //1 for(int i = 0; i < line; i++) { uchar* lineData = image.scanLine(i); for(int j = 0; j < sizePerLine; j++) { file.write((char*)(lineData + j),1); } } file.close(); // QImage desImage = QImage(m_imgWidth,m_imgHeight,QImage::Format_RGB32); //RGB32 // //RGB分量值 // int b = 0; // int g = 0; // int r = 0; // int a = 0; // //设置像素 // for (int i=0;i < m_imgHeight;i++) // { // for (int j=0; j < m_imgWidth * 4;) // { // b = (int)*(imgDataNew + i * m_imgWidth * 4 + j); // g = (int)*(imgDataNew + i * m_imgWidth * 4 + j + 1); // r = (int)*(imgDataNew + i * m_imgWidth * 4 + j + 2); // a = (int)*(imgDataNew + i * m_imgWidth * 4 + j + 3); // desImage.setPixel(j / 4,i,qRgba(r,g,b,a)); // j = j + 4; // //desImage.setPixel(j,i,qRgb(r,g,b)); // } // } // QPixmap pixmag; // pixmag = QPixmap::fromImage(desImage); // ui->newImage->setPixmap(pixmag); } void Widget::refreshImage() { QFile file(":/newfile.png"); //if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) if (!file.open(QIODevice::ReadOnly)) return; QByteArray array = file.readAll(); //file.close(); char* imgDataNew = array.data(); QImage desImage = QImage(m_imgWidth,m_imgHeight,QImage::Format_RGB32); //RGB32 //RGB分量值 int b = 0; int g = 0; int r = 0; int a = 0; //设置像素 for (int i=0;i < m_imgHeight;i++) { for (int j=0; j < m_imgWidth * 4;) { b = (int)*(imgDataNew + i * m_imgWidth * 4 + j); g = (int)*(imgDataNew + i * m_imgWidth * 4 + j + 1); r = (int)*(imgDataNew + i * m_imgWidth * 4 + j + 2); a = (int)*(imgDataNew + i * m_imgWidth * 4 + j + 3); desImage.setPixel(j / 4,i,qRgba(r,g,b,a)); j = j + 4; //desImage.setPixel(j,i,qRgb(r,g,b)); } } QPixmap pixmag; pixmag = QPixmap::fromImage(desImage); ui->newImage->setPixmap(pixmag); // QImage desImage ; // if(IMAG_BIT == 3) // desImage = QImage(m_imgWidth,m_imgHeight,QImage::Format_RGB888); //RGB24 // else if(IMAG_BIT == 4) // desImage = QImage(m_imgWidth,m_imgHeight,QImage::Format_RGB32); //RGB32 // //RGB分量值 // char b = 0; // char g = 0; // char r = 0; // char a = 0; // //设置像素 // for (int i=0;i < m_imgHeight;i++) // { // for (int j=0; j < m_imgWidth * IMAG_BIT;) // { // b = (int)*(imgDataNew + i * m_imgWidth * IMAG_BIT + j); // g = (int)*(imgDataNew + i * m_imgWidth * IMAG_BIT + j + 1); // r = (int)*(imgDataNew + i * m_imgWidth * IMAG_BIT + j + 2); // if(IMAG_BIT == 4) // { // a = (int)*(imgDataNew + i * m_imgWidth * IMAG_BIT + j + 3); // desImage.setPixel(j / IMAG_BIT,i,qRgba(r,g,b,a)); // } // else if(IMAG_BIT == 3) // { // desImage.setPixel(j / IMAG_BIT, i, qRgb(r,g,b)); // } // j = j + IMAG_BIT; // } // } // QPixmap pixmag; // pixmag = QPixmap::fromImage(desImage); // ui->newImage->setPixmap(pixmag); }
二,此方法已经试过了,但是open文件时候很耗时,大概200~300ms
(!file.open(QIODevice::ReadOnly))
二,直接加图片放到qrc文件中,读取qrc文件
一,qrc文件中添加图片资源
二,再.pro文件中添加qrc文件
例如: RESOURCES = res.qrc
三,在程序中使用图片文件时候,通过“:文件名”
例如:image=new QImage(":1.png");
四,此方法原理对应qt官方文档地址:http://doc.qt.io/qt-5/resources.html
三,将图片转换为数组,然后将图片画到界面上(适用绘制字体)
一,用下面工具将图片转换为数组
https://files.cnblogs.com/files/senior-engineer/fileToC.rar
二,更具对应数每个bit对应的是1或者是0绘制黑白