Что нового

[Python] конвертирование картинки в бинарный код

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Есть ли тут питонисты пишущие с использованием PyQt, возникла не большая проблема, не могу загрузить в QPixmap.loadFromData() бинарный код иконки, знаю что есть pyrcc4, но не хочется их использовать, уж очень тупо сделано если честно, а код картинки который генерит pyrcc4 не подходит напрямую без регистрации этого ресурса в приложении

P.S. Я бы написал на форум по Python (в принципе я это и сделал), но там так глухо что кажется будто я один....

OffTopic:

Хотя в каком - то смысле так и есть:

Сейчас зарегистрированных посетителей: 2
Сейчас гостей: 1
Пользователи онлайн: Viktor1703 ingfa_1981
 

_dron_

Знающий
Сообщения
84
Репутация
8
код в студию! ;D


Добавлено:
Сообщение автоматически объединено:

[box title=TitleBox]Format Description Qt's support
BMP Windows Bitmap Read/write
GIF Graphic Interchange Format (optional) Read
JPG Joint Photographic Experts Group Read/write
JPEG Joint Photographic Experts Group Read/write
PNG Portable Network Graphics Read/write
PBM Portable Bitmap Read
PGM Portable Graymap Read
PPM Portable Pixmap Read/write
XBM X11 Bitmap Read/write
XPM X11 Pixmap Read/write

[/box]

я извиняюсь, но PyQt не поддерживает формат *.ico
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
_dron_

Ясно, тогда другой вопрос, можно ли поставить через setWindowIcon файл PNG ? проверил, можно

Это код который берёт картинку, переводит в двоичный код и записывает в *.py файл

myimage = ""\
"\x00\x00\x01\x00\x16...."\
"...."

Код:
#-*- coding: utf-8 -*-

file = open('E:\\wmp.ico', 'rb')
try:
    create = open('myimage.py', 'w')
    bitstring = ''
    step = 0
    create.write('myimage = ""\\\n')
    for byte in bytearray(file.read()):
        if step >= 50:
            create.write('"' + bitstring + '"')
            create.write(str('\\\n'))
            bitstring = ''
            step = 0
        bitstring += r'\x' + format(byte, '02x')
        step += 1
    create.write('"' + bitstring + '"')
    create.close()

finally:
    file.close()

Вообще я Python не знаю, так что коды соответствующие...

Код окна

Код:
#-*- coding: utf-8 -*-

import sys, myimage
from PyQt4 import QtGui, QtCore

class Form(QtGui.QMainWindow):
    def __init__(self, parent = None):
        super(Form, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)
        self.setWindowIcon(QtGui.QIcon(QtGui.QPixmap.loadFromData(myimage.myimage, 'png')))
        self.setWindowTitle('Форточка')
        self.resize(500, 350)
        self.show()

class Program(QtGui.QApplication):
    def __init__(self, argv = []):
        super(Program, self).__init__(argv)

    def Run(self, form):
        if isinstance(form, QtGui.QMainWindow):
            return self.exec_()

if __name__ == '__main__':
    app = Program(sys.argv)
    sys.exit(app.Run(Form()))
 

_dron_

Знающий
Сообщения
84
Репутация
8
можно ли поставить через setWindowIcon файл PNG
Вроде после загрузки все картинки приводятся к одному формату- точнее просто набор пикселей
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
_dron_ [?]
Вроде после загрузки все картинки приводятся к одному формату- точнее просто набор пикселей

Ясно, пытаюсь перевести PNG изображение и загрузить через loadFromData, не получается, как их ещё можно грузить?!, не хочу с собой кучу файлов таскать....
 

_dron_

Знающий
Сообщения
84
Репутация
8
кусок
Код:
        self.setWindowIcon(QtGui.QIcon(QtGui.QPixmap.loadFromData(myimage.myimage, 'png')))

замени на

Код:
        rawPix = QtCore.QByteArray.fromRawData(myimage.myimage)
        pix=QtGui.QPixmap()
        pix.loadFromData(rawPix , 'PNG')
        self.setWindowIcon(QtGui.QIcon(pix))

