• 7733阅读
  • 8回复

有没有好的方法,将将QTextEdit 中的文字保存成一张图片? [复制链接]

上一主题 下一主题
离线robertkun
 

只看楼主 倒序阅读 楼主  发表于: 2009-08-12
如题,图片的大小就是edit 的大小,保存可视区域的文本就可以了。

多谢了。
                                              简单的生活使人快乐!
离线浪迹江湖

只看该作者 1楼 发表于: 2009-08-12
用个截屏软件,很方便
离线robertkun

只看该作者 2楼 发表于: 2009-08-12
引用第1楼浪迹江湖于2009-08-12 16:32发表的  :
用个截屏软件,很方便


雷倒,我想说是在程序里面,用代码实现。。。
                                              简单的生活使人快乐!
离线duduqq

只看该作者 3楼 发表于: 2009-08-12
创建一个空白的QImage,设置QImage的大小为字体的大小,然后用QPainter在QImage里面把字体画上去,再调用QImage::save()来保存。
离线robertkun

只看该作者 4楼 发表于: 2009-08-12
引用第3楼duduqq于2009-08-12 17:59发表的  :
创建一个空白的QImage,设置QImage的大小为字体的大小,然后用QPainter在QImage里面把字体画上去,再调用QImage::save()来保存。


多谢,duduqq 了,
  1. // 获取整个文档的Image
  2. QImage cgTextEdit::getDocumentImage()
  3. {
  4.     QRectF rect(QPointF(0,0), document()->size());
  5.     QImage image = _createImageAndClearToAlpha(document()->size().toSize());
  6.     QPainter painter(&image);
  7.      获取text Path
  8.     QPainterPath textPath;
  9.     getTextPath(textPath);
  10.     painter.setBrush(QColor(Qt::black));
  11.     painter.setPen(Qt::NoPen);
  12.     QList<QPolygonF>  polyGonF = textPath.toFillPolygons(QTransform());
  13.     foreach (QPolygonF poly, polyGonF)
  14.     {
  15.         painter.drawPolygon(poly, Qt::WindingFill);
  16.     }
  17.     image.save("c:\\a.png");
  18.     return image;
  19. }
  20. void cgTextEdit::getTextPath(QPainterPath & textPath)
  21. {
  22.     QFont curfont = font();
  23.     curfont.setStyleStrategy(QFont::ForceOutline);
  24.     QFontMetricsF fm = QFontMetricsF(curfont);
  25.     qreal distance = fm.ascent() + 1;
  26.     qreal fh = fm.height() ;
  27.     QPointF baseline;
  28.     int i = document()->blockCount();
  29.     for (int j = 0;j< i; ++j)    //左对齐
  30.     {
  31.         baseline = QPointF(2,distance + 1);
  32.         textPath.addText(baseline,curfont,document()->findBlockByNumber(j).text());
  33.         textPath.setFillRule(Qt::WindingFill);
  34.         distance = distance + fh;
  35.     }
  36. }
  37. QImage cgTextEdit::_createImageAndClearToAlpha(const QSize& size)
  38. {
  39.     QImage image(size, QImage::Format_ARGB32);
  40.     QPainter painter(&image);
  41.     painter.save();
  42.     painter.setCompositionMode(QPainter::CompositionMode_Clear);
  43.     painter.setBackground(QBrush(QColor(255, 255, 255, 0)));
  44.     painter.eraseRect(image.rect()); // clear to alpha=0
  45.     painter.restore();
  46.     return image;
  47. }


现在可以保存图片了,但是效果不是太好,周围有锯齿。是哪的原因呢?
哈哈,可以看下一下效果噢 :
                                              简单的生活使人快乐!
离线robertkun

只看该作者 5楼 发表于: 2009-08-12
[    post][/post]
[ 此帖被robertkun在2009-08-12 19:10重新编辑 ]
                                              简单的生活使人快乐!
离线watera
只看该作者 6楼 发表于: 2009-08-13
这个方法太麻烦.
先创建QImage,然后用个QPainter把文字写到image里就行了,这样还能用抗锯齿
离线duduqq

只看该作者 7楼 发表于: 2009-08-13
你的painter没有设置抗锯齿,
QPainter::setRenderHint
离线robertkun

只看该作者 8楼 发表于: 2009-08-13
引用第6楼watera于2009-08-13 07:18发表的  :
这个方法太麻烦.
先创建QImage,然后用个QPainter把文字写到image里就行了,这样还能用抗锯齿


更改了一下,图像效果是好一点了,
上面的是转换前的,转换后,还有点小问题,不知是什么原因?

1. 间距好像被拉大了,而且最后一行的保存也不完整,

2. painter.drawText(this->rect(), Qt::AlignLeft,str);
    这个函数好像有左右对齐的功能,如果改成右对齐,或居中对齐后图像就消失了。

这是更改后的代码:
  1. // 获取整个文档的Image
  2. QImage cgTextEdit::getDocumentImage()
  3. {
  4.     QRectF rect(QPointF(0,0), document()->size());
  5.     QImage image = _createImageAndClearToAlpha(document()->size().toSize());
  6.     QPainter painter(&image);
  7.     QFont textFont = this->font();
  8.     painter.setFont(textFont);
  9.     QColor textColor(Qt::black);
  10.     painter.setPen(textColor);
  11.     QString str = document()->toPlainText ();
  12.     painter.drawText(this->rect(), Qt::AlignLeft,str);
  13.     return image;
  14. }
[ 此帖被robertkun在2009-08-13 10:01重新编辑 ]
                                              简单的生活使人快乐!
快速回复
限100 字节
 
上一个 下一个