用Qt来进行256色位图的转换

来源:互联网 发布:防止sql注入最佳方法 编辑:程序博客网 时间:2024/06/09 16:05

接着上次的一篇文章关于“在一个图片上写字并保存”,上次说到


对于图片的格式虽然没有严格要求,但是在使用BMP的时候,由于QImage里不支持RGB565的格式,会导致setPen没有效果,不能写字,所以必须先转换成任意一种Qt可以支持的格式,然后再写,弄完后,如果需要保留256色,可以选择再转回带调色盘的Format_Indexed8就可以了.

但是上次这里有个问题,Indexed_8是带有调色盘的转换格式,当不带调色盘直接使用的时候会导致画面非常的差,因此此处的代码需要修改


第一步还是创建一个新的合成的图片


  1. void Widget::SaveImage()  
  2. {  
  3.     QImage image = QPixmap(fileName).toImage();//绝对路径  
  4.     //以你原来的那张图片来  
  5.     //构造一个image  
  6.   
  7.     QPainter painter(&image); //为这个QImage构造一个QPainter  
  8.     painter.setCompositionMode(QPainter::CompositionMode_SourceIn);  
  9.     //设置画刷的组合模式CompositionMode_SourceOut这个模式为目标图像在上。  
  10.   
  11.     //改变画笔和字体  
  12.     QPen pen = painter.pen();  
  13.     pen.setColor(Qt::white);  
  14.     QFont font = painter.font();  
  15.     font.setBold(true);//加粗  
  16.     font.setPixelSize(18);//改变字体大小  
  17.   
  18.     painter.setPen(pen);  
  19.     painter.setFont(font);  
  20.     painter.drawText(220,190,"XXXXXXXX");  
  21.     //将XXXX写在Image的220.190的位置  
  22.   
  23.     image.save("C:/X1.bmp",0);  
  24.     //将画好的图片保存起来。  
  25.     //可以将png改为其他格式  
  26.   
  27. }  


关键在于之后


