forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Обезцветить спрайт (http://forum.boolean.name/showthread.php?t=12766)

teremochek 29.06.2010 14:17

Обезцветить спрайт
 
Скажите, можно-ли каким-нибуть образом обезцветить спрайт?

Randomize 29.06.2010 14:56

Ответ: Обезцветить спрайт
 
Можно пройтись по пиксмапе грейскейлом.

PHP код:

Local Pixmap:TPixmap LockImage(Image
For 
Local Y% = 0 Until Pixmap.Height
        
For Local X% = 0 Until Pixmap.width
                Local ARGB
% = ReadPixel(PixmapX%, Y%) 
                
Local R% = (ARGB & $00FF0000Shr 16 ' красный
                Local G% = (ARGB & $0000FF00) Shr 8 ' 
зеленый
                Local B
% = (ARGB & $000000FF)         ' синий компонент

                Local i# = 0.2126 * R + 0.7152 * G + 0.0722 * B
                R = i
                G = i 
                B = i 

                WritePixel Pixmap, X, Y, $FF000000 + R Shl 16 + G Shl 8 + B
        Next
Next 

Вроде так.
Image - твоё изображение.
Операцию проводить единожды (не в цикле)
У изображения должен быть флаг DYNAMICIMAGE
Например: LoadImage("Image.bmp", DYNAMICIMAGE)

Писал в браузере - мод допустить ляпы

teremochek 29.06.2010 16:36

Ответ: Обезцветить спрайт
 
Цитата:

Сообщение от Randomize (Сообщение 152059)
Можно пройтись по пиксмапе грейскейлом.

Image - твоё изображение.
Операцию проводить единожды (не в цикле)
У изображения должен быть флаг DYNAMICIMAGE
Например: LoadImage("Image.bmp", DYNAMICIMAGE)

Спасибо! Работает даже без DYNAMICIMAGE.
А Как проделать тоже тожесамое с LoadAnimimage? А то у меня обезцвечивает только один frame.

Randomize 29.06.2010 16:54

Ответ: Обезцветить спрайт
 
Ну смотри.
AnimImage - это тоже самое что обычное изображение только с большим количеством Pixmap`ов.
Смотрим в справку:
Цитата:

Function LockImage:TPixmap( image:TImage,frame=0,read_lock=True,write_lock=True )
Description: Lock an image for direct access
Returns: A pixmap representing the image contents
Information: Locking an image allows you to directly access an image's pixels.
Only images created with the DYNAMICIMAGE flag can be locked.
Locked images must eventually be unlocked with UnlockImage before they can be drawn.
Второй параметр ф-ции LockImage отвечает за фрейм (кадр)
Значит нам нужно циклически проделать данную операцию с каждым кадром изображения.
PHP код:

For Local frm%=0 To CountFrames 1
     Local Pixmap
:TPixmap LockImage(Imagefrm)  
     For 
Local Y% = 0 Until Pixmap.Height 
             
For Local X% = 0 Until Pixmap.width 
                     Local ARGB
% = ReadPixel(PixmapX%, Y%)  
                     
Local R% = (ARGB & $00FF0000Shr 16 ' красный 
                     Local G% = (ARGB & $0000FF00) Shr 8 ' 
зеленый 
                     Local B
% = (ARGB & $000000FF)         ' синий компонент 

                     Local i# = 0.2126 * R + 0.7152 * G + 0.0722 * B 
                     R = i 
                     G = i  
                     B = i  
     
                     WritePixel Pixmap, X, Y, $FF000000 + R Shl 16 + G Shl 8 + B 
             Next
     Next
Next 

CountFrames - количество кадров изображения.
Вроде был универсальный способ узнать количество.
Чтото вроде: Image.Framse.Count или Image.Frames.Length
Поэксперементируй.
А лучше возьми Blide.
Он всегда подскажет.

teremochek 29.06.2010 17:43

Ответ: Обезцветить спрайт
 
Интересно, а можно обезцветить конкретный пиксель на экране?
И вообще можно-ли узнать цвет пикселя на экране?

Randomize 29.06.2010 18:04

Ответ: Обезцветить спрайт
 
Прошу ознакомится:
http://blitzetc.blitzmax.ru/index.ph...к ие_колобки»

http://blitzetc.blitzmax.ru/index.ph...художник:_цвет

http://blitzetc.blitzmax.ru/index.ph...ие_на_BlitzMax

teremochek 29.06.2010 18:52

Ответ: Обезцветить спрайт
 
Спасибо, понравилось.:super:

Черный крыс 30.06.2010 01:25

Ответ: Обезцветить спрайт
 
Все что написано выше можно проделать одной строкой ... показую

Код:

image.pixmaps[frame] = image.pixmaps[frame].Convert(PF_I8)
параметр frame отвечает за то - какой кадр в аним имедже хотим обесцветить. если имедж не анимированный то ставим нулики.
юзайте =)

teremochek 30.06.2010 16:34

Ответ: Обезцветить спрайт
 
Цитата:

Сообщение от Diablo1909 (Сообщение 152165)
Код:

image.pixmaps[frame] = image.pixmaps[frame].Convert(PF_I8)

У меня пишет "Identifier 'pixmaps' not found"
Подскажите как правильно написать ?

Randomize 30.06.2010 16:36

Ответ: Обезцветить спрайт
 
Цитата:

Сообщение от teremochek (Сообщение 152243)
У меня пишет "Identifier 'pixmaps' not found"
Подскажите как правильно написать ?

frame поменяй на 0.
Или циклом прйдись по всем кадрам в случае с анимацией.

teremochek 05.07.2010 00:33

Ответ: Обезцветить спрайт
 
Цитата:

Сообщение от Randomize (Сообщение 152245)
frame поменяй на 0.
Или циклом прйдись по всем кадрам в случае с анимацией.

Поменял frame на 0, все равно пишет ту же ошибку.

Черный крыс 05.07.2010 21:34

Ответ: Обезцветить спрайт
 
Код:

Graphics 1024,768
 
Local image:TImage = LoadImage("scene3.jpg")
 
image.pixmaps[0] = image.pixmaps[0].Convert(PF_I8)
 
While Not KeyHit(KEY_ESCAPE)
 
    Cls
    DrawImage(image,MouseX(),MouseY(),0)
    Flip(True)
Wend
image = Null
EndGraphics()
GCCollect()
End

Что тут сложного?

teremochek 06.07.2010 00:58

Ответ: Обезцветить спрайт
 
Цитата:

Что тут сложного?

Мне нужно было добавить :TImage(а я их как правило непишу)
Теперь все работает.Спасибо.


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

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