channel ARGB32 6000000 pixels 87/88/93 msec (lambda, scanline) channel ARGB32 6000000 pixels 148/146/153 msec QImage::pixel
> Sent: Friday, June 01, 2018 at 4:13 PM > From: "Jason H" <[email protected]> > To: "Jason H" <[email protected]> > Cc: "interestqt-project.org" <[email protected]> > Subject: Re: [Interest] QImage + pixel lambdas > > Incase anyone is wondering: > accumulator ARGB32 6000000 pixels 24/25/26 msec (lamda, scanline) > accumulator ARGB32 6000000 pixels 40/42/44 msec (lambda or no lambda, > QImage::pixel) > > > > Sent: Friday, June 01, 2018 at 9:38 AM > > From: "Jason H" <[email protected]> > > To: "interestqt-project.org" <[email protected]> > > Subject: [Interest] QImage + pixel lambdas > > > > So I'm doing some qimage analysis/manipulation. I think it would be really > > good if QImage came with a per-pixel function. (Examples below) > > I'm tired of writing the x/y for loops. The really neat thing (not in the > > examples) is using QImage::scanLine(int y) for faster access, and > > automatically choosing the value of p in the lambda based on bit depth. > > > > Anyone else think this is a good idea? > > > > //Really sorry about this SFINAE > > template <typename T, typename std::enable_if<std::is_same<void, > > decltype(std::declval<T>()(1))>::value, int>::type = 0> > > void eachPixel(const QImage &image, T pixelFunc, const QRect > > &bounds=QRect()) { > > QRect imageRect(QRect(0,0, image.width(), image.height())); > > QRect region = bounds.isNull() ? imageRect : > > bounds.intersected(imageRect); > > > > for (int y=region.y(); y<=region.bottom(); y++) { > > for (int x=region.x(); x<=region.right(); x++) { > > pixelFunc(image.pixel(x,y)); > > } > > } > > } > > > > //Really sorry about this SFINAE too. > > template <typename T, typename std::enable_if<std::is_same<uint, > > decltype(std::declval<T>()(1))>::value, int>::type = 0> > > QImage eachPixel(const QImage &image, T pixelFunc, const QRect > > &bounds=QRect()) { > > QRect imageRect(QRect(0,0, image.width(), image.height())); > > QRect region = bounds.isNull() ? imageRect : > > bounds.intersected(imageRect); > > > > QImage out(image.size(), image.format()); > > for (int y=region.y(); y<=region.bottom(); y++) { > > for (int x=region.x(); x<=region.right(); x++) { > > out.setPixel(x,y, pixelFunc(image.pixel(x,y))); > > } > > } > > return out; > > } > > > > void test_pixelFunc() { > > QImage image(300,200, QImage::Format_ARGB32); > > image.fill(Qt::blue); > > > > QImage out = eachPixel(image, [] (uint p) { > > return qRgb(qRed(p), qBlue(p), qGreen(p)); // swap green and > > blue channels > > }, QRect (5,5, 300, 200)); // for a portion of > > the image > > out.save("test_pixelfunc.png"); > > > > > > int accumulator=0; > > int min = 255; > > int max = 0 > > eachPixel(image, [&accumulator, &min, &max](uint p) { // This > > one can be used for statistics, > > accumulator +=p; // if > > you're not making a new image > > if (p < min) min = p; > > if (p > max) max = p; > > }, QRect (5,5, 300, 200)); > > qDebug() << "accumulator" << accumulator << "min" << min << "max" << > > max; > > > > } > > _______________________________________________ > > Interest mailing list > > [email protected] > > http://lists.qt-project.org/mailman/listinfo/interest > > > _______________________________________________ Interest mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/interest