loadFromData этот метод не статический - чтобы его вызвать нужно создать экземпляр
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
_dron_

Не работает, выдаёт ошибку

Код:
TypeError: QByteArray.fromRawData(str): argument 1 has unexpected type 'str'

если так - myimage.myimage.encode('utf-8'), то ошибок нет, но и не работает
 

_dron_

Знающий
Сообщения
84
Репутация
8
у тебя картинка в текст преобразовывается
Код:
create.write('myimage = ""\\\n')
а нужно bytes
Код:
create.write('myimage = b""\\\n')#<---- b""
...
create.write('b"' + bitstring + '"')#<---- b"
...
create.write('b"' + bitstring + '"')#<---- b"
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
_dron_

И тогда я получаю кучу ошибок всё получилось, неужели... спасибо :smile:
 

_dron_

Знающий
Сообщения
84
Репутация
8
вот архив
блин я целый архив замутил

Удачи!
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вдруг кому нибудь пригодится в качестве примера

Python:
#-*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore

mainicon = b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x10\x00\x00\x00\x10\x08"\
           b"\x06\x00\x00\x00\x1f\xf3\xff\x61\x00\x00\x02\x1f\x49\x44\x41\x54\x38\x8d\x95\x92\xcd\x4b\x54\x51\x18"\
           b"\xc6\x7f\xe7\xce\x99\x3b\xe8\x8c\x63\x33\x6a\x9a\xc6\x84\x08\x85\x62\x5f\x34\x63\x58\x18\x31\x11\x94"\
           b"\xd4\x4a\x72\x61\x20\xad\x12\x5a\xb6\x9a\xbf\xa0\x20\xa8\x65\x0b\x21\x88\xc0\xa8\x28\x5a\xe4\x42\x86"\
           b"\xa0\x0f\x17\x92\x4c\xa6\x1b\x8b\x06\xbf\x32\x8b\xf1\x63\x72\x74\x6a\x3e\xbc\x77\x4e\x8b\xd1\xab\x71"\
           b"\x87\xa2\x67\x75\x78\xdf\xe7\xfd\xbd\xe7\x3c\x1c\x11\x89\x2a\xd5\xff\x1e\x92\x19\xfe\x4b\x5e\x1d\xae"\
           b"\xb5\x81\xf0\xdf\x54\xea\xce\xa5\x57\xa4\x55\x12\xa5\x34\x8c\x82\x8f\x42\xc1\x85\x61\xee\xc2\x34\x2b"\
           b"\x50\x38\x4b\x02\x7c\x4e\x27\x91\xe7\x7e\x64\x32\x03\x19\x31\xcf\xf8\xea\x34\xa6\x59\x8e\x59\xf0\xd0"\
           b"\xb4\xbc\x40\xdb\xd7\x51\x02\xa9\x39\x00\xa6\x3c\x47\x19\xf6\x77\xf2\xb1\xba\xc3\x02\xb4\xef\x76\xb3"\
           b"\x96\x07\x09\x80\x30\x11\x22\x87\x94\x39\x7a\x63\x8f\x09\x2d\x8c\x21\xe5\xf6\xb6\xa6\x64\x9c\xf0\xe2"\
           b"\x13\xde\xfa\x2f\xd0\x7f\xe0\x16\x86\xc3\x65\xf5\x34\x00\x81\x89\x10\x1b\x5c\x1c\x7f\x49\x7b\x62\x0c"\
           b"\x77\x6d\x00\x57\xd7\x00\x2e\x77\x19\x2e\xbd\x68\x74\x97\xc3\xa9\xe4\x20\xdd\xf1\x1b\x7f\x3c\x45\xb3"\
           b"\xb6\x2c\x4e\x13\x9e\x8b\x6d\x77\x5a\x7a\xe0\x6a\x1c\x1a\xcf\x5a\x10\x29\x21\xfc\x7d\x80\xe6\xe5\x61"\
           b"\x3b\x20\x38\x3b\x89\x94\x58\x66\x00\x3c\x0d\xd0\x1d\x85\x33\xb7\xc1\x59\xbc\x8d\xc7\xa9\x38\x39\xf3"\
           b"\xc0\x0e\xa8\x49\xad\x94\x4c\xbb\x48\xbf\x0e\x57\x3e\x40\x7d\x1b\x52\x42\x75\x7a\xca\x0e\xf8\xa7\x1c"\
           b"\x3a\xc8\x32\x00\xd4\x8e\x31\xeb\xb4\xe4\xad\xc2\x30\x4a\xcf\xaa\x89\x7e\xb8\x7f\x18\xbe\xbc\xc1\x30"\
           b"\x60\xc5\xd3\x68\x07\xc4\x1a\x5b\xec\x93\xe9\x05\x78\x7a\x1e\x31\xd4\x07\xd9\x75\x00\x92\x59\x8d\x91"\
           b"\x7d\x5d\x76\xc0\x4c\xed\x5e\x5e\x07\x0e\xf2\xf3\xd7\x66\x61\xf2\x21\xdc\x6b\x86\xa9\x21\xcb\x9c\x48"\
           b"\x09\x46\xaa\x3b\xf8\x5c\x1f\x04\x4c\x60\xeb\x23\x6d\x6a\xf0\xd8\x69\x3c\x46\x96\xe0\xb7\x38\xf2\xd9"\
           b"\x65\xab\x6e\x18\x90\xde\x10\x4c\x54\xb5\xf2\xe2\x44\x2f\x8e\xfc\x3a\x9a\x96\xb3\x03\x00\x1e\x1d\x3f"\
           b"\xc7\xbb\x44\x2b\xc1\xd9\x49\xea\x7e\x2c\x01\x30\xef\xdf\xc3\x58\x20\xc4\xa7\x9a\x10\x28\x90\x8e\x55"\
           b"\x34\x91\x2d\x02\xbc\x3a\x54\x88\x06\x8e\x54\xee\xa0\x54\x1e\x22\xbe\xbf\x93\xf8\x56\x88\x4a\xc7\x07"\
           b"\x84\xcc\x0a\x00\xf2\x46\x1d\x3e\xe9\xc0\xab\x83\x88\x44\x95\xba\x3b\x0a\x6b\x79\x7b\x86\x7f\x93\x57"\
           b"\x87\xbe\x10\xfc\x06\x4e\x94\xaf\x5e\x2d\x98\x37\xe7\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"

