zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« : 10-06-2013 10:58 » |
|
Я бы хотел узнать, как нужно присваивать значения методу QtGui.QImage.bits(), так как увы в интернете, чего-то не нашёл. Объявляю я так:ptr = QtGui.QImage.bits()
А как теперь ptr значения присваивать не понимаю. Если значения которые надо добавить лежат в кортеже. Помогите пожалуйста, разобраться?Если бы это было в Qt я бы сделал так:for (int j = 0; j < 720; j++) for (int i = 491; i >= 0; i--) ptr[j][i] = QColor(buffer[i][j], buffer[i][j], buffer[i][j], 255).rgba();
А вот как в Python-е сделать, что-то не понимаю.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #1 : 10-06-2013 12:43 » |
|
Я думал надо сделать так:// Глобальные bf = [] NF = [] im1 = QtGui.QImage(720, 492, QtGui.QImage.Format_ARGB32) ptr1 = im1.bits()
for j in range(0, 720, 1): bf.append([]) for i in range(491, -1, -1): bf[j].append(struct.unpack("B", fp.read(1))[0])
for j in range(0, 720, 1): for i in range(491, -1, -1): ptr1[j].append(struct.unpack("B", bf[j]))
А вывожу так на экран картинку:Tochka.drawImage(0, 0, ptr1, 0, 0, int((2*self.MyRadianToGradus(phi))+0.5), 492) В результате возникли ошибки:1 ошибка:ptr1[j].append(struct.unpack("B", bf[j])) IndexError: sip.voidptr object has an unknown size 2 ошибка:Tochka.drawImage(0, 0, ptr1, 0, 0, int((2*self.MyRadianToGradus(phi))+0.5), 492) TypeError: arguments did not match any overloaded call: QPainter.drawImage(QRectF, QImage, QRectF, Qt.ImageConversionFlags flags=Qt.AutoColor): argument 1 has unexpected type 'int' QPainter.drawImage(QRect, QImage, QRect, Qt.ImageConversionFlags flags=Qt.AutoColor): argument 1 has unexpected type 'int' QPainter.drawImage(QPointF, QImage, QRectF, Qt.ImageConversionFlags flags=Qt.AutoColor): argument 1 has unexpected type 'int' QPainter.drawImage(QPoint, QImage, QRect, Qt.ImageConversionFlags flags=Qt.AutoColor): argument 1 has unexpected type 'int' QPainter.drawImage(QRectF, QImage): argument 1 has unexpected type 'int' QPainter.drawImage(QRect, QImage): argument 1 has unexpected type 'int' QPainter.drawImage(QPointF, QImage): argument 1 has unexpected type 'int' QPainter.drawImage(QPoint, QImage): argument 1 has unexpected type 'int' QPainter.drawImage(int, int, QImage, int sx=0, int sy=0, int sw=-1, int sh=-1, Qt.ImageConversionFlags flags=Qt.AutoColor): argument 3 has unexpected type 'sip.voidptr'
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #2 : 10-06-2013 12:53 » |
|
а в чем собственно вопрос img = QtGui.QImage(os.path.join(path, f)) ptr = img.bits() ptr.setsize(img.byteCount()) arr = np.asarray(ptr).reshape(img.height(), img.width(), 4).transpose(1,0,2) pixmaps[f] = pickle.dumps(arr)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #3 : 10-06-2013 13:12 » |
|
а в чем собственно вопрос img = QtGui.QImage(os.path.join(path, f)) ptr = img.bits() ptr.setsize(img.byteCount()) arr = np.asarray(ptr).reshape(img.height(), img.width(), 4).transpose(1,0,2) pixmaps[f] = pickle.dumps(arr) Как я понял у объекта ptr, должен быть всегда объявлен размер. И как я понял в Вашем примере используется модуль NumPy, а хотелось бы без него обойтись. Я немного подправил код указав размер:// Глобальные bf = [] NF = [] im1 = QtGui.QImage(720, 492, QtGui.QImage.Format_ARGB32) ptr1 = im1.bits() ptr1.setsize(im1.byteCount())
for j in range(0, 720, 1): bf.append([]) for i in range(491, -1, -1): bf[j].append(struct.unpack("B", fp.read(1))[0])
for j in range(0, 720, 1): for i in range(491, -1, -1): ptr1[j].append(struct.unpack("B", bf[j]))
А вывожу так на экран картинку:Tochka.drawImage(0, 0, ptr1, 0, 0, int((2*self.MyRadianToGradus(phi))+0.5), 492)
Вторая ошибка не изменилась, а первая ошибка заменилась на такую:ptr1[j].append(struct.unpack("B", bf[j])) AttributeError: 'str' object has no attribute 'append'
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #4 : 10-06-2013 13:57 » |
|
я нихрена не смыслю в питоне. только чуть-чуть знаком с синтаксисом.
ты получаешь указатель на массив, затем получаешь его размер. И, наверное, он уже доступен как массив.
В конце концов, поищи примеры с bits() и что делают с этим указателем дальше.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #5 : 11-06-2013 05:53 » |
|
От ошибок избавиться получилось, но к сожалению картинки не выдаются:# Глобальные im = QtGui.QImage(720, 492, QtGui.QImage.Format_ARGB32)
ptr = im.bits() ptr.setsize(im.byteCount())
for j in range(0, 720, 1): bf.append([]) for i in range(491, -1, -1): bf[j].append(struct.unpack("B", fp.read(1))[0])
for j in range(0, 720, 1): for i in range(491, -1, -1): ptr = bf[j]
Tochka.drawImage(0, 0, im, 0, 0, int((2*self.MyRadianToGradus(phi))+0.5), 492)
У меня такое подозрение, что я не правильно заполняю ptr.А именно ошибка в коде который выполняется в циклах: for j in range(0, 720, 1): for i in range(491, -1, -1): ptr = bf[j]
Может, кто знает как правильно заполнять?
|
|
« Последнее редактирование: 11-06-2013 06:40 от zuze »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #6 : 11-06-2013 06:14 » |
|
сомневаюсь for j in range(0, 720, 1): bf.append([]) for i in range(491, -1, -1): bf[j].append(struct.unpack("B", fp.read(1))[0])
for j in range(0, 720, 1): for i in range(491, -1, -1): ptr = bf[j] А ну-ка расскажи-ка что ты здесь делаешь?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #7 : 11-06-2013 06:27 » |
|
for j in range(0, 720, 1): bf.append([]) for i in range(491, -1, -1): bf[j].append(struct.unpack("B", fp.read(1))[0])
А ну-ка расскажи-ка что ты здесь делаешь? В этом коде я заполняю bf значениями из файла. for j in range(0, 720, 1): for i in range(491, -1, -1): ptr = bf[j]
А ну-ка расскажи-ка что ты здесь делаешь? В этом коде я хотел сделать аналог следующего кода:for j in range(0, 720, 1): for i in range(491, -1, -1): m.setPixel(j, i, QtGui.QColor(bn[j][-i], bn[j][-i], bn[j][-i], 255).rgba())
Я хотел заменить этот работающий код, так как метод bits который возвращает указатель на начало, должен работать более быстро.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #8 : 11-06-2013 06:35 » |
|
zuze, я специально выделил код А что новая пустая строка означает закрытие программного блока? Или все же выравнивание отступов?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #9 : 11-06-2013 06:39 » |
|
zuze, я специально выделил код А что новая пустая строка означает закрытие программного блока? Или все же выравнивание отступов?
Это я ошибся с расстановкой на форуме, конечно это совершенно отдельные двойные циклы. Прошу прощения за неточность. for j in range(0, 720, 1): bf.append([]) for i in range(491, -1, -1): bf[j].append(struct.unpack("B", fp.read(1))[0])
for j in range(0, 720, 1): for i in range(491, -1, -1): ptr = bf[j]
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #10 : 11-06-2013 06:39 » |
|
Выравнивание. Причем табуляция не заменяет N пробелов.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #11 : 11-06-2013 06:42 » |
|
а ты уверен, что ptr = bf[j] верное решение? ведь ptr это некий указатель на объект, а ты его превращаешь, в int
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #12 : 11-06-2013 06:43 » |
|
Выравнивание. Причем табуляция не заменяет N пробелов.
Если Вы говорите о пустой строке между двойными циклами, то это я для лучшего восприятия на глаз сделал.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #13 : 11-06-2013 06:45 » |
|
а ты уверен, что ptr = bf[j] верное решение? ведь ptr это некий указатель на объект, а ты его превращаешь, в int
Значит нужен какой-то механизм, который и не нарушал типы данных, но при этом мог добавлять значения в ptr, но пока не знаю как это сделать.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #14 : 11-06-2013 06:47 » |
|
zuze, та ладно... уже проехали... причина понятна - описка.
Вот потому они и используют метод преобразования данных по указателю в массив.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #15 : 11-06-2013 06:52 » |
|
НО может есть другой метод в библиотеке?
Хотя... Я все же подозреваю что ptr доступен как массив (надо только понять его мерность - одно или двух), а добавляя новые элементы нужно менять и размер может при append это делается автоматически
Что manual по этому поводу говорит?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #16 : 11-06-2013 06:59 » |
|
Вот потому они и используют метод преобразования данных по указателю в массив.
К сожалению использовать массивы я не могу, так как это будет опять возвращение к setPixel, а я специально стараюсь от этого метода уйти. НО может есть другой метод в библиотеке?
Есть ещё один метод, но у меня задача проверить оба метода. По другому методу я обращался и ещё буду думаю сюда обращаться. Что manual по этому поводу говорит?
Пока весь manual связанный с этим методом нашёл только для Qt. Для Python мало, что есть, но буду стараться найти.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #17 : 11-06-2013 07:10 » |
|
zuze, Более быстрого доступа к элементу, чем прямой еще никто не придумал
setPixel, это управление пикселем уже на устройстве вывода?
Но это суть разные вещи. Ты сначала обрабатываешь весь буфер, а потом отдаешь его на вывод
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #18 : 11-06-2013 07:22 » |
|
Sla, Как я понял надо ptr в двойном цикле присваивать значения QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba(). Пока, что-то не выходит реализовать это. Думал так заработает:for j in range(0, 720, 1): for i in range(491, -1, -1): ptr[j].append(struct.unpack("B", QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba()))
Но в итоге ошибка:ptr[j].append(struct.unpack("B", QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba())) AttributeError: 'str' object has no attribute 'append' setPixel, это управление пикселем уже на устройстве вывода?
setPixel позволяет попиксельно заполнить объект QImage для последующего его отображения.
|
|
« Последнее редактирование: 11-06-2013 07:28 от zuze »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #19 : 11-06-2013 07:58 » |
|
Меня вот удивляет, что автор гонится за скоростью и пытается лезть в биты, хотя сам читает файл побайтово.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #20 : 11-06-2013 08:03 » |
|
Меня вот удивляет, что автор гонится за скоростью и пытается лезть в биты, хотя сам читает файл побайтово.
Тут я не спорю. Мне было поставлена задача заменить setPixel на работу с методом bits и посмотреть на скорость. Я проверяю разные участки кода разными методами на быстродействие.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #21 : 11-06-2013 08:05 » |
|
конечно ptr[j].append - нет такого метода у строки ptr.append
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #22 : 11-06-2013 08:27 » |
|
ptr.append
Сделал так:for j in range(0, 720, 1): for i in range(491, -1, -1): ptr.append(struct.unpack("B", QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba()))
Выскочила ошибка:ptr.append(struct.unpack("B", QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba())) AttributeError: 'sip.voidptr' object has no attribute 'append'
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #23 : 11-06-2013 08:45 » |
|
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #24 : 13-06-2013 06:07 » |
|
Если такого метода нету, то надо, как-то присвоением сделать. Я пытался так:for j in range(0, 720, 1): for i in range(491, -1, -1): ptr = QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba()
Но строка кода:ptr = QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba() Не смогла заменить строку кода, такую:im.setPixel(j, i, QtGui.QColor(bf[j][-i], bf[j][-i], bf[j][-i], 255).rgba())
И выводит непонятные значения:4282137660 4282203453 4282664004 4282137660 4282203453 4282203453 4282400832 4282466625 4281742902 4281479730 4282335039 4281677109 4281348144 4282598211 4283650899 и т.д.
|
|
|
Записан
|
|
|
|
|