当我尝试编写一个小程序来预览DjVu文件时,我遇到了一个特殊的问题。这是一个小函数,它将DjVu文档的页面呈现为PyQt4的QImage类。
import djvu.decode as DjVu
from PyQt4.QtCore import QImage
from PyQt4.QtGui import QPixmap, QApplication, QLabel
def djvu2pixmap( filename, width, height ) :
doc = DjVu.Context().new_document( DjVu.FileURI( filename ) )
doc.decoding_job.wait()
pg = doc.pages[ 0 ]
pg.decode( wait = True )
data = pg.thumbnail.render( ( width, height ), DjVu.PixelFormatRgbMask( 0xff0000, 0xff00, 0xff, bpp = 32 ) )
image = QIamge( data[ 1 ], data[ 0 ][ 0 ], data[ 0 ][ 1 ], QImage.Format_RGB32 )
image.save( "/tmp/image.png" )
return QPixmap.fromImage( image )
if __name__ == '__main__' :
import sys
app = QApplication( sys.argv )
lbl = QLabel()
lbl.setPixmap( djvu2pixmap( "trial.djvu" ), 200, 300 )
lbl.show()
lbl.resize( lbl.pixmap().size() )
exit( app.exec_() )
现在说我将图片宽度和高度设置为( 300, 500 )
程序与SegmentationFault
一起崩溃。我也意识到图像没有问题。它确实得到了妥善保存。我只是无法显示它。不仅如此,我还可以打开保存的图像并毫无问题地显示它。我很好奇为什么会这样。
答案 0 :(得分:1)
调用lbl.setPixmap后,可能会立即删除QPixmap。试试这个:
pixmap = djvu2pixmap( "trial.djvu" )
lbl.setPixmap( pixmap, 200, 300 )
答案 1 :(得分:0)
事实证明问题出在python-djvu
包中。 python-djvu
软件包的更高版本解决了该问题。