class Resource():
    @staticmethod
    def loadImageFromRawData(image, format):
        pixmap = QtGui.QPixmap()
        pixmap.loadFromData(QtCore.QByteArray(image), format)
        return pixmap

class Form(QtGui.QMainWindow):
    def __init__(self, parent = None):
        super(Form, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)
        self.setWindowIcon(QtGui.QIcon(Resource.loadImageFromRawData(mainicon, 'PNG')))
        self.setWindowTitle('Форточка')
        self.resize(500, 350)
        self.show()

class Program(QtGui.QApplication):
    def __init__(self, argv = []):
        super(Program, self).__init__(argv)

    def Run(self, form):
        if isinstance(form, QtGui.QMainWindow):
            return self.exec_()

if __name__ == '__main__':
    app = Program(sys.argv)
    sys.exit(app.Run(Form()))
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Может кому понадобится скрипт перевода изображения в вид '\x00\x00\x01\x00\x16...'

Исходник:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

If @Compiled Then
	If $CmdLine[0] Then
		If __img_toPy($CmdLine[1], $CmdLine[2]) Then
			ConsoleWrite('>> success: ' & $CmdLine[1] & @CRLF)
		Else
			ConsoleWrite('>> error: ' & $CmdLine[1] & @CRLF)
		EndIf
	EndIf
Else
	__img_toPy('image.png', 'rc.py')
EndIf

