crossplatform.ru

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

6 страниц V  « < 4 5 6  
Ответить в данную темуНачать новую тему
> Торможения таймера при рисовании, Python
zuze
  опции профиля:
сообщение 16.4.2013, 13:00
Сообщение #51


Участник
**

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

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




Репутация:   0  


Цитата(lanz @ 16.4.2013, 12:48) *
setColorTable нужно вызывать у конкретного экземпляра QImage, кроме того туда нужно передать вектор цветов, а не один цвет.


Сделал, так:

im.setColorTable(QtGui.QVector4D(QtGui.qRgba(255, 0, 0, 255)))


Всё равно, таже ошибка.

Надеюсь Вы не забыли, что каждый байт двоичного файла это цвет модели RGB. Возможно из-за этого не надо было использовать Format_Indexed8, а что-то другое.

Сообщение отредактировал zuze - 16.4.2013, 13:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 16.4.2013, 13:59
Сообщение #52


Старейший участник
****

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

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




Репутация:   8  


            im = QtGui.QImage(data, 492, 720, QtGui.QImage.Format_Indexed8)
            colortable = []
            for i in xrange(255):
                colortable.append (QtGui.qRgb(i, i, i))
            im.setColorTable (colortable);            
            self.update()


Вектор - это массив цветов.

Цитата
Надеюсь Вы не забыли, что каждый байт двоичного файла это цвет модели RGB

И как эти цвета в нем упакованы?

Сообщение отредактировал lanz - 16.4.2013, 14:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 16.4.2013, 14:07
Сообщение #53


Участник
**

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

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




Репутация:   0  


Цитата(lanz @ 16.4.2013, 13:59) *
И как эти цвета в нем упакованы?


Сначала идёт служебная информация, которую мы пропускаем смещением начала чтения данных из файла.
Первый байт после управляющих символов - это R = 1-й байт, G = 1-й байт, B = 1-й байт. Второй байт следующая точка в цветности RGB по токомуже принципу.
В результате получаеться прямоугольная область с рисунком.

Сделал примерно как у Вас, только в место data, у меня self.data

im = QtGui.QImage(self.data, 720, 492, QtGui.QImage.Format_Indexed8)

colortable = []
for i in xrange(255):
       colortable.append (QtGui.qRgb(i, i, i))
       im.setColorTable(colortable)


Всё равно, таже ошибка.

Сообщение отредактировал zuze - 16.4.2013, 14:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 16.4.2013, 14:36
Сообщение #54


Старейший участник
****

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

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




Репутация:   8  


Цитата
Первый байт после управляющих символов - это R = 1-й байт, G = 1-й байт, B = 1-й байт. Второй байт следующая точка в цветности RGB по токомуже принципу.

Арифметика - царица наук :lol:


Каждая точка занимает три байта.
Размер картинки - 720*492 точки.

Вопрос - сколько байт занимает картинка?

И сравните ответ с тем что вы написали вот тут:
Раскрывающийся текст
fp.seek(0, 2)
size = fp.tell()
fp.seek(size - (492*720), 0)


Кстати такой формат есть - RGB888

Сообщение отредактировал lanz - 16.4.2013, 14:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 16.4.2013, 14:41
Сообщение #55


Участник
**

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

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




Репутация:   0  


Цитата(lanz @ 16.4.2013, 14:36) *
Вопрос - сколько байт занимает картинка?


Размер файла у меня 492*720 + 8 байт. Я сместил на 8 байт, так как они управляющие.
R = 1-й байт, G = 1-й байт, B = 1-й байт - этим я хотел показать, что на кажом иттерации цика, если он был значения R, G и B равны.
Общая картинка бы нартсовалась когда бы прошли циклы такие:

for j in range(0, 720, 1):
       for i in range(491, -1, -1):


Сделал так:

# Глобально
im = QtGui.QImage(720, 492, QtGui.QImage.Format_RGB888)

# В конструкторе
self.data = []

# В MyTimer()
a = numpy.fromfile(fp, dtype=numpy.uint8)
a = numpy.flipud(a.reshape((720, 492), order='F'))
self.data = a.tostring()

im = QtGui.QImage(self.data, 720, 492, QtGui.QImage.Format_RGB888)


Таже ошибка.

