PDA

View Full Version : PyQt QImage and BMP in 16bits 565 created from The Gimp



sebcbien
11th August 2010, 15:49
Hi,

I've got some trouble opening files saved by The Gimp in BMP 16bits 565. I've test some various bmp they all work except those saved from The Gimp and I really don't know why the format might be different from the one found there :http://wvnvaxa.wvnet.edu/vmswww/bmp.html
Here are one "bleu.bmp" that cannot be read by qimage and test16bf565.bmp that is read properly.
50575058

I've written a little program that load BMP and show them by a label with a pyQt window.
It looks like this :



from PyQt4 import QtGui, QtCore
import sys, os, wx

class Ui_ShowBmp(QtGui.QMainWindow):
def setupUi(self, ShowBmp):
ShowBmp.setObjectName("ShowBmp")
ShowBmp.resize(660, 529)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(ShowBmp.sizePolicy(). hasHeightForWidth())
ShowBmp.setSizePolicy(sizePolicy)
self.centralwidget = QtGui.QWidget(ShowBmp)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout_2 = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout = QtGui.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtGui.QLabel(self.centralwidget)
self.label.setPixmap(QtGui.QPixmap("Sample.bmp"))
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.loadButton = QtGui.QPushButton(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.loadButton.sizeP olicy().hasHeightForWidth())
self.loadButton.setSizePolicy(sizePolicy)
self.loadButton.setObjectName("loadButton")
self.verticalLayout.addWidget(self.loadButton)
self.verticalLayout_2.addLayout(self.verticalLayou t)
ShowBmp.setCentralWidget(self.centralwidget)

self.retranslateUi(ShowBmp)
QtCore.QMetaObject.connectSlotsByName(ShowBmp)

def retranslateUi(self, ShowBmp):
ShowBmp.setWindowTitle(QtGui.QApplication.translat e("ShowBmp", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.loadButton.setText(QtGui.QApplication.transla te("ShowBmp", "Load", None, QtGui.QApplication.UnicodeUTF8))

class Ui_Extension(Ui_ShowBmp):
def __init__ (self):
self.app = QtGui.QApplication(sys.argv)
QtGui.QMainWindow.__init__(self)
self.window = QtGui.QMainWindow()
self.setupUi(self.window)
self.createSignals()
self.window.show()
self.curdir = os.getcwd()
(self.xsize,self.ysize) = ("0","0")

def createSignals(self):
QtCore.QObject.connect(self.loadButton, QtCore.SIGNAL("clicked()"), self.pushedLoadBmpButton)
def pushedLoadBmpButton(self):
self.imagepath = QtGui.QFileDialog.getOpenFileName(self,"Select BMP", self.curdir, ("BMP (*.bmp)"))
(self.xsize,self.ysize) = self.getSize(self.imagepath)
self.image = QtGui.QImage(str(self.imagepath))
self.label.setGeometry(10, 10,int(self.xsize), int(self.ysize))
self.label.setPixmap(QtGui.QPixmap.fromImage(self. image))
def getSize(self,filepath):
'''Return the size from the bmp loaded'''
file = open(filepath,"rb")
fileread = file.read()
file.close()
header = fileread[:71]
xpixels = header[21:17:-1]
xlist = []
for c in xpixels:
data = str(hex(ord(c)))
if len(data) == 3:
data = 'x0'.join(data.split('x'))
xlist.append(data)
xsize = int('0x'+''.join(''.join(xlist).split('0x')),base = 16)

ypixels = header[25:21:-1]
ylist = []
for c in ypixels:
data = str(hex(ord(c)))
if len(data) == 3:
data = 'x0'.join(data.split('x'))
ylist.append(data)
ysize = int('0x'+''.join(''.join(ylist).split('0x')),base = 16)
return (str(xsize),str(ysize))





class Ui_ShowBmp(QtGui.QMainWindow):
def setupUi(self, ShowBmp):
ShowBmp.setObjectName("ShowBmp")
ShowBmp.resize(660, 529)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(ShowBmp.sizePolicy(). hasHeightForWidth())
ShowBmp.setSizePolicy(sizePolicy)
self.centralwidget = QtGui.QWidget(ShowBmp)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout_2 = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout = QtGui.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtGui.QLabel(self.centralwidget)
self.label.setPixmap(QtGui.QPixmap("EswinRD640x480.bmp"))
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.loadButton = QtGui.QPushButton(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.loadButton.sizeP olicy().hasHeightForWidth())
self.loadButton.setSizePolicy(sizePolicy)
self.loadButton.setObjectName("loadButton")
self.verticalLayout.addWidget(self.loadButton)
self.verticalLayout_2.addLayout(self.verticalLayou t)
ShowBmp.setCentralWidget(self.centralwidget)

self.retranslateUi(ShowBmp)
QtCore.QMetaObject.connectSlotsByName(ShowBmp)

def retranslateUi(self, ShowBmp):
ShowBmp.setWindowTitle(QtGui.QApplication.translat e("ShowBmp", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.loadButton.setText(QtGui.QApplication.transla te("ShowBmp", "Load", None, QtGui.QApplication.UnicodeUTF8))



def ShowBmp():
ui = Ui_Extension()
sys.exit(ui.app.exec_())

if __name__ == '__main__':
ShowBmp()



Thanks in advance for your help