Func __img_toPy($sFile, $sOut)

    Local $hFile, $sRead, $iSwitch, $iSize, $iStep = 1, $sName, $bData

	$hFile = FileOpen($sFile, 16)
	$sRead = FileRead($hFile)
	FileClose($hFile)
	$sRead = StringRegExpReplace(StringTrimLeft($sRead, 2), '(..)', '\\x$1')
	$iSize = StringLen($sRead)
	$sName = StringRegExp($sFile, "([^.\\]+)\.", 1)
	If IsArray($sName) Then
		While ($iStep <= $iSize)
			If (($iSize - $iStep) > 60) Then
				If Not $iSwitch Then
					$bData &= 'b"' & StringMid($sRead, $iStep, 60) & '"\' & @CRLF
					$iSwitch = 1
				Else
					$bData &= StringFormat('%' & (StringLen($sName[0]) + 3) & 's', ' ') & 'b"' & StringMid($sRead, $iStep, 60) & '"\' & @CRLF
				EndIf
			Else
				$bData &= StringFormat('%' & (StringLen($sName[0]) + 3) & 's', ' ') & 'b"' & StringMid($sRead, $iStep, ($iSize - $iStep) + 1) & '"' & @CRLF
			EndIf
			$iStep += 60
		Wend
		$hFile = FileOpen($sOut, 1)
		FileWrite($hFile, $sName[0] & ' = ')
		FileWrite($hFile, $bData)
		FileClose($hFile)
		Return 1
	EndIf
	Return 0
EndFunc

Файл: pyrc.zip

Пример bat файла:
Код:
pyrc.exe [image file] [output py file]

Return values
    >> success: [image file]
    >> error: [image file]

Example

pyrc.exe img.png rc.py && pause
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Реализация на Python

Python:
#-*- coding: utf-8 -*-

import os

def FileToRawData(file, step = 20):

    result, read_byte, switch, temp = 0, 0, 0, ''

    if (step > 0):
        try:
            source = open(file, 'rb')
            destin = open(file + '.py', 'w')
            source.seek(0, os.SEEK_END)
            size = source.tell()
            source.seek(0, 0)
            if (size > 0):
                file_name = os.path.splitext(os.path.basename(file))[0]
                size_name = (len(file_name) + 3)
                while (read_byte < size):
                    if ((size - read_byte) > step):
                        for byte in source.read(step):
                            temp += r'\x' + format(byte, '02x')
                        if switch != 1:
                            destin.write(file_name + ' = ' + 'b"' + temp + '"\\\n')
                            switch = 1
                        else:
                            destin.write(''.ljust(size_name) + 'b"' + temp + '"\\\n')
                    else:
                        for byte in source.read(size - read_byte):
                            temp += r'\x' + format(byte, '02x')
                        destin.write(''.ljust(size_name) + 'b"' + temp + '"')
                    read_byte += step
                    temp = ''
                result = 1
        finally:
            destin.close()
            source.close()
    return result

print(FileToRawData(file='E:\\arch.png'))

# выходной файл: E:\arch.png.py

Вид выходного файла

