0

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
Bleu.bmp and Mire.bmp are some files that can't be show properly while test16bf565.bmp can be open.
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

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.sizePolicy().hasHeightForWidth())
        self.loadButton.setSizePolicy(sizePolicy)
        self.loadButton.setObjectName("loadButton")
        self.verticalLayout.addWidget(self.loadButton)
        self.verticalLayout_2.addLayout(self.verticalLayout)
        ShowBmp.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, ShowBmp):
        ShowBmp.setWindowTitle(QtGui.QApplication.translate("ShowBmp", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.loadButton.setText(QtGui.QApplication.translate("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("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.sizePolicy().hasHeightForWidth())
        self.loadButton.setSizePolicy(sizePolicy)
        self.loadButton.setObjectName("loadButton")
        self.verticalLayout.addWidget(self.loadButton)
        self.verticalLayout_2.addLayout(self.verticalLayout)
        ShowBmp.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, ShowBmp):
        ShowBmp.setWindowTitle(QtGui.QApplication.translate("ShowBmp", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.loadButton.setText(QtGui.QApplication.translate("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

2
Contributors
2
Replies
3
Views
6 Years
Discussion Span
Last Post by sebcbien
0

With a simple hex editor you can see that the GIMP file headers are completely different.

Cheers and happy coding

0

Well I've actually check this before posting and I've seen that the headers were quite different. Does this mean I'm gonna have to create a homemade reader and decoder? I wish I could find an other way...

Edited by sebcbien: n/a

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.