Small snippet showing how to take a QImage, run through its pixels and modify them based on certain conditions.
Here img is an input image, the application form has 4 checkboxes, which define the component of the color (ARGB) that is to be masked.
- // img is the input original image
- uint *output=0, *input = 0;
- for (int y = rect.top(); y < rect.bottom(); y++)
- {
- input = (uint*)img->scanLine(y - rect.top());
- output = (uint*)result->scanLine(y - rect.top());
- for (int x = rect.left(); x < rect.right(); x++)
- {
- int col = *input;
- {
- *output++ = *input++;
- continue;
- }
- if (ui->redBox->checkState() == 0) qcol.setRed(0);
- if (ui->greenBox->checkState() == 0) qcol.setGreen(0);
- if (ui->blueBox->checkState() == 0) qcol.setBlue(0);
- if (ui->alphaBox->checkState() == 0) qcol.setAlpha(0);
- *output++ = qcol.rgba();
- input++;
- }
- }
- // At this point result will have the modified QImage
Here is an alternative version which should be quite a bit faster, but is less readable, perhaps:
- // img is the input original image
- // Mask is suitable for colors in ARGB byte order.
- uint mask = 0;
- if (ui->redBox->checkState() != 0)
- mask = mask | 0x00ff0000;
- if (ui->greenBox->checkState() != 0)
- mask = mask | 0x0000ff00;
- if (ui->blueBox->checkState() != 0)
- mask = mask | 0x000000ff;
- if (ui->alphaBox->checkState() != 0)
- mask = mask | 0xff000000;
- for (int y = rect.top(); y < rect.bottom(); y++)
- {
- uint* input = (uint*)img->scanLine(y - rect.top());
- uint* output = (uint*)result->scanLine(y - rect.top());
- for (int x = rect.left(); x < rect.right(); x++)
- {
- *output = *input & mask;
- output++;
- input++;
- }
- }
- // At this point result will have the modified QImage