void Widget::SaveImage(){    QImage image = QPixmap(fileName).toImage();//绝对路径    //以你原来的那张图片来    //构造一个image    QImage img = image.convertToFormat(QImage::Format_RGB888);     //先转成标准的RGB888或者别的可以支持的模式    QPainter painter(&img); //为这个QImage构造一个QPainter    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);    //设置画刷的组合模式CompositionMode_SourceOut这个模式为目标图像在上。    //改变画笔和字体    QPen pen = painter.pen();    pen.setColor(Qt::white);    QFont font = painter.font();    font.setBold(true);//加粗    font.setPixelSize(18);//改变字体大小    painter.setPen(pen);    painter.setFont(font);    painter.drawText(220,190,"XXXXXXXX");    //将Hello写在Image的中心    QImage Foto = img.convertToFormat(QImage::Format_Indexed8);  //再用8位指标转化成Colormap    Foto.save("C:/X1.bmp",0);    //将画好的图片保存起来。    //可以将png改为其他格式}

注意红色的这行,不能直接这样


在这里,我套用的是windows的256色的调色盘,头文件加入


    /*-----------windows 256色颜色索引表----------------------*/    unsigned char rgb_quad[1024] = {    0, 0, 0, 0, 0, 0, 128, 0, 0, 128, 0, 0, 0, 128, 128, 0,    128, 0, 0, 0, 128, 0, 128, 0, 128, 128, 0, 0, 192, 192, 192, 0,    192, 220, 192, 0, 240, 202, 166, 0, 0, 32, 64, 0, 0, 32, 96, 0,    0, 32, 128, 0, 0, 32, 160, 0, 0, 32, 192, 0, 0, 32, 224, 0,    0, 64, 0, 0, 0, 64, 32, 0, 0, 64, 64, 0, 0, 64, 96, 0,    0, 64, 128, 0, 0, 64, 160, 0, 0, 64, 192, 0, 0, 64, 224, 0,    0, 96, 0, 0, 0, 96, 32, 0, 0, 96, 64, 0, 0, 96, 96, 0,    0, 96, 128, 0, 0, 96, 160, 0, 0, 96, 192, 0, 0, 96, 224, 0,    0, 128, 0, 0, 0, 128, 32, 0, 0, 128, 64, 0, 0, 128, 96, 0,    0, 128, 128, 0, 0, 128, 160, 0, 0, 128, 192, 0, 0, 128, 224, 0,    0, 160, 0, 0, 0, 160, 32, 0, 0, 160, 64, 0, 0, 160, 96, 0,    0, 160, 128, 0, 0, 160, 160, 0, 0, 160, 192, 0, 0, 160, 224, 0,    0, 192, 0, 0, 0, 192, 32, 0, 0, 192, 64, 0, 0, 192, 96, 0,    0, 192, 128, 0, 0, 192, 160, 0, 0, 192, 192, 0, 0, 192, 224, 0,    0, 224, 0, 0, 0, 224, 32, 0, 0, 224, 64, 0, 0, 224, 96, 0,    0, 224, 128, 0, 0, 224, 160, 0, 0, 224, 192, 0, 0, 224, 224, 0,    64, 0, 0, 0, 64, 0, 32, 0, 64, 0, 64, 0, 64, 0, 96, 0,    64, 0, 128, 0, 64, 0, 160, 0, 64, 0, 192, 0, 64, 0, 224, 0,    64, 32, 0, 0, 64, 32, 32, 0, 64, 32, 64, 0, 64, 32, 96, 0,    64, 32, 128, 0, 64, 32, 160, 0, 64, 32, 192, 0, 64, 32, 224, 0,    64, 64, 0, 0, 64, 64, 32, 0, 64, 64, 64, 0, 64, 64, 96, 0,    64, 64, 128, 0, 64, 64, 160, 0, 64, 64, 192, 0, 64, 64, 224, 0,    64, 96, 0, 0, 64, 96, 32, 0, 64, 96, 64, 0, 64, 96, 96, 0,    64, 96, 128, 0, 64, 96, 160, 0, 64, 96, 192, 0, 64, 96, 224, 0,    64, 128, 0, 0, 64, 128, 32, 0, 64, 128, 64, 0, 64, 128, 96, 0,    64, 128, 128, 0, 64, 128, 160, 0, 64, 128, 192, 0, 64, 128, 224, 0,    64, 160, 0, 0, 64, 160, 32, 0, 64, 160, 64, 0, 64, 160, 96, 0,    64, 160, 128, 0, 64, 160, 160, 0, 64, 160, 192, 0, 64, 160, 224, 0,    64, 192, 0, 0, 64, 192, 32, 0, 64, 192, 64, 0, 64, 192, 96, 0,    64, 192, 128, 0, 64, 192, 160, 0, 64, 192, 192, 0, 64, 192, 224, 0,    64, 224, 0, 0, 64, 224, 32, 0, 64, 224, 64, 0, 64, 224, 96, 0,    64, 224, 128, 0, 64, 224, 160, 0, 64, 224, 192, 0, 64, 224, 224, 0,    128, 0, 0, 0, 128, 0, 32, 0, 128, 0, 64, 0, 128, 0, 96, 0,    128, 0, 128, 0, 128, 0, 160, 0, 128, 0, 192, 0, 128, 0, 224, 0,    128, 32, 0, 0, 128, 32, 32, 0, 128, 32, 64, 0, 128, 32, 96, 0,    128, 32, 128, 0, 128, 32, 160, 0, 128, 32, 192, 0, 128, 32, 224, 0,    128, 64, 0, 0, 128, 64, 32, 0, 128, 64, 64, 0, 128, 64, 96, 0,    128, 64, 128, 0, 128, 64, 160, 0, 128, 64, 192, 0, 128, 64, 224, 0,    128, 96, 0, 0, 128, 96, 32, 0, 128, 96, 64, 0, 128, 96, 96, 0,    128, 96, 128, 0, 128, 96, 160, 0, 128, 96, 192, 0, 128, 96, 224, 0,    128, 128, 0, 0, 128, 128, 32, 0, 128, 128, 64, 0, 128, 128, 96, 0,    128, 128, 128, 0, 128, 128, 160, 0, 128, 128, 192, 0, 128, 128, 224, 0,    128, 160, 0, 0, 128, 160, 32, 0, 128, 160, 64, 0, 128, 160, 96, 0,    128, 160, 128, 0, 128, 160, 160, 0, 128, 160, 192, 0, 128, 160, 224, 0,    128, 192, 0, 0, 128, 192, 32, 0, 128, 192, 64, 0, 128, 192, 96, 0,    128, 192, 128, 0, 128, 192, 160, 0, 128, 192, 192, 0, 128, 192, 224, 0,    128, 224, 0, 0, 128, 224, 32, 0, 128, 224, 64, 0, 128, 224, 96, 0,    128, 224, 128, 0, 128, 224, 160, 0, 128, 224, 192, 0, 128, 224, 224, 0,    192, 0, 0, 0, 192, 0, 32, 0, 192, 0, 64, 0, 192, 0, 96, 0,    192, 0, 128, 0, 192, 0, 160, 0, 192, 0, 192, 0, 192, 0, 224, 0,    192, 32, 0, 0, 192, 32, 32, 0, 192, 32, 64, 0, 192, 32, 96, 0,    192, 32, 128, 0, 192, 32, 160, 0, 192, 32, 192, 0, 192, 32, 224, 0,    192, 64, 0, 0, 192, 64, 32, 0, 192, 64, 64, 0, 192, 64, 96, 0,    192, 64, 128, 0, 192, 64, 160, 0, 192, 64, 192, 0, 192, 64, 224, 0,    192, 96, 0, 0, 192, 96, 32, 0, 192, 96, 64, 0, 192, 96, 96, 0,    192, 96, 128, 0, 192, 96, 160, 0, 192, 96, 192, 0, 192, 96, 224, 0,    192, 128, 0, 0, 192, 128, 32, 0, 192, 128, 64, 0, 192, 128, 96, 0,    192, 128, 128, 0, 192, 128, 160, 0, 192, 128, 192, 0, 192, 128, 224, 0,    192, 160, 0, 0, 192, 160, 32, 0, 192, 160, 64, 0, 192, 160, 96, 0,    192, 160, 128, 0, 192, 160, 160, 0, 192, 160, 192, 0, 192, 160, 224, 0,    192, 192, 0, 0, 192, 192, 32, 0, 192, 192, 64, 0, 192, 192, 96, 0,    192, 192, 128, 0, 192, 192, 160, 0, 240, 251, 255, 0, 164, 160, 160, 0,    128, 128, 128, 0, 0, 0, 255, 0, 0, 255, 0, 0, 0, 255, 255, 0,    255, 0, 0, 0, 255, 0, 255, 0, 255, 255, 0, 0, 255, 255, 255, 0    };

然后此处代码改成


    QVector<QRgb> colorTable;    for (int i = 0; i < 256; i++){        colorTable.push_back(qRgb(rgb_quad[i * 4], rgb_quad[i * 4 + 1],  rgb_quad[i * 4 + 2]));    }    image_End.setColorTable(colorTable);    QImage Foto = img.convertToFormat(QImage::Format_Indexed8, colorTable, Qt::AutoColor);


如果此处需要的是8位的灰度图,则是不需要头文件的调色板,此处直接改为


QVector<QRgb> grayTable;  for(int i = 0; i < 256; i++)   graytable.push_back(qRgb(i,i,i));  qi->setColorTable(grayTable);  
QImage Foto = img.convertToFormat(QImage::Format_Indexed8, colorTable, Qt::AutoColor);


这样就可以了


另外转载一篇关于灰度的贴,因为有的研究表明上面的文章说的方法不是很好。需要的请看下面一篇博文



0 0