forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   ReadPixel??? (http://forum.boolean.name/showthread.php?t=13416)

Reizel 27.09.2010 16:38

ReadPixel???
 
Что то я не понимаю, товарищи, как с какой-либо картинки(или с экрана) прочитать цвет пикселя в указанных координатах?
Хелп вещает, что нужно юзать пиксмапы, но GrabPixmap это жестоко (по несколку-то раз в одном цикле), да и неудобно. Неужели нет других средств??????

не-я 27.09.2010 19:38

Ответ: ReadPixel???
 
Просто прочитать пиксель нельзя, нужен источник (т.е. картинка) в твоём случае видимо скриншот экрана.

Жека 28.09.2010 06:25

Ответ: ReadPixel???
 
Чё если грабить в пиксмапу 1 пиксель?:)

SBJoker 28.09.2010 12:00

Ответ: ReadPixel???
 
с картинки как всегда:
pixmap=LockImage(Image)
pixmap.ReadPixel(x,y)

Reizel 28.09.2010 19:24

Ответ: ReadPixel???
 
Гм, посоветовали вот так:
IMG=loadImage(path$,DYNAMICIMAGE)
Pixel=IMG.pixmaps[0].ReadPixel(X,Y)

ЗЫЖ Пиксель читается, а вот записывается очень криво, я делаю так:
If(LEVEL.ValidCoords(X,Y))
LockImage(LEVEL.IMG,0,False,True)
LEVEL.IMG.pixmaps[0].WritePixel(X,Y,$FF000000)
UnlockImage(LEVEL.IMG)
EndIf


Эх, получаю желтый ляп на весь экран...Ща попробую методом SBJoker'а

Вот:
If(LEVEL.ValidCoords(X,Y))
Buffer=LockImage(LEVEL.IMG,0,True,True)
WritePixel(Buffer,X,Y,$FF000000)
UnlockImage(LEVEL.IMG)
EndIf

Опять желтый экран. Полностью.

SBJoker 28.09.2010 21:19

Ответ: ReadPixel???
 
А ты чо хотел то получить?
Собсно с чего ты уверен что порядок цветов именно такой каким ты его возомнил?
Проверяй перед работой блеять!

Reizel 28.09.2010 23:01

Ответ: ReadPixel???
 
Ладно не кричи. Какой порядок цветов???
Я хотел тупо нарисовать черный пиксел в картинке. $FF000000 - по моему, это черный, ибо ReadPixel читает черый пиксель именно так

Блеять, я не знаю принципа работы с этими чертовыми пиксмапами!


