|
27.09.2010, 16:38
|
#1
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
ReadPixel???
Что то я не понимаю, товарищи, как с какой-либо картинки(или с экрана) прочитать цвет пикселя в указанных координатах?
Хелп вещает, что нужно юзать пиксмапы, но GrabPixmap это жестоко (по несколку-то раз в одном цикле), да и неудобно. Неужели нет других средств??????
|
(Offline)
|
|
27.09.2010, 19:38
|
#2
|
AnyKey`щик
Регистрация: 31.08.2010
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: ReadPixel???
Просто прочитать пиксель нельзя, нужен источник (т.е. картинка) в твоём случае видимо скриншот экрана.
|
(Offline)
|
|
28.09.2010, 06:25
|
#3
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: ReadPixel???
Чё если грабить в пиксмапу 1 пиксель?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.09.2010, 12:00
|
#4
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: ReadPixel???
с картинки как всегда:
pixmap=LockImage(Image)
pixmap.ReadPixel(x,y)
__________________
|
(Offline)
|
|
28.09.2010, 19:24
|
#5
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: 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
Опять желтый экран. Полностью.
|
(Offline)
|
|
28.09.2010, 21:19
|
#6
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: ReadPixel???
А ты чо хотел то получить?
Собсно с чего ты уверен что порядок цветов именно такой каким ты его возомнил?
Проверяй перед работой блеять!
__________________
|
(Offline)
|
|
28.09.2010, 23:01
|
#7
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: ReadPixel???
Ладно не кричи. Какой порядок цветов???
Я хотел тупо нарисовать черный пиксел в картинке. $FF000000 - по моему, это черный, ибо ReadPixel читает черый пиксель именно так
Блеять, я не знаю принципа работы с этими чертовыми пиксмапами!
UPD:
попробовал писать пиксель без блокировки буфера - считаться стало правильно, картинка даже разрушается, но! она не изменяется, т.е. пиксмапа то изменяется, а картинка - нет
Что не так?
|
(Offline)
|
|
29.09.2010, 00:09
|
#8
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: ReadPixel???
узнать формат пиксмапы можно обратившись к полю format.
__________________
|
(Offline)
|
|
29.09.2010, 00:58
|
#9
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: ReadPixel???
Узнал - PF_BGR888 24 bit little endian RGB
Честно, мне это ни о чем не говорит...пока....
|
(Offline)
|
|
29.09.2010, 01:20
|
#10
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: ReadPixel???
Это говорит о том что пиксель представлен байтами в след порядке:
[Синий][Зеленый][Красный] и всё никакой альфы там нет...
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.10.2010, 10:50
|
#11
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,360
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: ReadPixel???
Эт самое...
LockImage - на выходе даёт нам пиксмапу.
Можно использовать вот так:
Local Img:TImage = CreateImage(100500, 100500, DYNAMICIMAGE Or MASKEDIMAGE) LockImage(Img).WritePixel(100, 100, argb%)
По форматам:
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
и
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:50.
|