2012-02-20 2 views
1

Я работаю над проектом, который предполагает общение напрямую с принтерами Zebra. В настоящее время я пытаюсь преобразовать изображения в формат GRF, используя что-то, называемое «ztools». ZTools кажется древним и не всегда правильно конвертирует графику.PHP - преобразование одного байта в целое (графический формат PCX)

Я начал выкапывать информацию о формате файла PCX, с которого он конвертируется, и теперь находится в байтовой земле. Это мое обращение в данный момент: PCX Technical Reference

Итак, у меня есть базовый файл PCX я сохранил от Photoshop, который 2х2 и будет выглядеть следующим образом:

10 
01 

Это где я застрял, однако. Я никогда не работал с байтами и пытаюсь прочитать файл pcx с PHP, используя fopen («файл», «rb»); и фуд. Однако, похоже, что бы я ни делал, я получаю кучу нулей. Кто-нибудь знает, что мне нужно сделать, чтобы преобразовать байты в числовые эквиваленты?

Это моя слабая попытка:

<?php 
$file = "test.pcx"; 

// Open the file for binary reading (b flag) 
$handle = fopen($file, "rb"); 

while (!feof($handle)) { 
    $contents = fread($handle, 1); 
    $contents = $contents >> 8; 
    echo $contents >> 8; 
    $content .= $contents; 
} 


fclose($handle); 
+1

вы знаете, функции PHP '' пак' и unpack'? Я верю, что они то, что вы ищете. – Vyktor

ответ

3

Я был в состоянии точно получить информацию заголовка с этим:

<?php 
$file = "test.pcx"; 

function intToBits($int) { 
    $return = "00000000"; 
    if ($int <= 255 && $int >= 0) { 
     $check = 128; 
     $x = 0; 
     while ($int > 0) { 
      if ($int > $check) { 
       $return[$x] = "1"; 
      } 
      $int -= $check; 
      $check /= 2; 
      $x++; 
     } 
    } 
    return $return; 
} 

// Open the file for binary reading (b flag) 
$handle = fopen($file, "rb"); 
$PCX_MAP = array(); 
$PCX_MAP['Manufacturer'][0] = 1; // Manufacturer 
$PCX_MAP['Version'] = 1; // Version Info 
$PCX_MAP['Encoding'] = 1; // Encoding 
$PCX_MAP['BitsPerPixel'] = 1; // BitsPerPixel 
$PCX_MAP['Xmin'] = 2; // Window Xmin 
$PCX_MAP['Ymin'] = 2; // Window Ymin 
$PCX_MAP['Xmax'] = 2; // Window Xmax 
$PCX_MAP['Ymax'] = 2; // Window Ymax 
$PCX_MAP['HDpi'] = 2; // HDpi (Resolution) 
$PCX_MAP['VDpi'] = 2; // VDpi (Resolution) 
$PCX_MAP['colormap'] = 48; // Colormap 
$PCX_MAP['Reserved'] = 1; // Reserved = 0 
$PCX_MAP['NumberColorPlanes'] = 1; // Number of color planes 
$PCX_MAP['BytesPerLine'] = 2; // Bytes Per Line 
$PCX_MAP['PalleteInfo'] = 2; // Palette Info 
$PCX_MAP['HorizontalScreenSize'] = 2; // H Screen Size 
$PCX_MAP['VerticalScreenSize'] = 2; // V Screen Size 
$PCX_MAP['Filler'] = 54; // Filler 

$length = reset($PCX_MAP); 
while (!feof($handle)) { 
    if ($length !== false) { 
     $contents = fread($handle, $length); 
     $contents = ord($contents); 
     echo key($PCX_MAP) . " : {$contents}\n"; 
     $content .= $contents; 
     $length = next($PCX_MAP); 
    } 
    else { 
     // Get the rest 1 By 1 
     $contents = fread($handle, 1); 
     $contents = ord($contents); 
     $contents = intToBits($contents); 
     echo $contents ."\n"; 
    } 
} 


fclose($handle); 
/* 
$data = file_get_contents($file); 

for($i = 0; $i < strlen($data); ++$i) { 
    $char = ord($data[$i]); 
    echo "Byte $i: $char\n"; 
}*/ 

Однако я все еще пытаясь проанализировать данные изображения.

Это в настоящее время возвращает это:

Manufacturer : 10 
Version : 5 
Encoding : 1 
BitsPerPixel : 1 
Xmin : 0 
Ymin : 0 
Xmax : 3 
Ymax : 1 
HDpi : 200 
VDpi : 200 
colormap : 15 
Reserved : 0 
NumberColorPlanes : 1 
BytesPerLine : 2 
PalleteInfo : 1 
HorizontalScreenSize : 0 
VerticalScreenSize : 0 
Filler : 0 
10000000 
11000000 
11111110 
00000000 
11000000 
11111110 
00000000 

Заголовок информация верна, но я не уверен, что данные после наполнителя.

Графический RAN в данном случае представляет собой 4 х 2 - 0 означает белый, 1 означает черный

0101 
1010 
1

Попробуйте это:

while (!feof($handle)) { 
    $contents = fread($handle, 1); 
    $contents = $contents && 0xFF; 
    echo $contents; 
    $content .= $contents; 
} 
+0

oktawian: Я попробовал это, и он вернул все 1. Тем не менее, я мог читать по 1 байт за один раз и использовать ord, чтобы преобразовать его в целочисленное значение символа ascii. Теперь моя проблема заключается в анализе данных изображения. (У меня заголовок, но понимание фактических данных об изображении в настоящее время меня озадачило). – teynon