forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   canvas: аналог GetPixel или как ? (http://forum.boolean.name/showthread.php?t=8888)

Tronix 12.08.2009 23:37

canvas: аналог GetPixel или как ?
 
Всем привет.
Вообщем наигрался я с текстовыми мидлетами, захотелось попробовать что-нить порисовать :) Сейчас пишу простенькую прогу - хочу чтоб рисовала молнии. Для полного счастья хочу на уже созданном изображении в канве применить эффект Blur (размытие). Думаю делать примитивным способом - округление 8 близлежащих точек. Но сталкнулся с трудностью - а как получить пиксель (его цвет) из канвы по координатам x,y?

Смотрю в справку и вижу только Plot(x,y). А мне как-бы наоборот нужно... Еще есть некая ImageFromCanvas, которая возвращает тип image. Впринципе, то что нужно, но вот можно-ли как-то этот тип image обрабатывать, например как массив или еще как-то?

Глянул на список библиотек, но что-то похожей функции в них не нашел. Может конечно плохо глядел.. Помогите плиз советом новичку. Заранее спасибо :)

DIMMON4IK 13.08.2009 00:46

Чуть не по теме (извини), но есть либа lib_effects, там вроде есть размытие
http://www.forum.boolean.name/showthread.php?t=7749

Tronix 13.08.2009 14:57

Ответ: canvas: аналог GetPixel или как ?
 
Цитата:

Сообщение от DIMMON4IK (Сообщение 114067)
Чуть не по теме (извини), но есть либа lib_effects, там вроде есть размытие
http://www.forum.boolean.name/showthread.php?t=7749

Спасибо, посмотрел, но либо она не работает, либо я хз. Далал примерно так:
PHP код:

img := ImageFromCanvas(0,0,GetWidth,GetHeight);
img := effect(img,5); //Blur
DrawImage(img,0,0);
Repaint

Рисовала по-моему в итоге черный экран, даже если на экране перед этим что-то было. Но еще поэксперементирую...