Python:
arch = b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x10"\
       b"\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\x00\x00\x00\x01\x73\x52\x47"\
       b"\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc"\
       b"\x61\x05\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7"\
       b"\x6f\xa8\x64\x00\x00\x00\x1a\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\x00"\
       b"\x50\x61\x69\x6e\x74\x2e\x4e\x45\x54\x20\x76\x33\x2e\x35\x2e\x31\x31\x47\xf3\x42"\
       b"\x37\x00\x00\x01\xc7\x49\x44\x41\x54\x38\x4f\x8d\x52\xcb\x4e\xc2\x40\x14\x6d\xdc"\
       b"\xf8\x05\xea\x82\x05\x81\x8a\x14\x68\x79\x94\xf7\xab\xe5\x0d\xa2\xae\x74\x65\xdc"\
       b"\xf9\x1b\x2c\x48\x34\x1a\x89\x20\x02\x01\x8d\x2b\x77\xee\xfd\x15\x5d\xc9\xc2\x0f"\
       b"\xf0\x0f\x48\xbc\xce\x99\x99\x92\x98\x34\xc6\x93\x9c\xb4\x3d\xf7\x9c\x7b\x3b\x99"\
       b"\xab\x38\xf0\x7a\xbd\x9b\x81\x40\xe0\x7c\x2f\xb8\xd7\xc7\x77\x30\x18\xec\x6b\x9a"\
       b"\xb6\x26\xab\xd9\xcc\xb3\xc3\xcd\x6e\x30\x93\xe6\x6b\xd9\x2a\x93\x65\x5b\x14\x8d"\
       b"\x45\x7b\x93\xd9\x3d\x55\x6b\x55\xaa\xd5\x6b\xfc\xd9\xd9\xef\x0c\x8d\xa8\xf1\xae"\
       b"\xaa\xea\x36\xfc\x97\x57\x17\x1b\x3c\xe8\x80\x05\xbf\x5b\xed\x16\x35\x9a\x0d\x9a"\
       b"\xce\xa7\x2b\xc3\x30\xfa\x08\x43\x6b\xb6\x9a\x74\x78\x74\x38\xc2\x00\xd3\x34\xdf"\
       b"\xfc\x7e\x3f\x6f\xf2\x0b\x98\x8c\x70\xa5\x5a\xa1\x88\x1e\xe1\x7f\x80\x06\xd0\xea"\
       b"\x8d\x3a\x75\x0f\xba\x23\xbb\x62\xf3\x7a\x3c\x11\x7f\xf3\xf9\x7c\x5b\x32\x2a\x80"\
       b"\xee\x08\xc0\xc0\xc2\xab\x70\x24\xdc\x47\x53\xe7\x08\xc7\x27\xc7\xcf\xb3\xc5\x8c"\
       b"\x16\x8f\x73\x9a\xcd\xa7\x34\xb8\x1d\xbc\xc8\xa8\x40\xa1\x58\x20\x4c\x28\x96\x8a"\
       b"\xa4\x85\xb4\xde\x78\x72\x47\x96\x65\x71\xcd\xb6\x6d\xca\x64\x33\x98\x4c\x09\x33"\
       b"\xc1\xa9\x1b\x3a\xc9\xa8\x40\x2e\x9f\xa3\x52\xb9\xc4\x1b\xb0\xf0\x0a\xb7\x91\x2f"\
       b"\xe4\xb9\xe6\x46\xf8\x65\x54\x20\x9d\x49\x13\xfe\x02\x93\xd8\x95\xf5\x46\xe3\x21"\
       b"\xa1\x01\x34\x37\xc2\x2f\xa3\x02\xc9\x54\x92\xb2\xb9\x2c\x6f\x30\x1c\x0f\x57\xd0"\
       b"\x52\xe9\x14\xd7\xdc\x08\x3f\x0f\x3a\xc0\xf9\x10\xc0\xf9\xa4\xb4\xd6\xdc\x88\x9a"\
       b"\xb4\x09\xb0\xe5\x21\xb6\x4c\x58\x22\xf2\x78\x3c\x6d\xd0\xd1\xdc\x88\x9a\x8c\x0a"\
       b"\xb0\xbb\xa7\x58\x3c\x46\xba\xae\xd3\xf5\xe0\x7a\x04\xe2\x1d\x9a\x1b\xe1\x97\x51"\
       b"\x81\x50\x38\x44\x6c\x55\x79\x41\xdd\x55\x39\xf1\x0e\xcd\x8d\xf0\xcb\xa8\x00\x5b"\
       b"\x1c\x1e\xf8\x2f\xe1\x97\x51\x81\xd3\xb3\xd3\x2f\x74\xfd\x2f\xe1\x97\x51\x81\xe5"\
       b"\xe7\x47\xe7\xe1\xe9\x61\x39\xb8\xbd\x61\x6b\xfa\x37\xe1\x83\x5f\x51\x14\xe5\x07"\
       b"\xa3\x10\x4a\x4d\x2b\x54\xdb\x9f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
 
Верх