Qt нарисуйте синий пиксель, если исходный пиксель был черным в новом изображении - PullRequest
0 голосов
/ 16 февраля 2012

Я написал некоторый код, который должен создать новое изображение.Мое фоновое изображение имеет черные области, когда цикл 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 Ответ

2 голосов
/ 16 февраля 2012

Как отмечается в комментариях, рисование пикселей по одному может быть невероятно медленным. Даже попиксельный доступ может быть довольно медленным . Например. следующее, вероятно, быстрее, но все же не очень хорошо:

  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, чтобы сделать все черные пиксели прозрачными, а затем закрасьте синий фон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...