void PixelClassifier::preprocess() { Mat preProcessed; Size blurSize(5,5); GaussianBlur(sourceImage, preProcessed, blurSize, 0); sourceImage = preProcessed; }
void GLImageDrawable::updateShadow() { if(!m_shadowDrawable) return; QImage sourceImg = m_imageWithBorder.isNull() ? m_image : m_imageWithBorder; QSizeF originalSizeWithBorder = sourceImg.size(); QPointF scale = m_glw ? QPointF(m_glw->transform().m11(), m_glw->transform().m22()) : QPointF(1.,1.); if(scale.x() < 1.25 && scale.y() < 1.25) scale = QPointF(1,1); double radius = m_shadowBlurRadius; // create temporary pixmap to hold a copy of the text double radiusSpacing = radius;// / 1.75;// * 1.5; double radius2 = radius * 2; // double offx = 0; //fabs(m_shadowOffset.x()); // double offy = 0; //fabs(m_shadowOffset.y()); double newWidth = originalSizeWithBorder.width() + radius2 * scale.x();// blur on both sides //+ offx * scale.x(); double newHeight = originalSizeWithBorder.height() + radius2 * scale.y();// blur on both sides //+ offy * scale.y(); QSizeF blurSize(newWidth,newHeight); // blurSize.rwidth() *= scale.x(); // blurSize.rheight() *= scale.y(); //qDebug() << "GLImageDrawable::applyBorderAndShadow(): Blur size:"<<blurSize<<", originalSizeWithBorder:"<<originalSizeWithBorder<<", radius:"<<radius<<", radius2:"<<radius2<<", m_shadowOffset:"<<m_shadowOffset<<", offx:"<<offx<<", offy:"<<offy<<", scale:"<<scale; QImage tmpImage(blurSize.toSize(),QImage::Format_ARGB32_Premultiplied); memset(tmpImage.scanLine(0),0,tmpImage.byteCount()); // render the source image into a temporary buffer for bluring QPainter tmpPainter(&tmpImage); //tmpPainter.scale(scale.x(),scale.y()); tmpPainter.save(); QPointF translate1(radiusSpacing, radiusSpacing); translate1.rx() *= scale.x(); translate1.ry() *= scale.y(); //qDebug() << "stage1: radiusSpacing:"<<radiusSpacing<<", m_shadowOffset:"<<m_shadowOffset<<", translate1:"<<translate1; //qDebug() << "GLImageDrawable::updateShadow(): translate1:"<<translate1<<", scale:"<<scale; tmpPainter.translate(translate1); tmpPainter.drawImage(0,0,sourceImg); tmpPainter.restore(); // color the orignal image by applying a color to the copy using a QPainter::CompositionMode_DestinationIn operation. // This produces a homogeneously-colored pixmap. QRect imgRect = tmpImage.rect(); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); QColor color = m_shadowColor; // clamp m_shadowOpacity to 1.0 because we handle values >1.0 by repainting the blurred image over itself (m_shadowOpacity-1) times. color.setAlpha((int)(255.0 * (m_shadowOpacity > 1.0 ? 1.0 : m_shadowOpacity))); tmpPainter.fillRect(imgRect, color); tmpPainter.end(); // blur the colored text ImageFilters::blurImage(tmpImage, (int)(radius * scale.x())); if(m_shadowOpacity > 1.0) { QPainter painter2(&tmpImage); int times = (int)(m_shadowOpacity - 1.0); // Cap at 10 - an arbitrary cap just to prevent the user from taxing the CPU too much. if(times > 10) times = 10; double finalOpacity = m_shadowOpacity - ((int)m_shadowOpacity); if(finalOpacity < 0.001) finalOpacity = 1.0; QImage copy = tmpImage.copy(); for(int i=0; i<times-1; i++) painter2.drawImage(0,0,copy); //qDebug() << "Overpaint feature: times:"<<times<<", finalOpacity:"<<finalOpacity; painter2.setOpacity(finalOpacity); painter2.drawImage(0,0,copy); painter2.setOpacity(1.0); } // { // QPainter painter2(&tmpImage); // painter2.setPen(Qt::yellow); // // QPointF translate1(radiusSpacing, // radiusSpacing); // translate1.rx() *= scale.x(); // translate1.ry() *= scale.y(); // //qDebug() << "stage1: radiusSpacing:"<<radiusSpacing<<", m_shadowOffset:"<<m_shadowOffset<<", translate1:"<<translate1; // //qDebug() << "GLImageDrawable::updateShadow(): translate1:"<<translate1<<", scale:"<<scale; // // painter2.translate(translate1); // painter2.drawImage(0,0,sourceImg); // painter2.drawRect(sourceImg.rect()); // // } // Notice: Older versions of this shadow code drew the sourceImg back on top of the shadow - // Since we are drawaing the drop shadow as a separate texture below the real image in the // m_shadowDrawable, we are not going to draw the sourceImg on top now. //qDebug() << "GLImageDrawable::updateShadow(): shadow location:"<<point<<", size:"<<tmpImage.size()<<", rect().topLeft():"<<rect().topLeft()<<", m_shadowOffset:"<<m_shadowOffset<<", radiusSpacing:"<<radiusSpacing; bool scaleFlag = dynamic_cast<GLTextDrawable*>(this) == NULL; // double scale_w = scaleFlag ? fabs((double)(rect().width() - sourceImg.width())) / sourceImg.width() : 1.0; // double scale_h = scaleFlag ? fabs((double)(rect().height() - sourceImg.height())) / sourceImg.height() : 1.0; double scale_w = scaleFlag ? m_targetRect.width() / m_sourceRect.width() : 1.0; double scale_h = scaleFlag ? m_targetRect.height() / m_sourceRect.height() : 1.0; // scale_w *= 2; // scale_h *= 2; QSizeF size(((double)tmpImage.width()) * scale_w, ((double)tmpImage.height()) * scale_h); QPointF point = rect().topLeft() + QPointF(m_shadowOffset.x() * scale_w, m_shadowOffset.y() * scale_h) - QPointF(m_shadowBlurRadius * scale_w,m_shadowBlurRadius * scale_h); //qDebug() << "GLImageDrawable::updateShadow: "<<(QObject*)this<<" m_targetRect:"<<m_targetRect.size()<<", m_sourceRect:"<<m_sourceRect.size()<<", scale:"<<scale_w<<"x"<<scale_h<<", tmpImage:"<<tmpImage.size()<<", new size:"<<size<<", point:"<<point; m_shadowDrawable->setRect(QRectF(point, size)); m_shadowDrawable->setImage(tmpImage); //updateGL(); }