2012-02-20 4 views
1

Je travaille sur un projet qui consiste à parler directement avec les imprimantes Zebra. Actuellement, j'essaye de convertir des images au format GRF en utilisant quelque chose appelé "ztools". ZTools semble être ancien et ne convertit pas toujours le graphique correctement.PHP - Convertir un seul octet en entier (format graphique PCX)

J'ai commencé à extraire des informations sur le format de fichier PCX à partir duquel je convertis et je me retrouve maintenant en octet. Ceci est ma référence à ce moment: PCX Technical Reference

Donc, je dispose d'un fichier PCX de base que je sauvé de Photoshop qui est 2x2 et ressemblerait à ceci:

10 
01 

C'est là où je suis coincé, cependant. Je n'ai jamais travaillé avec des octets et j'essaie de lire le fichier pcx avec PHP en utilisant fopen ("fichier", "rb"); et fread. Cependant, il semble que peu importe ce que je fais, je reçois un tas de zéros. Quelqu'un sait ce que je dois faire pour convertir les octets en leurs équivalents numériques?

Ceci est ma faible tentative:

<?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

Savez-vous les fonctions php '' pak' et unpack'? Je crois qu'ils sont ce que vous cherchez. – Vyktor

Répondre

3

Je suis en mesure d'obtenir les informations d'en-tête avec précision ceci:

<?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"; 
}*/ 

Cependant, je suis essayant toujours d'analyser les données d'image.

Cela renvoie actuellement ceci:

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 

Les informations en-tête est correct, mais je ne suis pas sûr des données après remplissage.

Le RAN graphique dans ce cas est un 4 x 2 - 0 signifie blanc, 1 signifie noir

0101 
1010 
1

Essayez ceci:

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

oktawian: J'ai essayé ça et c'est revenu tous les 1. Cependant, j'étais capable de lire 1 octet à la fois et d'utiliser ord pour le convertir en la valeur entière du caractère ASCII. Maintenant, mon problème est l'analyse des données de l'image. (J'ai l'en-tête, mais comprendre les données d'image réelles m'a dérouté pour le moment.) – teynon