| 
			| 
					
						| zuze 
								Опытный    Offline 
								Пол:    
								Россия, Москва
								
								
								
								
								
							 | 
								|  | «  : 10-06-2013 10:58 »  |  | 
 
 Я бы хотел узнать, как нужно присваивать значения методу QtGui.QImage.bits(), так как увы в интернете, чего-то не нашёл.Объявляю я так: ptr = QtGui.QImage.bits()
А как теперь ptr значения присваивать не понимаю. Если значения которые надо добавить лежат в кортеже. Помогите пожалуйста, разобраться?Если бы это было в Qt я бы сделал так: А вот как в Python-е сделать, что-то не понимаю.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();
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| 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]))
 
В результате возникли ошибки:1 ошибка:Tochka.drawImage(0, 0, ptr1, 0, 0, int((2*self.MyRadianToGradus(phi))+0.5), 492)ptr1[j].append(struct.unpack("B", bf[j])) IndexError: sip.voidptr object has an unknown size2 ошибка: 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 »  |  | 
 
 От ошибок избавиться получилось, но к сожалению картинки не выдаются:У меня такое подозрение, что я не правильно заполняю ptr.А именно ошибка в коде который выполняется в циклах:# Глобальные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)
 
Может, кто знает как правильно заполнять? 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 и т.д. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |