2012-02-27 4 views
0

私はPythonアプリケーションをPHPに移植するように求められました(そして私はPHPがあまり好きではありません)。PILのImage.pasteに対応するPHP

ポートに問題がある部分は、Map Icons CollectionNicolas Molletという素晴らしい単色の「テンプレート」画像を使用しています。これらのテンプレートイメージは、カスタム背景と前景色を持つアイコンを作成するために使用されます。 PILのImage.pasteは、テンプレートImageをアルファマスクとして使用して、アイコンの前景を選択した色で「貼り付ける」ために使用されます。たとえば、次のように私はPHPでこれを複製することができますどのように

icon creation

?それをピクセル単位で行う他に何か別の選択肢がありますか?

私がこれまで持っているもの[更新]

私はPHPのスキルを誇り​​に思っていないよ...:

<?php 

header('Content-type: image/png'); 

// read parameters: icon file, foreground and background colors 
$bgc = sscanf(empty($_GET['bg']) ? 'FFFFFF' : $_GET['bg'], '%2x%2x%2x'); 
$fgc = sscanf(empty($_GET['fg']) ? '000000' : $_GET['fg'], '%2x%2x%2x'); 
$icon = empty($_GET['icon']) ? 'base.png' : $_GET['icon']; 

// read image information from template files 
$shadow = imagecreatefrompng("../static/img/marker/shadow.png"); 
$bg = imagecreatefrompng("../static/img/marker/bg.png"); 
$fg = imagecreatefrompng("../static/img/marker/" . $icon); 
$base = imagecreatefrompng("../static/img/marker/base.png"); 
imagesavealpha($base, true); // for the "shadow" 

// loop over every pixel 
for($x=0; $x<imagesx($base); $x++) { 
    for($y=0; $y<imagesy($base); $y++) { 
     $color = imagecolorsforindex($bg, imagecolorat($bg, $x, $y)); 
     // templates are grayscale, any channel serves as alpha 
     $alpha = ($color['red'] >> 1)^127; // 127=transparent, 0=opaque. 
     if($alpha != 127) { // if not 100% transparent 
      imagesetpixel($base, $x, $y, imagecolorallocatealpha($base, $bgc[0], $bgc[1], $bgc[2], $alpha)); 
     } 
     // repeat for foreground and shadow with foreground color 
     foreach(array($shadow, $fg) as $im) { 
      $color = imagecolorsforindex($im, imagecolorat($im, $x, $y)); 
      $alpha = ($color['red'] >> 1)^127; 
      if($alpha != 127) { 
       imagesetpixel($base, $x, $y, imagecolorallocatealpha($base, $fgc[0], $fgc[1], $fgc[2], $alpha)); 
      } 
     }  
    } 
} 
// spit image 
imagepng($base); 
// destroy resources 
foreach(array($shadow, $fg, $base, $bg) as $im) { 
    imagedestroy($im); 
} 

?> 

それが働いていると、パフォーマンスが悪いわけではありません。

+0

PHP開発者にあなたの言語が気に入らないと言っている間に助けてもらうのが賢明かどうかわからない – halfer

+0

これらがPNG画像の場合、GD2がこれを行えない場合、ImageMagickは良い方法です。 – halfer

+0

@halfer:彼らはPythonを嫌うのは無料です:-) –

答えて

1

私のコメントによると、ImageMagickはこれを行うことができます。しかし、これがあなたのユースケースに最適ではないかもしれないことを示しているので、GD2の使用を検討してください。 PHPサイトでimage mergingを実行する方法に関するデモがあります。

これは、(かなり最近の)デフォルトのPHPインストールで行うことができます。

関連する問題