Что нового

_ColorGetRGB работает не корректно

NickSpirit

Знающий
Сообщения
44
Репутация
5
Всем доброго времени суток.

Пытаюсь получить представление цвета в RGB из битмапа. Обнаружил интересную проблему.
Скажем вот такой код работает некорректно:
Код:
$color = _GDIPlus_BitmapGetPixel($hBmp, $i, $j)
$hexColor=Hex($color,6)
$massRgb = _ColorGetRGB($hexColor)


Для большей ясности скажу так:

Код:
$colorManual = 0x94948a
$colorString = "0x"+"94948a"

_ColorGetRGB - для каждой переменной вернет разные значения.
Причем для $colorManual будет корректное значение.
Так как же сделать корректно?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Для большей ясности скажу так:
  1. 0x94948a является числом, записанным в шестнадцатеричной системе счисления (в десятичной будет 9737354)
  2. Чего вы ожидаете от выражения "0x"+"94948a"? Оно является выражением из двух строк которые будут приведены к числовому типу (извлеченное число будет представлять из себя все цифры, до первого некорректного символа, например результатом выражениея "1qwe5" + "2qwe5" будет 3). В вашем случае это будет 0 + 94948, результатом будет 94948
Проблема в том, что _GDIPlus_BitmapGetPixel вернет вам значение цвета со значением прозрачности, а _ColorGetRGB считает ARGB значения некорректными.
Код:
; #FUNCTION# ====================================================================================================================
; Author ........: jpm
; Modified.......:
; ===============================================================================================================================
Func _ColorGetRGB($iColor, Const $_iCurrentExtended = @extended)
    If BitAND($iColor, 0xFF000000) Then Return SetError(1, 0, 0) ; вот здесь вы можете увидеть эту проверку
    Local $aColor[3]
    $aColor[0] = BitAND(BitShift($iColor, 16), 0xFF)
    $aColor[1] = BitAND(BitShift($iColor, 8), 0xFF)
    $aColor[2] = BitAND($iColor, 0xFF)
    Return SetExtended($_iCurrentExtended, $aColor)
EndFunc   ;==>_ColorGetRGB
Вы можете сами взглянуть на исходный код этой функции (в SciTE, по умолчанию, Ctrl+J)

Вам нужно избавиться от значения прозрачности, то есть извлечь первые 24 бита.
Код:
; ...
$color = _GDIPlus_BitmapGetPixel($hBmp, $i, $j)
$massRgb = _ColorGetRGB(BitAND($color, 0xFFFFFF))
_ArrayDisplay($massRgb)
 
Последнее редактирование:
Верх