郑州疫情严重程度/适合seo的网站
1.使用QImage 和 QDebug进行像素操作非常耗费时间,尤其是QDebug
//对像素进行操作(操作过程中可能会因为内存数据变化导致失败)//使用QImage进行像素操作,非常耗费时间导致队列中的数据不能及时删除,一直与程序卡死
// QPixmap pix0= QPixmap::fromImage(image24);
// QImage image2=pix0.toImage();// std::vector<int> rgbPt;
// for(int y=0;y<image2.height();y++)
// {
// QRgb *line=(QRgb*)image2.scanLine(y);
// for(int x=0;x<image2.width();x++)
// //for(int x=0;x<1;x++)
// {
// rgbPt.push_back(qRed(line[x]));
// rgbPt.push_back(qGreen(line[x]));
// rgbPt.push_back(qRed(line[x]));
// qDebug()<<QString::number(rgbPt.size());
// }
// }
// qDebug()<<QString::number(rgbPt.size());
2.注意指针的指针的赋值操作,和数值类型的正确使用,unsigned char的最大值是255
//为什么不可以//QImage image24=QImage( pDlg->m_pBuffer[0],imgWidth,imgHeight,QImage::Format_Indexed8);//为什么不可以,因为unsigned char类型的数值最大是255;//QImage image24=QImage(imgWidth,imgHeight,QImage::Format_RGB888);//转化为RGB图像
// for(unsigned char i=0;i<imgWidth;i++)
// {
// for(unsigned char j=0;j<imgHeight;j++)
// {
// int r=(int)(*(pDlg->m_pBuffer0+j*imgWidth+i));
// int g=(int)(*(pDlg->m_pBuffer0+offSet+j*imgWidth+i));
// int b=(int)(*(pDlg->m_pBuffer0+2*offSet+j*imgWidth+i));
// qDebug()<<QString::number(r);
// //image24.setPixel(QPoint(i,j),qRgb(r,g,b));// }// }
3.图像缓冲区进行单个像素的内存拷贝
第一种方法:
pDlg->m_pBuffer0 = new unsigned char[blockSize*imgPixSize];if (pDlg->m_pBuffer0 == NULL){qDebug()<<QString::fromLocal8Bit("分配内存空间不成功!");return ;}unsigned char** ptrAdress = (unsigned char**)ptrImgBuffer;for(long long i=0;i<imgHeight;i++){for(long long j=0;j<imgWidth;j++){memcpy( pDlg->m_pBuffer0 + (i * imgWidth + j) * 3, ptrAdress[1] + i * imgWidth + j, 1);memcpy( pDlg->m_pBuffer0 + (i * imgWidth + j) * 3 + 1, ptrAdress[2] + i * imgWidth + j, 1);memcpy( pDlg->m_pBuffer0 + (i * imgWidth + j) * 3 + 2, ptrAdress[3] + i * imgWidth + j, 1);}}
第二种方法
memcpy( pDlg->m_pBuffer0, ptrAdress[1], imgWidth * imgHeight);memcpy( pDlg->m_pBuffer0 + offSet, ptrAdress[2], imgWidth * imgHeight);memcpy( pDlg->m_pBuffer0 + offSet * 2, ptrAdress[3], imgWidth * imgHeight);unsigned char * ptrBuffer=new unsigned char[blockSize*imgPixSize];for(long long i=0;i<blockSize*imgPixSize;i++){if(i<blockSize){memcpy( ptrBuffer+i*3, pDlg->m_pBuffer0+i, 1);}else if(i>=blockSize && i<2*blockSize){memcpy( ptrBuffer+(i-blockSize)*3+1, pDlg->m_pBuffer0+i, 1);}else if(i>=2*blockSize && i<3*blockSize){memcpy( ptrBuffer+(i-2*blockSize)*3+2, pDlg->m_pBuffer0+i, 1);}//qDebug()<<QString::number(i);}QImage image24=QImage( ptrBuffer,imgWidth,imgHeight,QImage::Format_RGB888);pDlg->pixmapQueqe.enqueue(QPixmap::fromImage(image24));//存入缓冲队列if (ptrBuffer != NULL){delete[]ptrBuffer;ptrBuffer = NULL;}
4.使用指针传递时,一定要注意指针的作用域和时效,指向局部变量的指针地址会自动释放,导致地址传递不成功
//QImage image;//局部变量,地址指针会释放//m_imageprocessthread->m_origin=ℑ//作用域结束后,指针被释放,导致地址传递不成功m_image=new QImage();m_image->load("images/a.bmp");ui->lbl_originImg->setPixmap(QPixmap::fromImage(*m_image).scaled(ui->lbl_originImg->size()));//传入图像m_imageprocessthread->m_origin=m_image;
5.在局部函数中New的空间需要释放,不能指向局部变量的指针
QImage * CImgProcess::cool(int delta, QImage * origin){QImage *newImage = new QImage(origin->width(), origin->height(), QImage::Format_ARGB32);//QImage Image (origin->width(), origin->height(), QImage::Format_RGB888);//return &Image //会出错的,函数运行完后指针会被释放;同理新New的空间是需要手动释放的QColor oldColor;int r,g,b;for(int x=0; x<newImage->width(); x++){for(int y=0; y<newImage->height(); y++){oldColor = QColor(origin->pixel(x,y));r = oldColor.red();g = oldColor.green();b = oldColor.blue()+delta;//we check if the new value is between 0 and 255b = qBound(0, b, 255);newImage->setPixel(x,y, qRgb(r,g,b));}}return newImage;
}