UPD:
попробовал писать пиксель без блокировки буфера - считаться стало правильно, картинка даже разрушается, но! она не изменяется, т.е. пиксмапа то изменяется, а картинка - нет :(
Что не так?

SBJoker 29.09.2010 00:09

Ответ: ReadPixel???
 
узнать формат пиксмапы можно обратившись к полю format.

Reizel 29.09.2010 00:58

Ответ: ReadPixel???
 
Узнал - PF_BGR888 24 bit little endian RGB
Честно, мне это ни о чем не говорит...пока....

SBJoker 29.09.2010 01:20

Ответ: ReadPixel???
 
Это говорит о том что пиксель представлен байтами в след порядке:
[Синий][Зеленый][Красный] и всё никакой альфы там нет...

Randomize 02.10.2010 10:50

Ответ: ReadPixel???
 
Эт самое...
LockImage - на выходе даёт нам пиксмапу.
Можно использовать вот так:
PHP код:

Local Img:TImage CreateImage(100500100500DYNAMICIMAGE Or MASKEDIMAGE)
LockImage(Img).WritePixel(100100argb%) 

По форматам:
Цитата:

Get pixmap format
returns: The format of the pixels stored in @pixmap

The returned value will be one of:
Format Description
PF_RGB888 24 bit big endian RGB
PF_BGR888 24 bit little endian RGB
PF_RGBA8888 32 bit big endian RGB with alpha
PF_BGRA8888 32 bit big endian RGB with alpha
"with alpha" - с альфой собсно.

И ещё код для изучения (класс для работы с цветом):
Код:

SuperStrict

Import Brl.Math

Private

' 1 over 255
Const b2f! = 0.003921568627450980392156862745098!

'#region Utility - Value clamping
Function ClampD!( a!, b!, c! )
        Return Min( Max( a, b ), c )
End Function
'#endregion

Public

Type TColor

        Field r!=0!, g!=0!, b!=0!, a!=0!

        '#region RGBA

        Function ForRGBA:TColor( r!, g!, b!, a! )
                Return New TColor.InitWithRGBA( r, g, b, a )
        End Function
       
        Method InitWithIntComponents:TColor( r%, g%, b%, a% )
                Self.r = r*b2f
                Self.g = g*b2f
                Self.b = b*b2f
                Self.a = a*b2f
                Return Self
        End Method
       
        Method InitWithRGBA:TColor( r!, g!, b!, a! )
                Self.r = r
                Self.g = g
                Self.b = b
                Self.a = a
                Return Self
        End Method

        Method GetRGBA( r! Var, g! Var, b! Var, a! Var )
                r = Self.r
                g = Self.g
                b = Self.b
                a = Self.a
        End Method
       
        Method GetRed!()
                Return r
        End Method
       
        Method GetGreen!()
                Return g
        End Method
       
        Method GetBlue!()
                Return b
        End Method
       
        Method GetAlpha!()
                Return a
        End Method

        Method ToInt%( )
                Local ir%, ig%, ib%, ia%
                ir = Min( Max( r*255, 0 ), 255 )
                ig = Min( Max( g*255, 0 ), 255 )
                ib = Min( Max( b*255, 0 ), 255 )
                ia = Min( Max( a*255, 0 ), 255 )
                Return ia Shl 24 | ir Shl 16 | ig Shl 8 | ib
        End Method
       
        Method IntComponents(r% Var, g% Var, b% Var, a% Var)
                r = Self.r * 255
                g = Self.g * 255
                b = Self.b * 255
                a = Self.a * 255
        End Method

        Function ForInt:TColor( rgba:Int )
                Return New TColor.InitWithRGBA( ..
                        (rgba & 255)*b2f, ..
                        (rgba Shr 8 & 255)*b2f, ..
                        (rgba Shr 16 & 255)*b2f, ..
                        (rgba Shr 24)*b2f )
        End Function
       
        '#endregion

        '#region HSV

        Method InitWithHSV:TColor( h!, s!, v!, a!=1! )
                Local hi%, f!, p!, q!, t!
                f = h / 60!
                hi = Int(f) Mod 6
                f :- hi
                p = V*(1!-s)
                q = V*(1!-(f*s))
                t = V*(1!-((1!-f)*s))
                Select hi
                        Case 0; r=V;        g=t;        b=p
                        Case 1; r=q;        g=V;        b=p
                        Case 2; r=p;        g=V;        b=t
                        Case 3; r=p;        g=q;        b=V
                        Case 4; r=t;        g=p;        b=V
                        Case 5; r=V;        g=p;        b=q
                End Select
                Self.a = a
                Return Self
        End Method

        Function ForHSV:TColor( h!, s!, v!, a!=1! )
                Return New TColor.InitWithHSV( h, s, v, a )
        End Function

        Method ToHSV( h! Var, s! Var, v! Var )
                Local mn!, mx!, dif!, ad!, dv!, md!
                If ( r < g and r < b )
                        mn = r
                Else If ( g < b )
                        mn = g
                Else
                        mn = b
                EndIf

                If ( r > g and r > b )
                        mx = r
                        dif = g-b
                        ad = 0!
                Else If ( g > b )
                        dif = b-r
                        mx = g
                        ad = 120!
                Else
                        dif = r-g
                        ad = 240!
                        mx = b
                EndIf
               
                md = mx-mn

                h = (60!*(dif / md))+ad
                s = md/mx
                V = mx
        End Method
       
        Method GetHue!()
                Local h!,s!,v!
                ToHSV(h,s,v)
                Return h
        End Method
       
        Method GetSaturation!()
                Local h!,s!,v!
                ToHSV(h,s,v)
                Return s
        End Method
       
        Method GetValue!()
                Local h!,s!,v!
                ToHSV(h,s,v)
                Return v
        End Method
       
        '#endregion
       
        '#region CMYK
       
        Method InitWithCMYK:TColor( c!, m!, y!, k!, a!=1! )
                Return Self.InitWithRGBA( ..
                        1! - (c*(1!-k)+k), ..
                        1! - (m*(1!-k)+k), ..
                        1! - (y*(1!-k)+k), a )
        End Method
       
        Function ForCMYK:TColor( c!, m!, y!, k!, a!=1! )
                Return New TColor.InitWithCMYK( c, m, y, k, a )
        End Function

        Method ToCMYK( c! Var, m! Var, y! Var, k! Var )
                Local cmy![] = [1!-r, 1!-g, 1!-b]
                Local sm% = 0
               
                If cmy[1] < cmy[0] And cmy[1] < cmy[2] Then
                        sm = 1
                ElseIf cmy[2] < cmy[0] And cmy[2] < cmy[1] Then
                        sm = 2
                EndIf
               
                If cmy[sm] >= 1 Then
                        c = 0!
                        m = 0!
                        y = 0!
                        k = 1!
                Else
                        k = cmy[sm]
                        Local kd! = 1.0 / (1! - k)
                        c = (cmy[0]-k)*kd
                        m = (cmy[1]-k)*kd
                        y = (cmy[2]-k)*kd
                EndIf
        End Method
       
        Method GetCyan!()
                Local c!,m!,y!,k!
                ToCMYK(c,m,y,k)
                Return c
        End Method
       
        Method GetMagenta!()
                Local c!,m!,y!,k!
                ToCMYK(c,m,y,k)
                Return m
        End Method
       
        Method GetYellow!()
                Local c!,m!,y!,k!
                ToCMYK(c,m,y,k)
                Return y
        End Method
       
        Method GetKey!()
                Local c!,m!,y!,k!
                ToCMYK(c,m,y,k)
                Return k
        End Method
       
        '#endregion

        '#region Operations

        Method Multiply:TColor( m:TColor )
                Return New TColor.InitWithRGBA( r*m.r, g*m.g, b*m.b, a*m.a )
        End Method

        Method Add:TColor( o:TColor )
                Return New TColor.InitWithRGBA( r+o.r, g+o.g, b+o.b, a+o.a )
        End Method

        Method Subtract:TColor( o:TColor )
                Return New TColor.InitWithRGBA( r-o.r, g-o.g, b-o.b, a-o.a )
        End Method
       
        Method Clamp:TColor( bot!, top! )
                Return New TColor.InitWithRGBA(..
                        ClampD( r, bot, top ),..
                        ClampD( g, bot, top ),..
                        ClampD( b, bot, top ),..
                        ClampD( a, bot, top ) )
        End Method
       
        Method Scale:TColor( x! )
                Return New TColor.InitWithRGBA(r*x, g*x, b*x, a*x)
        End Method
       
        Method Invert:TColor()
                Return New TColor.InitWithRGBA(1!-r, 1!-g, 1!-b, 1!-a)
        End Method
       
        ' If no function is specified, default to linear interpolation
        Method Interpolate:TColor( other:TColor, delta:Double, fn:Double(start:Double, finish:Double, delta:Double, context:Object)=Null, context:Object=Null )
                delta = ClampD(delta, 0!, 1!)
                If fn Then
                        Return New TColor.InitWithRGBA( ..
                                fn(r, other.r, delta, context), ..
                                fn(g, other.g, delta, context), ..
                                fn(b, other.b, delta, context), ..
                                fn(a, other.a, delta, context) )
                EndIf
                Local invdelta:Double = (1.0! - delta)
                Return New TColor.InitWithRGBA( ..
                        other.r*delta + r*invdelta, ..
                        other.g*delta + g*invdelta, ..
                        other.b*delta + b*invdelta, ..
                        other.a*delta + a*invdelta)
        End Method
       
        '#endregion

        '#region Colors

        Function White:TColor( ); Return New TColor.InitWithRGBA( 1!, 1!, 1!, 1! ); End Function
        Function Red:TColor( ); Return New TColor.InitWithRGBA( 1!, 0!, 0!, 1! ); End Function
        Function Green:TColor( ); Return New TColor.InitWithRGBA( 0!, .75!, 0!, 1! ); End Function
        Function Blue:TColor( ); Return New TColor.InitWithRGBA( 0!, 0!, .75!, 1! ); End Function
        Function Lime:TColor( ); Return New TColor.InitWithRGBA( .25!, 1!, 0!, 1! ); End Function
        Function LightGreen:TColor( ); Return New TColor.InitWithRGBA( .4!, 1!, .4!, 1! ); End Function
        Function Pink:TColor( ); Return New TColor.InitWithRGBA( 1!, .25!, .25!, 1! ); End Function
        Function Purple:TColor( ); Return New TColor.InitWithRGBA( 1!, 0!, .5!, 1! ); End Function
        Function Turqoise:TColor( ); Return New TColor.InitWithRGBA( 0!, 1!, 1!, 1! ); End Function
        Function Grey:TColor( ); Return New TColor.InitWithRGBA( .5!, .5!, .5!, 1! ); End Function
        Function Black:TColor( ); Return New TColor.InitWithRGBA( 0!, 0!, 0!, 1! ); End Function
        Function Yellow:TColor( ); Return New TColor.InitWithRGBA( 1!, 1!, 0!, 1! ); End Function
        Function LightBlue:TColor( ); Return New TColor.InitWithRGBA( .4!, .4!, 1!, 1! ); End Function
        Function Maroon:TColor( ); Return New TColor.InitWithRGBA( .5!, 0!, 0!, 1! ); End Function
        Function Orange:TColor( ); Return New TColor.InitWithRGBA( 1!, .55!, 0!, 1! ); End Function
        Function Brown:TColor( ); Return New TColor.InitWithRGBA( .5!, .4!, 0!, 1! ); End Function
        Function Clear:TColor( ); Return New TColor.InitWithRGBA( 1!, 1!, 1!, 0! ); End Function

        '#endregion
       
        Method ToString$()
                Return "#<TColor:0x"+Super.ToString()+" @r="+r+" @g="+g+" @b="+b+" @a="+a+">"
        End Method
End Type

Оформлен как модуль. Т.е. не для Include, а для Import`а.
Если нужно для инклуда то убери:
Код:

SuperStrict

Import Brl.Math

Private

и
Код:

Public


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

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