|
|
|
| Например \xff\xff это белый 255,255,255.
Каким образом из этих двух байт можна достать реальный цвет? | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 22:06)
| | Trianon дал код
$B = ($Bits1&0x1F)<<3;
$G = (($Bits1>>5)&7)|(($Bits2&7)<<3);
$R = ($Bits2&0xF8);
Но тут слишком большая потеря. | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 22:13)
| | Вроде тут и теряться нечему. Что Вас смущает? | |
|
|
|
|
|
|
|
для: Лерк
(29.03.2009 в 22:36)
| | В результате этого выходит не 255,255,255 а 248,39,248 | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 22:39)
| | Потому что Вы белый в 2 байта так не запишите. Каждая составляющая (R, G, B) будет числом, кратным 8-ми, так что белый туда не входит. То есть \xFF\xFF - не белый.
Не понятно зачем именно 2 байта. Экономите 1 байт? | |
|
|
|
|
|
|
|
для: Лерк
(29.03.2009 в 22:48)
| | Это не я это mbm экономит, на php нет ни одной функции работающей с этим форматом графики, а мне нужно его розобрат. Срочно нужно.. Готова даже заплатить сколько нада.. | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 22:54)
| | Ой, Вы знаете я ошибся. Тут получается, что R и B будут числами, кратными 8-ми, а G - может просто принимать значения от 0 до 63.
Всё равно получается, что белый никак не получится задать.
Я руководствуюсь лишь тем кодом, что Вы выложили. Формата mbm я, к сожалению, не знаю ( | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 22:54)
| | А какой тип (и подтип) картинки? Вот тут, в принципе, вроде всё что надо есть: http://www.4neurons.com/other/mbm/MBM.TXT | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 22:13)
| | В зеленом я ошибся. Так более точно.
$G = ((($Bits1>>5)&7)|(($Bits2&7)<<3)) << 2;
|
| |
|
|
|
|
|
|
|
для: Trianon
(29.03.2009 в 23:04)
| | Есть еще такой метод упаковки цвета в два байта, взятый из python'а
r,g,b=255,255,255
i,red,blue=0,None,None
while i<256:
if red==None and r<=i+4:red=int(i/8.25)
if blue==None and b<=i+4:blue=int(i/8.25)
if red!=None and blue!=None:break
i+=8.25
color,i=red*8+blue*0x100,0
for green in range(8):
if i in [0,65,130,195]:period=32
else:period=33
if g>i+period-2:i+=period
else:
for j in range(0,32,4):
if g<=i+j+2:color+=j*0x800+green;break
break
return chr(color/0x100)+chr(color%0x100)
может он поможет? | |
|
|
|
|
|
|
|
для: Trianon
(29.03.2009 в 23:04)
| | В конце концов можно сместить округление к середине. Будет еще больше похоже на истину, но утраченных бит все равно не восстановит.
$B = ($Bits1&0x1F)*8 + (7&(8 -($Bits&1)));
$G = (($Bits1>>5)&7)|(($Bits2&7); $G = $G*4 + (3&(4 - ($G&1)));
$R = ($Bits2>>3)&1F; $R = $R*8 + (7&(8-($R&1)));
|
этот код дает 255,255,255 ? | |
|
|
|
|
|
|
|
для: Trianon
(29.03.2009 в 23:15)
| |
$B = ($Bits1&0x1F)*8 + (7&(8 -($Bits1&1)));
$G = (($Bits1>>5)&7)|(($Bits2&7) << 3 ); $G = $G*4 + (3&(4 - ($G&1)));
$R = ($Bits2>>3)&0x1F; $R = $R*8 + (7&(8-($R&1)));
|
Вот такой даст | |
|
|
|
|
|
|
|
для: Лерк
(29.03.2009 в 23:35)
| | Спасибо, щя проверю. | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 23:37)
| | Не даст( | |
|
|
|
|
|
|
|
для: Nataliya ~*~
(29.03.2009 в 23:41)
| | Как Вы проверяете?
$Bits1 = 0xFF;
$Bits2 = 0xFF;
$B = ($Bits1&0x1F)*8 + (7&(8 -($Bits1&1)));
$G = (($Bits1>>5)&7)|(($Bits2&7) << 3 ); $G = $G*4 + (3&(4 - ($G&1)));
$R = ($Bits2>>3)&0x1F; $R = $R*8 + (7&(8-($R&1)));
var_dump($R, $G, $B);
|
Мне выдаёт: int(255) int(255) int(255) | |
|
|
|
|
|
|
|
для: Лерк
(29.03.2009 в 23:43)
| | Сори, это я накосячила, уже выдает.. Прада с другим цветом уже не теряет а добавляет в излишок) | |
|
|
|