1. 程式人生 > >php使用GD庫合並簡單圖片並變動部分顏色

php使用GD庫合並簡單圖片並變動部分顏色

php gd

最近看到很多大公司都開始做寵物鏈形式多樣化,最特別的是寵物分有多種部位然後再不同組合並生成出對應的寵物圖片,看起來比較高大尚,不過發現有些是使用SVG矢量圖片,這類圖片理論上無失真可以隨意放大性能略受影響,編輯方便容易調整,但操作麻煩,如果直接使用圖片那麽操作會容易些。

php的GD庫提供了很多基礎圖片操作功能,可以分為兩大類:

真彩圖操作:支持直接透明圖片處理,但不支持顏色變換,允許畫入新內容。
調色板圖操作:支持指定顏色為透明,並且支持顏色變換,允許畫入新內容。

兩種類型的圖片可以相互轉換,如果原圖片有透明塊盡可能避免直接轉為調色板圖(透明塊容易出現未知異常)但可以合並到調色板圖中從而保留了原圖的透明,如果在調色板圖中指定了某個色值為透明則在生成圖片後這個色值為透明的。

如果只使用GD庫在不需要變換圖片顏色的時候基本上不需要使用調色板,相反需要有變換圖片顏色時則只能使用調色板。

這裏以生成小怪物為目標來操作變換小怪物的顏色:

首先需要準備5個基本圖片元素:

技術分享圖片

圖片要求:

  1. 所有圖片最好全新畫的(最好使用矢量圖生成的)。
  2. eyes.png 除了眼睛體外全部透明化處理。
  3. fleck.png 除了斑紋休外全部透明化處理。
  4. mouth.png 除了嘴巴體外全部透明化處理。
  5. shadow.png 體型內無顏色透明化處理,體型外全部使用白色。
  6. shape.png 不要有透明內容。
  7. 所有需要替換顏色的色值在其它所所部位最好都不要出現。

下面給一個生成不同顏色寵物的示例代碼:

    $image = imagecreatefrompng(‘shape.png‘); //取體型圖片
    list($src_w, $src_h) = getimagesize(‘shape.png‘); //獲取寬高度
    imagetruecolortopalette($image, false, 256); //轉換為調色板圖像
    $color_index = imagecolorat($image, 276, 621); //獲取顏色索引值(體型顏色)
    imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色
    $color_index = imagecolorat($image, 450, 780); //獲取顏色索引值(肚皮顏色)
    imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色

        // 這段處理非常重要,如果直接轉換為真彩圖會造成後續圖片合並異常
    $_image = imagecreatetruecolor($src_w, $src_h); //創建真彩圖
    $color = imagecolorallocate($_image, 255, 255, 255); //分配顏色
    imagefill($_image, 0, 0, $color); //填充
    imagecopyresampled($_image, $image, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合並修改後的圖片
    $image = $_image;

    /* 斑紋處理 */
    $image_fleck = imagecreatefrompng(‘fleck.png‘); //取斑紋圖片
    imagecopyresampled($image, $image_fleck, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合並
    $color_index = imagecolorat($image, 385, 925); //獲取顏色索引值(斑紋顏色)
    imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色

    /* 體型陰影處理 */
    imagecopyresampled($image, imagecreatefrompng(‘test1/shadow.png‘), 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h);

    /* 嘴巴處理 */
    imagecopyresampled($image, imagecreatefrompng(‘test1/mouth.png‘), 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h);

    /* 眼睛處理 */
    $image_eyes = imagecreatefrompng(‘eyes.png‘); //取斑紋圖片
    imagecopyresampled($image, $image_eyes, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合並
    $color_index = imagecolorat($image_eyes, 285, 335); //獲取顏色索引值(眼睛顏色)
    imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色

    //添加背景
    $color_index = imagecolorat($image, 435, 300); //獲取顏色索引值(背景顏色)
    imagefilltoborder($image, 0, 0, $color_index, imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)));
    imagesavealpha($image, true); //保存 alpha 通道信息

    header(‘Content-type:image/png‘);
    imagepng($image, null, 9);
    imagedestroy($image);

註意: 替換圖片顏色時需要取出調色板顏色的索引值函數 imagecolorat 就是取顏色的索引值(想獲取哪個顏色給出顏色的任意坐標值即可),由於我測試時圖片1304 X 1412 所以代碼中坐標值都比較大。

執行結果如下:

技術分享圖片

php使用GD庫合並簡單圖片並變動部分顏色