Как разложить цвет на R,G и B ?

Предыдущая тема Следующая тема Перейти вниз

Как разложить цвет на R,G и B ?

Сообщение  Александр в Вт Фев 19, 2013 7:29 pm

Помогите, очень нужно за неделю реализовать кодер изображений, алгоритм которого готов, чтобы посмотреть результаты, иначе придётся брать другой дипломный проэкт! (препод предлагает очень сложный, распознавание лиц) В самом начале написания наткнулся на непонимание меня языком, то ли языка мной. Вот перегнал я коммандой Point изображение в массив, значения в нём получились длинными целыми числами вроде -14328908.
Дальше коммандами palette и palette get присваиваю номеру цвет и раскладываю этот номер на R,G,B, записывая эти RGB в другой, уже трёхмерный массив. При проверке этого массива все числа в нём оказываются нулями (вместо значений R ,G и B от 0 до 255).
Размер экрана и глубина цвета вводятся пользователем, и задаются ScreenRes (если пытаться загружать не из основного буффера, уже образуются глюки ошибки windows, в частности ошибка возникает, когда пытаешься использовать комманду ImageDestroy в конце, или ImageInfo ну да ладно, записывается поинтом в массив, и хорошо)

В описании комманды Point написано, что для крупных режимов экрана результат получается "в RGB". Какого типа эта переменная? Я так понял, что это Integer, либо LongInt, которая раскладывается на R, G и B арифметически. Если да, то может быть кто-нибудь знает как? Для 32 битных и 24 битных глубин он должен отличаться теоретически...

Может быть я неправильно использовал комманды Palette и Palette Get?

Языков Си и Дельфи не знаю, а учить времени нет, спасибо.

Вот код

Код:
  Dim imagename As String
                      Dim imagewidth As Integer
                      Dim imageheight As Integer
                      Dim imagedepth As UByte
                     
                     
                     
                      Input "Enter image to code filename :", imagename 
                      Input "Enter image's width:", imagewidth
                      Input "Enter image's height:", imageheight
                      Input "Enter image's depth", imagedepth
                     
                      Screenres imagewidth,imageheight,imagedepth
                     
                     
                      BLoad imagename       
                     
                        Dim colo(imagewidth,imageheight) As Integer
                        Dim x0 As Integer
                        Dim y0 As Integer
                       
                       
                        For y0=1 To imageheight' =================================================
                        For x0=1 To imagewidth
                       
                        colo(x0,y0) = Point(x0,y0)
                       
                        Next x0
                        Next y0' =================================================================
                       
                       
                      Screen 0
                       
                       
                      Dim col3(imagewidth,imageheight,3) As Integer
                      Dim index As LongInt
                     
                       
                        For y0=1 To imageheight '========================================
                        For x0=1 To imagewidth
                       
                        index=index+1
                        Palette index,colo(x0,y0)
                        Palette Get index,col3(x0,y0,1),col3(x0,y0,2),col3(x0,y0,3)
                       
                        Next x0
                        Next y0'=========================================================
                       
                       
                        Print col3(500,500,2)
                       
                       
                        Sleep
                       
                       
                        Erase col3(imagewidth,imageheight,3)
                        Erase colo(imagewidth,imageheight)   
                       

Александр

Сообщения : 2
Дата регистрации : 2013-02-19

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как разложить цвет на R,G и B ?

Сообщение  trew в Ср Фев 20, 2013 6:28 am

Привет Александр!

Значение RGB или RGBA имеют тип UINTEGER (то есть целое 32 битное число).
32 бита вмещают 4 байта или 4 подряд идущих ячейки со значениями 0...255
Эти 4 ячейки и задают четыре градации цветов (R,G,B,A)
В реале значение RGB или RGBA можно представить структурой. Пример ниже показывает как можно получить любой байт из 4 байтового числа:

Код:
Type RGB_ ' Она же RGBA
   r As UByte
   g As UByte
   b As UByte
   a As UByte = &h00
End Type

Dim i As Integer = &hff00ff
Dim tRgb As RGB_ ptr = Cast(RGB_ ptr,@i)

? tRgb->r
? tRgb->g
? tRgb->b
? tRgb->a
Sleep

Однако не всегда удобно программисту использовать в своих кодах преобразование к типу (Cast(RGB_ ptr,@i))
Поэтому были написаны макросы для заполнения целого числа отдельными байтами. В определениях к программам WIN32 , да и к другим библиотекам они описаны. Так же описаны макросы для получения отдельных байтов из числа:
Код:
'Так задаются макросами типы RGB и RGBA
#define BGR(r,g,b) (cuint(r) or (cuint(g) shl 8) or (cuint(b) shl 16)) ' Тип RGB
#define BGRA(r,g,b,a) (cuint(r) or (cuint(g) shl 8) or (cuint(b) shl 16) or (cuint(a) shl 24)) ' Тип RGBA

'Так получаются значения отдельных байтов
#define GetRValue(c) cubyte(c)
#define GetGValue(c) cubyte(cushort(c) shr 8)
#define GetBValue(c) cubyte((c) shr 16)
#define GetAValue(c) cubyte((c) shr 24)

Dim i As UInteger = BGRA(255,100,19,35)

? GetRValue(i)
? GetGValue(i)
? GetBValue(i)
? GetAValue(i)
sleep

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как разложить цвет на R,G и B ?

Сообщение  Александр в Ср Фев 20, 2013 11:20 am

Спасибо, я уже разобрался, вот вышел в инет написать, что уже не надо думать.

вот моё решение:

если а - rgb число, то
Код:


b = a and 255
g = (a and 65280) shr 8
r = (a and 16711680) shr 16


формат ржб такой: 8 бит альфа канала - 8 бит красного - 8 бит зелёного и 8 бит голубого
число 65280 - это 1111 1111 0000 0000 в двоичной системе, а 16711680 - 1111 1111 0000 0000 0000 0000

GetRValue() удобнее, конечно

Александр

Сообщения : 2
Дата регистрации : 2013-02-19

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как разложить цвет на R,G и B ?

Сообщение  assembler_c в Пн Окт 07, 2013 2:07 pm

По-моему, лучше приводить указатель на переменную с цветом к указателю на структуру цвета... Должно быстрее быть и без путаницы
avatar
assembler_c

Сообщения : 12
Дата регистрации : 2013-07-02
Откуда : Кировоград, Украина

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как разложить цвет на R,G и B ?

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения