crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как правильно использовать метод bits(), Python
zuze
  опции профиля:
сообщение 10.6.2013, 14:33
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я бы хотел узнать, как нужно присваивать значения методу 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 - 10.6.2013, 14:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.6.2013, 14:45
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а я и второй пример не понял (к стати, в обоих случаях ты используешь Qt)

во втором примере, где объявление ptr?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 10.6.2013, 14:49
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.6.2013, 14:45) *
во втором примере, где объявление ptr?


ptr = QImage::bits();

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.6.2013, 15:00
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я вижу присваивание,а не объявление.
Какого типа переменная ptr?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 10.6.2013, 15:04
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.6.2013, 15:00) *
я вижу присваивание,а не объявление.
Какого типа переменная ptr?


Тип переменной ptr - uchar *, но зачем это знать всё равно нету в Python-е типов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.6.2013, 15:40
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(zuze @ 10.6.2013, 17:04) *
всё равно нету в Python-е типов
есть!
просто тип определяется "на лету", но типы есть.

Цитата(zuze @ 10.6.2013, 17:04) *
но зачем это знать
чтобы понять твой пример написанный на Си++
Если считать, что ptr объявлен так:
uchar *ptr;

то как понимать запись:
ptr[j][i] = ...

ведь объявлен не массив, ты где-то создаёшь динамический массив?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 10.6.2013, 15:41
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я думал надо сделать так:

// Глобальные
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'

Сообщение отредактировал zuze - 10.6.2013, 15:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.6.2013, 8:54
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


От ошибок избавиться получилось, но к сожалению картинки не выдаются:

# Глобальные
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]


Может, кто знает как правильно заполнять?

Сообщение отредактировал zuze - 11.6.2013, 9:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 18.6.2013, 9:46
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(zuze @ 11.6.2013, 9:54) *
for j in range(0, 720, 1): for i in range(491, -1, -1): ptr = bf[j]
в этом цикле ты перетираешь ptr значением bf[j].
тебе нужно делать так:
ptr[j] = bf[j]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 0:39