А пока решил использовать массив ((( Ессно тормоза, каких свет не видывал. Ни о каком либо реал-тайм и речи нет (( Что-то все время переполняеться(?), подозреваю что косяки в процедуре отрисовки линии, отловить пока не могу. Переодически виснет намертво.
Еще сталкнулся с тем, что MP разрешает запросто делить число на ноль, из-за чего соответственно зависалово мидлета.

В архиве исходники и JAR.

ViNT 13.08.2009 15:02

Ответ: canvas: аналог GetPixel или как ?
 
На счет GetPixel: такой функции нет, но в библиотеке cnv2 есть функция get_rgb, которая создает массив значений пикселов в RGB из изображения.

Tronix 13.08.2009 15:59

Ответ: canvas: аналог GetPixel или как ?
 
Цитата:

Сообщение от ViNT (Сообщение 114111)
На счет GetPixel: такой функции нет, но в библиотеке cnv2 есть функция get_rgb, которая создает массив значений пикселов в RGB из изображения.

Интересно! А не подскажите, где данную либу взять? Поиск по форуму ссылки не дал.

ViNT 13.08.2009 16:06

Ответ: canvas: аналог GetPixel или как ?
 
Вложений: 1
Забыл, там даже есть функция
function get_color(x,y:integer):integer;
так что, можно сразу ее использовать.

Вот сама либа:

Tronix 13.08.2009 18:02

Ответ: canvas: аналог GetPixel или как ?
 
Вложений: 2
Мдя, функция хороша, но ругается что-то про совместимость типов, если сделать c := het_color(50,50), где c - integer. Хотя вроде если делать s := IntegerToString(get_color(50,50)), то вроде работает... Но тут опять-же вопросы скорости: пока она в строку переведеться, пока из строки перевести в шеснадцатерицную и выципить компоненты RGB, пока их поменять и потом опять-таки рисовать Plot по точке.... Вообщем как я понимаю на MP рендерить что-либо в реальном времени не получиться.

Все больше и больше посматриваю в сторону нативной Явы ;)

Ну и выложу на всякий случай исправленный исходник демки, там минусовые значения появлялись в SetColor и line_, отчего намертво висло все. Щаз исправил. Звездочка - смена картинки, решетка - выход.

Phantom 15.08.2009 05:16

Ответ: canvas: аналог GetPixel или как ?
 
О боже, зачем тебе переводить в строку, чтобы получить rgb составляющие? Юзай битовые сдвиги.

Tronix 15.08.2009 09:36

Ответ: canvas: аналог GetPixel или как ?
 
Цитата:

Сообщение от Phantom_wc (Сообщение 114418)
О боже, зачем тебе переводить в строку, чтобы получить rgb составляющие? Юзай битовые сдвиги.

А пофигу, все равно for x := 1 to Width do for y := 1 to Height do Plot(x,y) будет тормознуто. Вот если бы можно было сразу подготовить как-то image массив и его отрисовывать DrawImage, может быть что-то и получилось бы.
Но за идею со сдвигами спасиб конешно. Знал, но забыл (

ViNT 19.08.2009 23:59

Ответ: canvas: аналог GetPixel или как ?
 
Цитата:

Сообщение от Tronix (Сообщение 114425)
Вот если бы можно было сразу подготовить как-то image массив и его отрисовывать DrawImage, может быть что-то и получилось бы.

Вообще там есть функции, позволяющие получить массив из Image и Image из массива, или не это требуется?

Tronix 20.08.2009 11:23

Ответ: canvas: аналог GetPixel или как ?
 
Вложений: 1
Цитата:

Сообщение от ViNT (Сообщение 115358)
Вообще там есть функции, позволяющие получить массив из Image и Image из массива, или не это требуется?

Это и требуется, но была бы к ней еще коротенькая справочка какая-нибуть... Сейчас только смотрю в декомпилированный класс, но пока не очень понятны параметры. Буду разбираться....

А так еще немного оптимизировал демку, стала раза в два побыстрее работать. Исходники прилогаються.

cherepets 20.08.2009 14:27

Ответ: canvas: аналог GetPixel или как ?
 
Tronix, новая демка у меня не работает на телефоне (белый экран и зависание), на кэмуле тоже самое. sj boy справляется отлично...
А та которая 13.08.2009, 13:02 нормально работала.

abcdef 21.08.2009 10:39

Ответ: canvas: аналог GetPixel или как ?
 
Вложений: 1
оптимизировал демку Tronix'а

Tronix 21.08.2009 13:30

Ответ: canvas: аналог GetPixel или как ?
 
Цитата:

Сообщение от cherepets (Сообщение 115430)
Tronix, новая демка у меня не работает на телефоне (белый экран и зависание), на кэмуле тоже самое. sj boy справляется отлично...
А та которая 13.08.2009, 13:02 нормально работала.

Ну значит чего-то опять в минусовые значения уходит, отлавливать уже лениво. Вообще угнетает конечно в мидлетах от MP отсутствие какого-либо обработчика ошибок деления/переполнения/не верных значений. Сложно смотреть чего там и почему переполняеться или в минус уходит только лишь с помощью Debug(); Прикиньте - крутяться четыре цикла, в них еще циклы - и потом в логе на 16 метров еще надо понять почему какая-нить переменная в минуса ушла. Неудобно вообщем ящитаю.
Угнетает то, что в некоторых встроенных функциях опять-таки нет защиты от дурака, на подобии SetColor(-1,0,0). В этом случае мы получаем глухой зависон, а не какойнибуть сообщение типа Run-time error: invalid parameter или типа того.

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

Tronix 21.08.2009 13:34

Ответ: canvas: аналог GetPixel или как ?
 
Цитата:

Сообщение от abcdef (Сообщение 115580)
оптимизировал демку Tronix'а

Да, спасибо, понял принципы. Юзал процедуры в основном для читабельности кода. Но что-то там с функцией рисования линии по-моему не так. Как-то она отрывисто получается. Ну да это не важно, я уже забил на эту демку.

Сейчас пробую огонь сделать. Разбираюсь с lib_cnv2 потихоньку.

PS: Спасибо всем за проявленный интерес к теме, всем поставил плюсы ;)
Тему пока попрошу не закрывать, чувствую будут еще вопросы у меня к вам, уважаемые гуру :)

Tronix 25.08.2009 15:45

Ответ: canvas: аналог GetPixel или как ?
 
Вложений: 2
Вот набросал небольшую демку c эффектом огня...
Но пока опять выводит через стандартные функции MP. И опять тормозит (( Вроде и цикл то теперь небольшой - [1..30,1..60], а все равно.
Как работать с ARGB массивами в lib_cnv2 не разобрался.

Может дадите простой пример - типа создаем ARGB массив, в нем рисуем точку с координатами 50,50 цветом RGB, выводим этот массив на экран. ? :''((

UPD: Вроде кое-как разобрался. Написал свою либу -) Щаз будем эксперементировать...

DIMMON4IK 25.08.2009 18:18

Ответ: canvas: аналог GetPixel или как ?
 
Красиво!:super:

odd 28.08.2009 08:24

Ответ: canvas: аналог GetPixel или как ?
 
Есть библиотека Lib_beta называется. Там можно просто задать картинку 30*60 и рисовать по ней стандартными методами из MP, а потом с данной картинкой можно делать что угодно. Можно добавить прозрачный фон (Lib_alpha) и вывести на экран.

abcdef 28.08.2009 12:00

Ответ: canvas: аналог GetPixel или как ?
 
Вложений: 1
немного оптимизировал демку огня
p.s.: Tronix - неплохо придумал с зажигалкой :)

odd 29.08.2009 12:19

Ответ: canvas: аналог GetPixel или как ?
 
Красиво. Неплохая идея с огнем.

Tronix 31.08.2009 11:24

Ответ: canvas: аналог GetPixel или как ?
 
Спасибо за коментарии. Вернулся с дачи, сейчас буду продолжать мучиться над терминалкой.

Цитата:

Сообщение от abcdef (Сообщение 116571)
немного оптимизировал демку огня
p.s.: Tronix - неплохо придумал с зажигалкой :)

Спасибо, посмотрел, но есть некие сомнения насчет использования одномерного массива - получается, что в основном цикле есть 7 умножений, а операция эта афаик на любых процессорах не быстрая. Хотя я не знаю, как MP работает с двумерными массивами. Может точно так же использует одномерный и через умножение высчитывает смещение...
И потом еще одно: где выполняются циклы for x, for y нужно блюрить именно начиная с первых элементов массива, потому что если начинать с конца - получаеться эффект "воды", а не огня. На таком маленьком огне это не очень заметно, но если он будет чуть больше - это будет видно.
И еще хотел спросить - а имеет ли большое значение делать в циклах downto ? Мне почему-то кажется, что нет.
Ну и создание палитры можно было не оптимизировать - она же один раз только считается, перед началом основного цикла.

В любом случае спасибо за проявленный интерес. Вообще, abcdef, не планируешь написать что-то типа тутора или хау-то по теме оптимизации программ применительно к MP? По-моему у тебя бы прекрасно это вышло )

DIMMON4IK 31.08.2009 19:50

Ответ: canvas: аналог GetPixel или как ?
 
А может тему стоит переименовать?
Напр. на: Визуальные эфекты в MP:-D
canvas: аналог GetPixel или как ? - тема не очень соответствует названию

abcdef 01.09.2009 17:35

Ответ: canvas: аналог GetPixel или как ?
 
немного о составлении программ
По оптимизиции можно найти много подробной доки, подойдет любая т.к. принципы практически одни и те же, только встречаются некоторые ньюансы, так для прочессоров x86 самые быстрые циклы это уменьшение до нуля, т.к. инструкция декремента выставляет флаг переполнения если результат становится отрицательным, т.е. не нужно использовать медленную команду сравнения. Кроме того самые быстрые команды сравнения - это сравнение с нулем.

В java (как и MP) есть набор инструкций с константами 0,1,2 которые работают чуть быстрее, это однобайтовые команды и их зачения не грузятся из константного пула.

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

в циклах крайнее значение нужно делать константой (числом), как уже говорил желательно 0, ну или на худой конец переменной, т.к. крайнее значение вычисляется при каждой итерации.

немного о размере программы: старайтесь записывать алгоритмы настолько эффективно, как только это возможно, т.к. когда-нить пригодятся эти куски кода в других разработках.
имена глобальных переменные желательно делать короче, в подпрограммаx MP все равно ставит свои короткие имена, но тоже старайтесь чтоб имена выглядели однообразно в каждой подпрограмме.
__
Вообще оптимизация под java не всегда очевидна: мелкие корректировки на некоторых устройствах не заметны, т.к. различны реализации java-машин, поэтому лучшая оптимизация - привильно спроектированный алгоритм, не содержащий лишних команд. Сам когда сажусь писать алгоритм, вопрос который задаю себе-"что еще здесь можно упростить?"
часто попадаются хорошо написанные программы, но не совсем корректно разбитые на управляющие конструкции, т.е. планировка кода по подпрограммам: всегда стараюсь разбить программу на основные алгоритмы, работающие не зависимо друг от друга и использующие минимум глобальных переменных, и единую управляющую конструкцию связывающую в одном месте вместе алгоритмы. так модифицировать программу, но чрезмерная разбивка тоже вредна, т.к. на загрузку подпрограммы тоже уходит время.
__

p.s.: про туториалы - так я этим и занимаюсь в свободное время, только применительно к уже готовым программкам, потому что изредка, но попадаются интересные кусочки алгоритмов

Nextovoy 08.01.2012 13:04

Ответ: canvas: аналог GetPixel или как ?
 
Мне бы очень хотелось знать все функции библиотеки cnv2, так как в java я практически не разбираюсь, а смотреть на код декомпилированного класса и пытаться постичь функции библиотеки не дают мне результатов.

p.s.: Я очень надеюсь что несмотря на даты сообщений кто-нибудь ответит мне


Часовой пояс GMT +4, время: 00:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot