2009-03-06 11 views
1

私は、truecolour PNGファイルから、好ましくはPHPから、正確に変更されていないピクセルデータ(ARGB)を読み込む必要があります。PNGを読み込み、GDなしでPHPでピクセルを読み込みますか?

残念ながら、PHPのGDライブラリはアルファチャンネルを混乱させ(8ビットから7ビットに減らす)、使用できなくなってしまいます。

  1. 必要なデータを抽出するために、私自身の生のPNGリーダーを実装します。

    私は現在、私のオプションのいずれかであることを仮定しています。

  2. 壊れていない言語/ライブラリを使用し、シェルプロセスまたはCGIとしてPHPから呼び出します。

私は...

編集しかし、任意の他のアイデアを聞いて興味がある、または他の上で1つの方法に関する提言したい:私は#1が出ていると思います。 IDATデータストリームをgzinflate()に渡そうとしましたが、データエラーが発生します。 (まったく同じデータを使って、PHP以外では、期待どおりの結果が得られます)

+0

#1が出てきます。 ImageMagickをインストールする方が簡単です。つまり、PNGはJPEGよりも簡単な形式です。 –

+0

PNGリーダーを実装すると、あなたがそれをやりたいと思っているほとんどすべてが遅すぎるでしょう。 – Jacco

答えて

3

ImageMagickはどうですか?

<?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(); 
} 
?> 
+0

http://us.php.net/imagick – slacy

+0

残念ながら私は現時点ではPHP4に悩まされており、ImageMagickはサーバにインストールされておらず、互換性もないようです。 – Miral

0

あなたは簡単に解析PNMにPNGを変換するnetpbmのpngtopnm機能を使用することができます。ここでは、あなたが必要なものを得るのを助けるはずなかなか素朴なPHPスクリプトです:

<?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); 
?> 
+0

悲しいことに、これはホストされたサイトにあったので、私は追加のソフトウェアを追加することができませんでした(可能であれば、私はImageMagickをインストールしたでしょう)。それが起こるにつれて、この全部がもはや必要とされなくなったので、それはやめてしまった。とにかく答えてくれてありがとう! (ただし、RGBならARGBではなく、それは助けにはなりませんでした)。 – Miral

関連する問題