Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как узнать RGB записанный в 2 байта
 
 автор: Nataliya ~*~   (29.03.2009 в 22:06)   письмо автору
 
 

Например \xff\xff это белый 255,255,255.
Каким образом из этих двух байт можна достать реальный цвет?

  Ответить  
 
 автор: Nataliya ~*~   (29.03.2009 в 22:13)   письмо автору
 
   для: Nataliya ~*~   (29.03.2009 в 22:06)
 

Trianon дал код
$B = ($Bits1&0x1F)<<3;
$G = (($Bits1>>5)&7)|(($Bits2&7)<<3);
$R = ($Bits2&0xF8);
Но тут слишком большая потеря.

  Ответить  
 
 автор: Лерк   (29.03.2009 в 22:36)   письмо автору
 
   для: Nataliya ~*~   (29.03.2009 в 22:13)
 

Вроде тут и теряться нечему. Что Вас смущает?

  Ответить  
 
 автор: Nataliya ~*~   (29.03.2009 в 22:39)   письмо автору
 
   для: Лерк   (29.03.2009 в 22:36)
 

В результате этого выходит не 255,255,255 а 248,39,248

  Ответить  
 
 автор: Лерк   (29.03.2009 в 22:48)   письмо автору
 
   для: Nataliya ~*~   (29.03.2009 в 22:39)
 

Потому что Вы белый в 2 байта так не запишите. Каждая составляющая (R, G, B) будет числом, кратным 8-ми, так что белый туда не входит. То есть \xFF\xFF - не белый.
Не понятно зачем именно 2 байта. Экономите 1 байт?

  Ответить  
 
 автор: Nataliya ~*~   (29.03.2009 в 22:54)   письмо автору
 
   для: Лерк   (29.03.2009 в 22:48)
 

Это не я это mbm экономит, на php нет ни одной функции работающей с этим форматом графики, а мне нужно его розобрат. Срочно нужно.. Готова даже заплатить сколько нада..

  Ответить  
 
 автор: Лерк   (29.03.2009 в 23:00)   письмо автору
 
   для: Nataliya ~*~   (29.03.2009 в 22:54)
 

Ой, Вы знаете я ошибся. Тут получается, что R и B будут числами, кратными 8-ми, а G - может просто принимать значения от 0 до 63.

Всё равно получается, что белый никак не получится задать.

Я руководствуюсь лишь тем кодом, что Вы выложили. Формата mbm я, к сожалению, не знаю (

  Ответить  
 
 автор: Лерк   (29.03.2009 в 23:29)   письмо автору
 
   для: Nataliya ~*~   (29.03.2009 в 22:54)
 

А какой тип (и подтип) картинки? Вот тут, в принципе, вроде всё что надо есть: http://www.4neurons.com/other/mbm/MBM.TXT

  Ответить  
 
 автор: Trianon   (29.03.2009 в 23:04)   письмо автору
 
   для: Nataliya ~*~   (29.03.2009 в 22:13)
 

В зеленом я ошибся. Так более точно.
$G = ((($Bits1>>5)&7)|(($Bits2&7)<<3)) << 2;

  Ответить  
 
 автор: Nataliya ~*~   (29.03.2009 в 23:09)   письмо автору
 
   для: 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:15)   письмо автору
 
   для: 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 ?

  Ответить  
 
 автор: Лерк   (29.03.2009 в 23:35)   письмо автору
 
   для: 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)));

Вот такой даст

  Ответить  
 
 автор: Nataliya ~*~   (29.03.2009 в 23:37)   письмо автору
 
   для: Лерк   (29.03.2009 в 23:35)
 

Спасибо, щя проверю.

  Ответить  
 
 автор: Nataliya ~*~   (29.03.2009 в 23:41)   письмо автору
 
   для: Nataliya ~*~   (29.03.2009 в 23:37)
 

Не даст(

  Ответить  
 
 автор: Лерк   (29.03.2009 в 23:43)   письмо автору
 
   для: 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)

  Ответить  
 
 автор: Nataliya ~*~   (29.03.2009 в 23:51)   письмо автору
 
   для: Лерк   (29.03.2009 в 23:43)
 

Сори, это я накосячила, уже выдает.. Прада с другим цветом уже не теряет а добавляет в излишок)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования