PNG Yük ve GD olmadan PHP pikselleri okumak?

2 Cevap php

Ben tercihen PHP bir truecolour PNG dosyasından kesin değiştirilmemiş piksel verileri (ARGB), okumak için bir ihtiyaç var.

Ne yazık ki PHP GD kütüphanesi alfa kanalı kullanılamaz hale, (7-bit 8-bit onu azaltılması) ile uğraşamaz.

Şu anda benim seçenekleri ya da olduğunu varsayarak yaşıyorum:

  1. Implement my own raw PNG reader to extract the necessary data.
  2. Bazı az kırık dil / kitaplığı kullanın ve bir kabuk süreç veya CGI olarak PHP onu aramak.

Ben diğer üzerinden bir yol için başka bir fikir olsa da, ya da öneriler duymak ilgi duyarım ...

Edit: Ben # 1 dışarı olduğunu düşünüyorum. I () gzinflate için IDAT veri akışı geçen denedim, ama bu bana bir veri hatası veriyor. (Dışında PHP beklenen sonuç üretir, aynı verilerle, aynı şeyi yapmak.)

2 Cevap

Nasıl Imagemagick hakkında?

<?php
$im = new Imagick("foo.png");
$it = $im->getPixelIterator();

foreach($it as $row => $pixels) {
    foreach ($pixels as $column => $pixel) {
        // Do something with $pixel
    }

    $it->syncIterator();
}
?>

Sen netpbm kolayca çözümlenir PNM PNG dönüştürmek için bir pngtopnm işlevini kullanabilirsiniz. Burada size ne gerek olsun yardımcı olmalıdır biraz naif bir php script:

<?php
$pngFilePath = 'template.png';
// Get the raw results of the png to pnm conversion
$contents = shell_exec("pngtopnm $pngFilePath");
// Break the raw results into lines
//  0: P6
//  1: <WIDTH> <HEIGHT>
//  2: 255
//  3: <BINARY RGB DATA>
$lines = preg_split('/\n/', $contents);

// Ensure that there are exactly 4 lines of data
if(count($lines) != 4)
    die("Unexpected results from pngtopnm.");

// Check that the first line is correct
$type = $lines[0];
if($type != 'P6')
    die("Unexpected pnm file header.");

// Get the width and height (in an array)
$dimensions = preg_split('/ /', $lines[1]);

// Get the data and convert it to an array of RGB bytes
$data = $lines[3];
$bytes = unpack('C*', $data);

print_r($bytes);
?>