Сообщение отредактировал zuze - 16.4.2013, 14:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 16.4.2013, 15:42
Сообщение #56


Старейший участник
****

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

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




Репутация:   8  


У меня все отрисовывается без ошибок.
Возможно проблема в загрузке файла. Можете файл забить каким то одним значением и выложить вместе с проектом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 7.5.2013, 10:53
Сообщение #57


Участник
**

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

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




Репутация:   0  


lanz, прошу прощения, что не отвечал, был в отпуске.

Всё равно тут цикл хоть и один.

Пешил воспользоваться библиотекой matplotlib, так как вроде она сразу выводить массив на экран. Пока хочу целиком картинку вывести.

Вот код:

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

from PyQt4 import QtCore, QtGui, uic
import numpy
import math
import os
import struct
import matplotlib.pyplot as plt

dir = os.path.join(os.getcwd(), "file")
phi = 0.0

a = []

class ld(QtGui.QDialog):
    def __init__(self, parent=None):
        super(ld, self).__init__(parent)
        self.ui = uic.loadUi("ld.ui", self)

        self.connect(self.ui.radioButton_2, QtCore.SIGNAL("clicked()"), self.MyClickRect)

        self.timer = QtCore.QTimer()
        self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.MyTimer)
        self.timer.setInterval(5000)
        self.timer.start()

    def paintEvent(self, QPaintEvent):
        if self.ui.radioButton_2.isChecked():
            painterRect = QtGui.QPainter(self)
            painterRect.setBrush(QtGui.QColor('black'))
            painterRect.drawRect(50, 50, 720, 492)
            self.MyDraw()

    def MyClickRect(self):
        self.update()

    def MyTimer(self):
        global dir
        global phi
        global fp
        global a

        if self.ui.checkBox_4.isChecked():
            os.chdir(dir)
            try:
                fp = open("1.dat", "rb")

            except IOError:
                print "Cannot open file read!"

            fp.seek(0, 2)
            size = fp.tell()
            fp.seek(size - (492*720), 0)

            a = numpy.fromfile(fp, dtype=numpy.uint8)
            a = numpy.flipud(a.reshape((492, 720), order='F'))
            a.tostring()

        self.update()

        if self.ui.radioButton_2.isChecked():
            if int((math.degrees(phi)+0.5)*720)/360 < 720:
                phi += math.radians(6.0)
            else:
                phi = math.radians(6.0)

    def MyDraw(self):
        plt.imshow(a, interpolation="none")
                plt.show()

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    window = ld()
    window.show()

    sys.exit(app.exec_())


Картинка выводится в отельном окне, но к сожалению ошибки:

plt.imshow(a, interpolation="none")


Ошибка такая:

File "D:/PythonProject/l/ld.py", line 44, in paintEvent
self.MyDraw()
File "D:/PythonProject/l/ld.py", line 100, in MyDraw
plt.imshow(a, interpolation="none")
File "D:\Python26\Lib\site-packages\matplotlib\pyplot.py", line 2737, in imshow
imlim=imlim, resample=resample, url=url, **kwargs)
File "D:\Python26\Lib\site-packages\matplotlib\axes.py", line 7105, in imshow
im.set_data(X)
File "D:\Python26\Lib\site-packages\matplotlib\image.py", line 422, in set_data
raise TypeError("Invalid dimensions for image data")
TypeError: Invalid dimensions for image data

Может это из-за того, что в отельном окне всё рисуется?

И ещё вопросик: как переделать

plt.imshow(a, interpolation="none")


Чтобы получилось аналог этого:

Tochka.drawImage(0, 0, im, 0, 0, int((2*math.degrees(phi))+0.5), 492)


Может я зря воспользоваться библиотекой matplotlib, а можно было воспользоватся библиотекой PIL (Python Imaging Library)?
Но я, что-то не нашёл функции для рисования картинки по данным из двухмерного массива.

Сообщение отредактировал zuze - 8.5.2013, 13:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 14.5.2013, 9:30
Сообщение #58


Старейший участник
****

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

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




Репутация:   8  


С выводом картинки, насколько я понял проблем нет. Тормозит тогда, когда картинка пересоздается.
Matplotlib и PIL не нужны, поскольку вы используете ту же функциональность Qt(setPixel/drawImage).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V  « < 4 5 6
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 18.4.2024, 8:18