Pregunta

Estoy trabajando en un proyecto que implica hablar directamente con las impresoras cebra. Actualmente, estoy tratando de convertir imágenes en el formato GRF usando algo llamado "ZTools". ZTools parece ser antiguo y no siempre convierte el gráfico correctamente.

Comencé a desenterrar información sobre el formato de archivo PCX del que se está convirtiendo y ahora me encuentro en Byte Land. Esta es mi referencia en este momento: Referencia técnica de PCX

Entonces, tengo un archivo PCX básico que guardé de Photoshop que es 2x2 y se vería así:

10
01

Sin embargo, aquí es donde estoy atrapado. Nunca he trabajado con bytes e intento leer el archivo PCX con PHP usando Fopen ("archivo", "RB"); y Fread. Sin embargo, parece que no importa lo que haga, obtengo un montón de ceros. ¿Alguien sabe lo que necesito hacer para convertir los bytes en equivalentes numéricos?

Este es mi débil intento:

<?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);
¿Fue útil?

Solución

Pude obtener la información del encabezado con precisión con esto:

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

Sin embargo, todavía estoy intentando analizar los datos de la imagen.

Esto le devuelve actualmente esto:

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

La información del encabezado es correcta, pero no estoy seguro de los datos después del relleno.

El gráfico ejecutado en este caso es un 4 x 2 - 0 significa blanco, 1 significa negro

0101
1010

Otros consejos

Prueba esto:

while (!feof($handle)) {
    $contents = fread($handle, 1);
    $contents = $contents && 0xFF;
    echo $contents;
    $content .= $contents;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top