如果新图像中的原始像素为黑色,则Qt绘制蓝色像素

时间:2012-02-16 13:01:54

标签: c++ qt

我写了一些应该制作新图像的代码。我的背景图像有黑色区域,当for循环出现在黑色像素上时,它应该在新图像中绘制蓝色图像,否则它应该只绘制原始像素。以为我可以这样做,但程序一直在运行。

   QApplication a(argc, argv);
int c, m, y, k, al;
QColor color;
QColor drawColor;
QImage background;
QImage world(1500, 768, QImage::Format_RGB32);
QSize sizeImage;
int height, width;
background.load("Background.jpg");
world.fill(1);
QPainter painter(&background);
sizeImage = background.size();
width = sizeImage.width();
height = sizeImage.height();

for(int i = 0; i < height; i++)
{
    for(int z = 0; z < width; z++)
    {
        color = QColor::fromRgb (background.pixel(i,z) );
        color.getCmyk(&c,&m,&y,&k,&al);

        if(c == 0 && m == 0 && y == 0 && k == 0) //then we have black as color and then we draw the color blue
        {
            drawColor.setBlue(255);
            painter.setPen(drawColor);
            painter.drawPoint(i,z);
        }
    }

}


//adding new image to the graphicsScene
QGraphicsPixmapItem item( QPixmap::fromImage(background));
QGraphicsScene* scene = new QGraphicsScene;
scene->addItem(&item);

QGraphicsView view(scene);
view.show();

我的for循环错了还是我的画家?它是QImage :: pixel:坐标(292,981)超出范围但是对于太多像素,它也不够快。

1 个答案:

答案 0 :(得分:2)

如评论中所述,逐个绘制像素可能会非常慢。即使逐像素访问也可以是quite slow。例如。以下可能更快,但仍然不是很好:

  const QRgb black = 0;
  const QRgb blue = 255;
  for(int y = 0; y < height; y++) {
    for(int x = 0; x < width; x++) {
      if (background.pixel(x,y) == black) {
         background.SetPixel(blue);
      }
    }
  }

更快的解决方案是通过scanline()直接进行比特操作。您可能希望先调用convertToFormat(),这样就不需要处理不同的扫描行格式。

作为一个有创意的黑客,请致电createMaskFromColor使所有黑色像素透明,然后在蓝色背景上绘画。