![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
zuze |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Я пытаюсь закрасить область красным цветом за определённое время. Область будет закрашиватся каждый раз пока я не остановлю таймер.
Код:
Должно быстро закрашиватся цветом, а закрашивается, только через каждые 0.5 секунды. Почему так происходит? В Qt всё быстро закрашивается. |
|
|
Iron Bug |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
питон - интерпретатор. его скорость от 10 до 500 раз ниже, чем у кода С++, в зависимости от того, что делаешь.
|
|
|
zuze |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
питон - интерпретатор. его скорость от 10 до 500 раз ниже, чем у кода С++, в зависимости от того, что делаешь. А можно ли в коде на Python вставить код, который однозначно показывал, что виноват сам Python, а не я? Притом, такая простейшая операция, как закрашивание области цветом во времени. Мне не веритя, что такая простая операция затормаживает таймер в Python. Сообщение отредактировал zuze - 29.3.2013, 11:22 |
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
если ты утверждаешь, что Qt не тормозит, то больше не на что списать тормоза, кроме как на интерфейс между Qt и питоном.
ну и реализация алгоритма весьма странная: у тебя каждый раз вызывается процедура закрашивания точки. это вызывает целую цепочку операций, в итоге идёт обращение к графической библиотеке и это происходит для каждой точки. естественно, что это тормозит. наверняка есть более быстрые методы работы с заполнением прямоугольника цветом, чтобы не делать столько длинных вызовов. кроме того, у тебя каждый раз в каждой итерации создаётся объект QColor, да ещё и с вызовом его метода, а на любое создание объекта нужно довольно много времени. питон - интерпретатор, он не умеет оптимизировать такие сложные вещи, это надо делать самому. в общем, там много где можно опимизировать. а для измерения времени можно попробовать навставлять таймеры и писать замеренное время в какой-то лог (только не на экран, а в память, а то ещё ужаснее будут тормоза из-за самих записей). |
|
|
zuze |
![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Прямоугольная область с торможениями закрашивается красным цветом. Но вот один раз я абсолютно также сделал и прямоугольная область быстро начала зарисовыватся красным цветом.
Как будто это сбой самого Pathon-а. Решил привести полный код. Может кто увидит, где может быть ошибка и отпишется. Мой код:
Сообщение отредактировал zuze - 3.4.2013, 15:51 |
|
|
lanz |
![]()
Сообщение
#6
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
(0.005 * 1000) / 60 ~ 0 Поэтому таймер будет выстреливать так быстро как может, то есть постоянно. А в обработчике таймера его ждет такой цикл:
Т.е. картинка перегенерируется постоянно, это небыстро, отсюда и тормоза. Сообщение отредактировал lanz - 4.4.2013, 9:21 |
|
|
zuze |
![]()
Сообщение
#7
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Т.е. картинка перегенерируется постоянно, это небыстро, отсюда и тормоза. А как это поправить? У меня даже таймер
тормозит, а такой таймер необходим и в Qt работал. А почему он в Python иногда проскакивает с быстрой скоростью? Сообщение отредактировал zuze - 4.4.2013, 9:29 |
|
|
lanz |
![]()
Сообщение
#8
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата А как это поправить? Нужно картинку сгенерировать один раз, например при запуске программы. Цитата такой таймер необходим и в Qt работал Может он и в Qt тормозил, 0.8 мс это очень быстро, так быстро даже курсор мыши не обновляется, 15-30 мс более разумные рамки. Цитата А почему он в Python иногда проскакивает с быстрой скоростью? Может быть тысяча причин и ни на одну нельзя полагаться. Например удачно выпадает переключение процессов или байт код питоновский закешировался. Написание приложений реального времени в Windows сродни квантовой механике ![]() |
|
|
zuze |
![]()
Сообщение
#9
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Может он и в Qt тормозил, 0.8 мс это очень быстро, так быстро даже курсор мыши не обновляется, 15-30 мс более разумные рамки. Я сделал так
А в место 5 секунд обновляется, через каждые 3 секунды. Я делал так
Картинка через каждые 0,5 секунды обновляется. Что же с этим таймером? Сообщение отредактировал zuze - 4.4.2013, 10:27 |
|
|
lanz |
![]()
Сообщение
#10
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Если картинка не успевает обновится за 15 мс (а она наверняка не успевает) то поток блокируется до тех пор, пока она не обновится. Все это время сообщения от таймера скапливаются и будут обработаны только когда поток освободится. Поэтому и задержка, т.е. реальное время где то 0,5 секунды и быстрее не получится.
|
|
|
zuze |
![]()
Сообщение
#11
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lanz |
![]()
Сообщение
#12
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
1. Таймер в Qt. Python только вызывает функции.
2. А как были посчитаны эти 3 секунды? |
|
|
zuze |
![]()
Сообщение
#13
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
zuze |
![]()
Сообщение
#14
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Как я понял, мой коде есть ряд ошибок:
1. Код не удовлетворяет модели "модель-представление-контроллер (Model-View-Controller, MVC)". Не совсем понимаю, как это сделать. 2. Я вызываю перерисовку всего окна по таймеру и жду следующей перерисовку от таймера. Наверно надо пересовывать, только следующий кусочек. 3. Возможно я не в той функции запускаю таймер. 4. В методе MyTimer ты в не зависимости от того активен self.checkBox или нет, проверяю phi на условие и в зависимости от результата меняю его. Это я поправил, вот так:
Помогите пожалуйста разобратся с ошибочками 1-3. |
|
|
lanz |
![]()
Сообщение
#15
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Код не удовлетворяет модели "модель-представление-контроллер (Model-View-Controller, MVC)". Не совсем понимаю, как это сделать. Это не ошибка сама по себе. Не любой код должен удовлетворять такой модели. http://ru.wikipedia.org/wiki/Model-View-Controller Цитата Я вызываю перерисовку всего окна по таймеру и жду следующей перерисовку от таймера. Наверно надо пересовывать, только следующий кусочек. Основные тормоза не от этого, а скорее всего, что картинка готовится каждый раз, когда надо ее вывести:
Этот код не зависит от phi, зачем он вызывается каждый раз при перерисовке? Цитата Возможно я не в той функции запускаю таймер. Не вижу проблемы. |
|
|
zuze |
![]()
Сообщение
#16
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Основные тормоза не от этого, а скорее всего, что картинка готовится каждый раз, когда надо ее вывести:
Если дело в этом коде, то он необходим, так как тут подготавливаеться картинка, через каждый промежуток времени. А заранее подготовить нельзя, так как в будущем будет не один цвет, а много разных картинок, которые будут менятся по таймеру. Не ужели для такой простой задачи в Python без потоков не обойтись? На всякий случай прикрепляю два фала ld.py и ld.ui лежащих в архиве ld.zip. Возможно они помогут решить проблему с торможением. Сообщение отредактировал zuze - 8.4.2013, 9:58
Прикрепленные файлы
|
|
|
zuze |
![]()
Сообщение
#17
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Решил проверить время выполнения кода.
Какие-то странные результаты, хотя я поставил таймер 5000 миллисекунд. А сами результаты такие: 0.836999893188 0.838999986649 0.837999820709 0.832000017166 0.836999893188 Сообщение отредактировал zuze - 8.4.2013, 10:21 |
|
|
lanz |
![]()
Сообщение
#18
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Все правильно, подготовка картинки занимает почти секунду.
Цитата Если дело в этом коде, то он необходим, так как тут подготавливаеться картинка, через каждый промежуток времени. Картинку необязательно готовить каждый кадр, можно ее готовить только когда возникнет необходимость в новой. |
|
|
zuze |
![]()
Сообщение
#19
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Картинку необязательно готовить каждый кадр, можно ее готовить только когда возникнет необходимость в новой. У меня необходимость постоянная в выводе картинок. Сначала берутся значения из двоичного файла и рисуеться картинка, через определённый промежуток времени. Затем рисуется картинка из второго файла, а первая картинка, как бы затираеться. Затем рисуеться картинка из третьего файла, а вторая картинка, как бы затираеться. Схема вывода картинок: _______________________________ |-----------------------|------------------------| |Первая картинка | Фон -----------------| |-----------------------|------------------------| _______________________________| ________________________________ |-----------------------|------------------------| |Вторая картинка | Первая картинка | |-----------------------|------------------------| _______________________________| _______________________________ |----------------------|-------------------------| |Третья картинка | Вторая картинка | |----------------------|------------------------| ______________________________| и так далее. Сообщение отредактировал zuze - 8.4.2013, 10:50 |
|
|
lanz |
![]()
Сообщение
#20
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Это все понятно, но картинка обновляется только когда начинает рисоваться новая, а не каждый шаг (по phi) отрисовки картинки.
|
|
|
zuze |
![]()
Сообщение
#21
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lanz |
![]()
Сообщение
#22
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Нет, я о том чтобы убрать вот это
|
|
|
zuze |
![]()
Сообщение
#23
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lanz |
![]()
Сообщение
#24
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Туда, где загружается картинка.
|
|
|
zuze |
![]()
Сообщение
#25
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
zuze |
![]()
Сообщение
#26
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lanz |
![]()
Сообщение
#27
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Потому что время замеряется ВНУТРИ одного вызова и показывает сколько времени проходит ВНУТРИ отрисовки, а не МЕЖДУ вызовами таймера.
Все зависит от того, как генерируются картинки. Они берутся не из файла, так откуда же? |
|
|
zuze |
![]()
Сообщение
#28
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Все зависит от того, как генерируются картинки. Они берутся не из файла, так откуда же? Значения беруться из двоичного файла и заносяться в список. То есть в будущем будет такой код:
Это аналог кода в Qt который выгляжит так:
|
|
|
lanz |
![]()
Сообщение
#29
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Это я помню
![]() В Qt этот код был не в paintEvent. |
|
|
zuze |
![]()
Сообщение
#30
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lanz |
![]()
Сообщение
#31
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
И в том треде я писал, что надо вынести этот код из таймера.
И вообще, насколько я помню файлы запрещено использовать, значит данные будут приходить не из файлов, а каким то другим путем. Из сокетов или из порта/карты захвата. Значит надо формировать картинки по событию поступления их в программу. И добавлять в очередь например, но каждый кадр перерисовывать их нельзя. |
|
|
zuze |
![]()
Сообщение
#32
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
И вообще, насколько я помню файлы запрещено использовать, значит данные будут приходить не из файлов Так как это эмуляция, то в настоящий момент использую файлы. Как я понял всё работает прекрасно, если избавится от циклов. Вот код:
То есть мне надо избавится от циклов в двух моментах: 1. Вывод изображений на экран. 2. Заполнения объекта QImage значениями из файла. Если я в пункте номер 1 избавляюсь от циклов с помощью drawImage, то от циклов во втором пункте я не смог изавится. Может кто знает, как избавится от циклов в обоих пунктах? Сообщение отредактировал zuze - 9.4.2013, 9:59 |
|
|
lanz |
![]()
Сообщение
#33
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Во втором пункте никак не избавиться.
С какой скоростью появляются новые картинки? |
|
|
zuze |
![]()
Сообщение
#34
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lanz |
![]()
Сообщение
#35
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
А сколько времени должна рисоваться одна картинка?
|
|
|
zuze |
![]()
Сообщение
#36
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А сколько времени должна рисоваться одна картинка? Самая маленькая скорость появление следующей картинки будет, через 10 секунд, а самая большая скорось появление следующей картинки будет, через 0,05 секунды. При скорости рисовании картинки 0,05 * 1000 мс, рисования одного кусочка картинки (0,05 * 1000) / 60 мс При скорости рисовании картинки 10 * 1000 мс, рисования одного кусочка картинки (10 * 1000) / 60 мс То есть за время "0,05 * 1000 мс" или "10 * 1000 мс" рисунок нарисуется полностью за 60 раз срабатывания таймера. Сообщение отредактировал zuze - 10.4.2013, 15:55 |
|
|
lanz |
![]()
Сообщение
#37
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Очень странные цифры, за 50 мс - это два - три кадра, зачем перерисовывать картинку 60 раз?
И если надо так быстро получать картинки, используйте numpy например, а потом загружайте картинку напрямую через QImage::scanline () |
|
|
zuze |
![]()
Сообщение
#38
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
зачем перерисовывать картинку 60 раз? Я не всю картинку перерисовываю 60 раз, а я дорисовываю, кусочек картинки каждый раз и полностью картинка появляется когда пройдёт таймер 60 раз. И если надо так быстро получать картинки, используйте numpy например, а потом загружайте картинку напрямую через QImage::scanline()
Но вот как правильно загрузить я не понял. Помогите пожалуйста это понять. Я пробовал так сделать:
Для вывода так делаю:
Выдаётся вот такая ошибка: im = QtGui.QImage.__init__(self, self, 492, 720, self.Format_Indexed8) TypeError: 'sip.methoddescriptor' object is not callable Я пробовал в место
Написать
Пробоывал ещё так:
Таже самая ошибка. Не знаю важно или нет, но у меня Python 2.6 Как я понял я не правильно конструктор определил, а вот как правильно не понимаю. Помогите пожалуйста понять. Сообщение отредактировал zuze - 15.4.2013, 9:12 |
|
|
zuze |
![]()
Сообщение
#39
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Сделал так:
Это ошибка пропадает. Но в момент первого срабатывания таймера возникает ошибка: Появляется окно с выбором из трёх кнопок: 1 кнопка (Искать решение проблемы в Интернете и закрыть программу) 2 кнопка (Закрыть программу) 3 кнопка (отладить программу) А текстом пишется: Process finished with exit code -1073741819 В чём может быть дело? |
|
|
lanz |
![]()
Сообщение
#40
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Ошибка при работе с памятью скорее всего, видимо с размером что то напутано.
Выложите проект, попробую потыркать. |
|
|
zuze |
![]()
Сообщение
#41
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Выложите проект, попробую потыркать.
К сожалению я немогу дать Вам файл. Можно использовать любую строку длинной 492 * 720, только тогда не нужен код:
Прикреплённый архив содержит ld.ui Может дело в a.tostring(), которая вроде не всегда стабильно работает. Может какой другому можно подготовить данные из файла, что бы из загрузить затем в объект QImage? Сообщение отредактировал zuze - 15.4.2013, 14:15
Прикрепленные файлы
|
|
|
lanz |
![]()
Сообщение
#42
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
1. Не нужно вызывать update в методе paintEvent это плодит ненужные циклы отрисовки.
2. Если используете Indexed8, то нужно определить таблицу цветов, Цитата If format is an indexed color format, the image color table is initially empty and must be sufficiently expanded with setColorCount() or setColorTable() before the image is used. 3. Если используете ARGB32, то байт должно быть в 4 раза больше (красная, зеленая, синияя и альфа - компоненты) т.е. размер файла должен быть 492*720*4. 4. data должен быть валиден в течении всего времени жизни картинки. (т.е. не должен быть локальной переменной) Цитата The buffer must remain valid throughout the life of the QImage. The image does not delete the buffer at destruction. Это происходит потому что вызывается конструктор с неконстантным первым uchar*. 5. Эти преобразования бесполезны.
То же самое будет если сделать
|
|
|
zuze |
![]()
Сообщение
#43
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Я сделал так:
В этом коде случилось следующие: 1. update в методе paintEvent. 2. В место собственных функций преобразование из радиан в градусы и обратно использовал стандартные. 3. Преобразование строки заменил на такое data = fp.read() Я незнаю как сделать im локально, так как я im использую в MyTimer(), но также я im использую в MyDraw(). Подскажите пожалуйста, как это сделать? Эти преобразования бесполезны.
Не знаю на сколько они безполезны, но если в циклах заполняем im сзначениями из a, то всё прекрасно, картинка рисуется, но медленно. Вот я немного удивлён, что эти преобразования бесполезны. |
|
|
lanz |
![]()
Сообщение
#44
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Я незнаю как сделать im локально, так как я im использую в MyTimer(), но также я im использую в MyDraw(). Подскажите пожалуйста, как это сделать? Не надо делать im локальным, надо сделать data глобальным/членом класса. data должна существовать после того как управление выйде из MyTimer поскольку коструктор QImage сохраняет только указатель на дату. Цитата Вот я немного удивлён, что эти преобразования бесполезны. Это я проглядел что массив флипается. |
|
|
zuze |
![]()
Сообщение
#45
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Не надо делать im локальным, надо сделать data глобальным/членом класса. data должна существовать после того как управление выйде из MyTimer поскольку коструктор QImage сохраняет только указатель на дату. Сделал в конструкторе класса, так:
Сделал в MyTimer
И всё равно, таже ошибка? |
|
|
lanz |
![]()
Сообщение
#46
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Конечно. Загружаете 720*492 байт, а картинке говорите что их 720*492*4 (Format_ARGB32)
|
|
|
zuze |
![]()
Сообщение
#47
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lanz |
![]()
Сообщение
#48
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Можно использовать Format_Indexed8, только нужно обязательно задать таблицу цветов.
http://qt-project.org/doc/qt-4.8/qimage.html#setColorTable |
|
|
zuze |
![]()
Сообщение
#49
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Можно использовать Format_Indexed8, только нужно обязательно задать таблицу цветов. Сделал так:
Всё равно, тажа ошибка. Сообщение отредактировал zuze - 16.4.2013, 12:21 |
|
|
lanz |
![]()
Сообщение
#50
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
setColorTable нужно вызывать у конкретного экземпляра QImage, кроме того туда нужно передать вектор цветов, а не один цвет.
Сообщение отредактировал lanz - 16.4.2013, 12:49 |
|
|
zuze |
![]()
Сообщение
#51
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
setColorTable нужно вызывать у конкретного экземпляра QImage, кроме того туда нужно передать вектор цветов, а не один цвет. Сделал, так:
Всё равно, таже ошибка. Надеюсь Вы не забыли, что каждый байт двоичного файла это цвет модели RGB. Возможно из-за этого не надо было использовать Format_Indexed8, а что-то другое. Сообщение отредактировал zuze - 16.4.2013, 13:00 |
|
|
lanz |
![]()
Сообщение
#52
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Вектор - это массив цветов. Цитата Надеюсь Вы не забыли, что каждый байт двоичного файла это цвет модели RGB И как эти цвета в нем упакованы? Сообщение отредактировал lanz - 16.4.2013, 14:00 |
|
|
zuze |
![]()
Сообщение
#53
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
И как эти цвета в нем упакованы? Сначала идёт служебная информация, которую мы пропускаем смещением начала чтения данных из файла. Первый байт после управляющих символов - это R = 1-й байт, G = 1-й байт, B = 1-й байт. Второй байт следующая точка в цветности RGB по токомуже принципу. В результате получаеться прямоугольная область с рисунком. Сделал примерно как у Вас, только в место data, у меня self.data
Всё равно, таже ошибка. Сообщение отредактировал zuze - 16.4.2013, 14:16 |
|
|
lanz |
![]()
Сообщение
#54
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Первый байт после управляющих символов - это R = 1-й байт, G = 1-й байт, B = 1-й байт. Второй байт следующая точка в цветности RGB по токомуже принципу. Арифметика - царица наук ![]() Каждая точка занимает три байта. Размер картинки - 720*492 точки. Вопрос - сколько байт занимает картинка? И сравните ответ с тем что вы написали вот тут: Раскрывающийся текст
Кстати такой формат есть - RGB888 Сообщение отредактировал lanz - 16.4.2013, 14:39 |
|
|
zuze |
![]()
Сообщение
#55
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Вопрос - сколько байт занимает картинка? Размер файла у меня 492*720 + 8 байт. Я сместил на 8 байт, так как они управляющие. R = 1-й байт, G = 1-й байт, B = 1-й байт - этим я хотел показать, что на кажом иттерации цика, если он был значения R, G и B равны. Общая картинка бы нартсовалась когда бы прошли циклы такие:
Сделал так:
Таже ошибка. Сообщение отредактировал zuze - 16.4.2013, 14:46 |
|
|
lanz |
![]()
Сообщение
#56
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
У меня все отрисовывается без ошибок.
Возможно проблема в загрузке файла. Можете файл забить каким то одним значением и выложить вместе с проектом? |
|
|
zuze |
![]()
Сообщение
#57
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 211 Регистрация: 4.11.2012 Пользователь №: 3589 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
lanz, прошу прощения, что не отвечал, был в отпуске.
Всё равно тут цикл хоть и один. Пешил воспользоваться библиотекой matplotlib, так как вроде она сразу выводить массив на экран. Пока хочу целиком картинку вывести. Вот код:
Картинка выводится в отельном окне, но к сожалению ошибки:
Ошибка такая: 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 Может это из-за того, что в отельном окне всё рисуется? И ещё вопросик: как переделать
Чтобы получилось аналог этого:
Может я зря воспользоваться библиотекой matplotlib, а можно было воспользоватся библиотекой PIL (Python Imaging Library)? Но я, что-то не нашёл функции для рисования картинки по данным из двухмерного массива. Сообщение отредактировал zuze - 8.5.2013, 13:17 |
|
|
lanz |
![]()
Сообщение
#58
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
С выводом картинки, насколько я понял проблем нет. Тормозит тогда, когда картинка пересоздается.
Matplotlib и PIL не нужны, поскольку вы используете ту же функциональность Qt(setPixel/drawImage). |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 7.4.2025, 9:57 |