Qt中使用什么类把真彩色变成黑白两色?

Mymakekuhu 2014-04-03 05:54:01
在Qt中用什么类来处理图片让其真彩色变成黑白色,或能让黑白色变成真彩色!
得到答案立即结贴!
...全文
414 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mymakekuhu 2014-04-03
  • 打赏
  • 举报
回复
谢谢 , 解决了!
Mymakekuhu 2014-04-03
  • 打赏
  • 举报
回复
我试试,我以为Qt会有专门类来处理,看来有点麻烦!
青松2 2014-04-03
  • 打赏
  • 举报
回复
真彩色可以灰度化变成黑白图像,黑白图像要变成彩色就不得要领了。。。
青松2 2014-04-03
  • 打赏
  • 举报
回复
[转载]qt编程图像灰度化改进与详细注释 (2012-08-03 22:53:27)转载▼ 标签: 转载 原文地址:qt编程图像灰度化改进与详细注释作者:930154711 最近在使用qt研究图像处理,第一步必然是最基础的图像灰度化,由于初学qt,对qt图像处理这一块一点头绪也没有,此时只好百度!网络上有人介绍了,qt提供四种图像类型:QImage, QPixmap, QPicture, QBitmap, 根据qt 文档对这四种类型的解释,发现QImage正是我需要的类型,可以很方便地读取图像的像素信息。 接着继续百度qt如何灰度化图像,找到的代码有两种: 一种是使用color table的方法: #include<QApplication> 02 #include<QLabel> 03 #include<QDebug> 04 05 const QString rgbFile("special.jpg"); 06 const QString grayFile("gray.jpg"); 07 08 static bool convertToGray(); 09 10 int main(int argc,char *argv[]) 11 { 12 QApplication app(argc,argv); 13 QLabel rgbLabel,grayLabel; 14 15 if(!convertToGray()){ 16 return 1; 17 } 18 19 rgbLabel.setPixmap(QPixmap(rgbFile)); 20 grayLabel.setPixmap(QPixmap(grayFile)); 21 rgbLabel.show(); 22 grayLabel.show(); 23 return app.exec(); 24 } 25 26 //转为灰度图 27 static bool convertToGray() 28 { 29 QImage rgbImage(rgbFile); 30 QSize size=rgbImage.size(); 31 QImage grayImage(size,QImage::Format_Indexed8); 32 int width=size.width(); 33 int height=size.height(); 34 uchar * rgbImageData=rgbImage.bits(); 35 uchar * grayImageData=grayImage.bits(); 36 37 if(rgbImage.isGrayscale()){ 38 qDebug()<<"Image is already gray!Conversion stopped!"; 39 return false; 40 } 41 42 //若width不是4的倍数,会自动添加字节,使之对齐到4的倍数 43 int realWidth1=rgbImage.bytesPerLine(); 44 int realWidth2=grayImage.bytesPerLine(); 45 uchar * backup1=rgbImageData; 46 uchar * backup2=grayImageData; 47 //直接取用green绿色分量值作为gray索引值 48 for(int i=0;i<height; 49 i++, 50 rgbImageData=backup1+realWidth1*i, 51 grayImageData=backup2+realWidth2*i){ 52 for(int j=0;j<width;j++){ 53 *grayImageData=*(rgbImageData+1); 54 rgbImageData+=4; 55 grayImageData++; 56 } 57 } 58 59 QVector<QRgb> grayColorTable; 60 uint rgb=0; 61 for(int i=0;i<256;i++){ 62 grayColorTable.append(rgb); 63 rgb+=0x00010101;//r,g,b值分别加1,a值不变,见QRgb说明 64 } 65 66 grayImage.setColorTable(grayColorTable); 67 grayImage.save(grayFile); 68 return true; 69 } 主要看static bool convertToGray() 方法的处理,很多人看不懂 52 for(int j=0;j<width;j++){ 53 *grayImageData=*(rgbImageData+1); 54 rgbImageData+=4; 55 grayImageData++; 56 } 的意思,其实这里的灰度化并没有用到常用的灰度化公式 0.30R+0.59G+0.11B 而是简单地把,绿色通道的值取出来作为灰度值,因为图像内颜色存储顺序是BGRA,所以rgbImageData+1获得的就是G通道的值,理解这个之后就很容更改成标准的灰度化公式了,至于上面其他的代码还有不懂的,可以看下面我改进后的代码的注释: QImage rgbImage("C:\Documents and Settings\Administrator\test.jpg");//通过文件路径读取图片 QSize size=rgbImage.size();//获得图像小 QImage grayImage(size,QImage::Format_Indexed8);//创建同样大小深度为8(即每个像素占8位)的空白图 int width=size.width(); int height=size.height(); uchar * rgbImageData=rgbImage.bits();//获得图像像素的首地址,因为存储顺序是BGRA,所以首地址指向B uchar * grayImageData=grayImage.bits(); //若width不是4的倍数,会自动添加字节,使之对齐到4的倍数 int realWidth1=rgbImage.bytesPerLine();//一行有多少个byte int realWidth2=grayImage.bytesPerLine(); uchar * backup1=rgbImageData; uchar * backup2=grayImageData; for(int i=0;i<height; i++, rgbImageData=backup1+realWidth1*i, grayImageData=backup2+realWidth2*i){ for(int j=0;j<width;j++){ uchar r = (*(rgbImageData+2))*0.3; uchar g = (*(rgbImageData+1))*0.59; uchar b = (*rgbImageData)*0.11;//使用标准灰度化公式 *grayImageData=r + g + b; rgbImageData+=4;//跳到下一个B,以为BGRA,原图是4个uchar作为一个像素 grayImageData++; //因为灰色本身rgb值就必须相等,这里只用1个uchar存储颜色作为一个像素,所以需要用到color table //因此这里存的1个uchar只是color table的索引值,通过这个uchar在color table中找到真正的颜色 } } //要注意color table用qvector实现,是一个顺序的连续的链表,里面存的是qrgb,qrgb的颜色顺序是0xAARRGGBB //灰度图的color table 很简单,就是从第一个是0x00000000,开始,到下一个0x00010101,不断加1,加到00ffffff QVector<QRgb> grayColorTable; uint rgb=0; for(int i=0;i<256;i++){ grayColorTable.append(rgb); rgb+=0x00010101;//r,g,b值分别加1,a值不变,见QRgb说明 } grayImage.setColorTable(grayColorTable); grayImage.save("grayhahaR.jpg"); grayImage.load("grayhahaR.jpg"); //可能是因为灰度图使用了colortable的原因,直接调用fromImage方法转成qpixmap会显示不出来, //只能先把灰度图保存,再重新load一遍,才能在qlabel中显示 ui->picLabel->setPixmap(QPixmap::fromImage(grayImage)); 另一种方法是直接取出图像里的每个像素,使用qt自带的单个像素灰度方法qGray(),这个方法思想很简单不多加解释,就是使用的空间比color table的方法大很多,至于选择哪一种,自己决定,下面贴出网上的源代码: void Picture::paintEvent(QPaintEvent*){ QImage image; image = QImage("airplane.jpg").scaled(200,200); int w,h; w = image.width(); h = image.height(); QImage iGray(w,h,QImage::Format_RGB32);for(int i=0;i<200;i++){ for(int j=0;j<200;j++){ QRgb pixel = image.pixel(i,j); int gray = qGray(pixel); QRgb grayPixel = qRgb(gray,gray,gray); iGray.setPixel(i,j,grayPixel); } } QPainter painter(this); painter.drawImage(0,0,image); painter.drawImage(200,0,iGray); } 不知道为啥,最后这段代码copy下来发布后,代码变的各种乱,还是贴出源地址吧:http://www.cnblogs.com/xianglan/archive/2010/12/24/1915905.html

16,175

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