在QImage alpha通道中创建多边形孔

时间:2016-02-08 10:44:46

标签: c++ qt

我试图在QImage alpha通道中制作多边形孔。 我目前的实施使用了已弃用的“alphaChannel”'方法和工作缓慢(因为它对每个图像像素使用containsPoint而不是绘制多边形)。

QImage makeImageWithHole(const QImage & image, const std::vector<QPoint> & hole_points)
{
  QImage newImage = image.convertToFormat(QImage::Format_ARGB32);

  QImage alpha = newImage.alphaChannel();
  QPolygon hole(QVector<QPoint>::fromStdVector(hole_points));
  for (int x = 0; x < image.width(); x++)
  {
    for (int y = 0; y < image.height(); y++)
    {
      if (hole.containsPoint(QPoint(x, y), Qt::OddEvenFill))
      {
        alpha.setPixel(x, y, 0);
      }
    }
  }
  newImage.setAlphaChannel(alpha);

  return newImage;
}

我也尝试使用画家和正确的合成模式来实现它,但结果我在多边形边框上有白色文物。

QImage makeImageWithHole(const QImage & image, const std::vector<QPoint> & hole)
{
  QImage newImage = image.convertToFormat(QImage::Format_ARGB32);

  QPainter p(&newImage);
  p.setCompositionMode(QPainter::CompositionMode_SourceOut);
  p.setPen(QColor(255, 255, 255, 255));
  p.setBrush(QBrush(QColor(255, 255, 255, 255)));
  p.drawPolygon(hole.data(), hole.size());
  p.end();

  return newImage;
}

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为你应该启用这样的反叛:

QPainter p(&newImage);
p.setRenderHints(QPainter::Antialiasing);