共享内存QShareBuffer
以共享一个图片为例
头文件添加QShareMemory memory;
图片加载到共享内存
先申请一个缓冲区,将图片加载到缓冲区,利用memcpy将缓冲区的内容copy到共享内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| void MainWindow::addimageSlot() { if(memory.isAttached()) { memory.detach(); } QString openFileName = QFileDialog::getOpenFileName(this,"打开文件",QDir::currentPath(),"文件(*.jpg *.png *.bmp)"); QImage image; if (!image.load(openFileName)) { ui->imageLabel->setText("Selected file is not an image, please select another."); return; } ui->imageLabel->setPixmap(QPixmap::fromImage(image)); QBuffer buffer; buffer.open(QBuffer::ReadWrite); QDataStream out(&buffer); out<<image; int size = buffer.size(); if (!memory.create(size)) { ui->imageLabel->setText("不能创造共享内存!"); return ; } memory.lock(); char *to = (char*)memory.data(); const char *from = buffer.data().data(); memcpy(to,from,qMin(memory.size(),size)); memory.unlock(); }
|
从共享内存读取图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void MainWindow::getMemorySlot() { if(!memory.attach()) { ui->imageLabel->setText("无共享内存,请先加载一个图片"); return; } QBuffer buffer; QDataStream in(&buffer); QImage image; memory.lock(); buffer.setData((char*)memory.constData(),memory.size()); buffer.open(QBuffer::ReadOnly); in>>image; memory.unlock(); memory.detach(); ui->imageLabel->setPixmap(QPixmap::fromImage(image)); }
|
剪贴板QClipboard
剪贴板也算一种进程通信的方式
1 2
| QClipboard *clipboard = QApplication::clipboard(); clipboard->setPixmap(this->Pixmap);//把图片加到剪贴板
|
1 2 3
| QClipboard *preclipboard = QApplication::clipboard(); QSize pixmapSize = preclipboard->pixmap().size()*0.8;//将图片原尺寸8/10缩放 ui->previewLabel->setPixmap(preclipboard->pixmap().scaled(pixmapSize));
|
QPixmap与QImage
QPixmap依赖于硬件,QImage不依赖于硬件。
QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的。
当图片小的情况下,直接用QPixmap进行加载,画图时无所谓,
当图片大的时候如果直接用QPixmap进行加载,会占很大的内存,一般一张几十K的图片,用QPixmap加载进来会放大很多倍,
所以一般图片大的情况下,用QImage进行加载,然后转乘QPixmap用户绘制。QPixmap绘制效果是最好的。
同时QPimap主要用于加速显示,QImag主要是图像处理
上一篇:OpenCV之RNG随机数生成器
下一篇:QtCreator快捷键