Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно использовать метод bits()  (Прочитано 205002 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zuze
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 10-06-2013 12:53 » 

а в чем собственно вопрос

Код: (Python)
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
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #3 : 10-06-2013 13:12 » 

а в чем собственно вопрос

Код: (Python)
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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 10-06-2013 13:57 » 

я нихрена не смыслю в питоне.
только чуть-чуть знаком с синтаксисом.

ты получаешь указатель на массив, затем получаешь его размер.
И, наверное, он уже доступен как массив.

В конце концов, поищи примеры с bits() и что делают с этим указателем дальше.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline 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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 11-06-2013 06:14 » 

сомневаюсь
Код: (Python)
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
Опытный

ru
Offline 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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 11-06-2013 06:35 » 

zuze, я специально выделил код
А что новая пустая строка означает закрытие программного блока?
Или все же выравнивание отступов?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 11-06-2013 06:39 » 

Выравнивание. Причем табуляция не заменяет N пробелов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 11-06-2013 06:42 » 

а ты уверен, что  ptr = bf[j] верное решение?
ведь ptr это некий указатель на объект, а ты его превращаешь, в  int
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #12 : 11-06-2013 06:43 » 

Выравнивание. Причем табуляция не заменяет N пробелов.

Если Вы говорите о пустой строке между двойными циклами, то это я для лучшего восприятия на глаз сделал.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #13 : 11-06-2013 06:45 » 

а ты уверен, что  ptr = bf[j] верное решение?
ведь ptr это некий указатель на объект, а ты его превращаешь, в  int

Значит нужен какой-то механизм, который и не нарушал типы данных, но при этом мог добавлять значения в ptr, но пока не знаю как это сделать.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 11-06-2013 06:47 » 

zuze, та ладно... уже проехали... причина понятна - описка.

Вот потому они и используют метод преобразования данных по указателю в массив.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 11-06-2013 06:52 » 

НО может есть другой метод в библиотеке?

Хотя...
Я все же подозреваю
что ptr доступен как массив (надо только понять его мерность - одно или двух), а добавляя новые элементы нужно  менять и размер
может при append это делается автоматически

Что manual по этому поводу говорит?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #16 : 11-06-2013 06:59 » 

Вот потому они и используют метод преобразования данных по указателю в массив.

К сожалению использовать массивы я не могу, так как это будет опять возвращение к setPixel, а я специально стараюсь от этого метода уйти.

НО может есть другой метод в библиотеке?

Есть ещё один метод, но у меня задача проверить оба метода. По другому методу я обращался и ещё буду думаю сюда обращаться.

Что manual по этому поводу говорит?

Пока весь manual связанный с этим методом нашёл только для Qt. Для Python мало, что есть, но буду стараться найти.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 11-06-2013 07:10 » 

zuze,
Более быстрого доступа к элементу, чем прямой еще никто не придумал

 setPixel, это управление пикселем уже на устройстве вывода?

Но это суть разные вещи. Ты сначала обрабатываешь весь буфер, а потом отдаешь его на вывод
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 11-06-2013 07:58 » 

Меня вот удивляет, что автор гонится за скоростью и пытается лезть в биты, хотя сам читает файл побайтово.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #20 : 11-06-2013 08:03 » 

Меня вот удивляет, что автор гонится за скоростью и пытается лезть в биты, хотя сам читает файл побайтово.

Тут я не спорю. Мне было поставлена задача заменить setPixel на работу с методом bits и посмотреть на скорость.
Я проверяю разные участки кода разными методами на быстродействие.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 11-06-2013 08:05 » 

конечно
ptr[j].append - нет такого метода у строки
ptr.append
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline 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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 11-06-2013 08:45 » new

ну...? все верно... нет такого метода.
http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/sip-4.10/doc/html/python_api.html
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #24 : 13-06-2013 06:07 » 

ну...? все верно... нет такого метода.
http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/sip-4.10/doc/html/python_api.html

Если такого метода нету, то надо, как-то присвоением сделать.

Я пытался так:

Код:
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
и т.д.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines