ホームページ > バックエンド開発 > PHPチュートリアル > ICOアイコンを生成するPHPコード

ICOアイコンを生成するPHPコード

墨辰丷
リリース: 2023-03-29 22:24:01
オリジナル
2635 人が閲覧しました

この記事では主にPHPでICOアイコンを生成するコードを紹介します。興味のある方はぜひ参考にしてください。

1 im 画像の色置換、透明色を含む

imagesavealpha($resize_im, true);//$resize_im 画像の透明色を失わないように

完全な方法:

class phpthumb_ico {
 
  function phpthumb_ico() {
    return true;
  }
 
 
  function GD2ICOstring(&$gd_image_array) {
    foreach ($gd_image_array as $key => $gd_image) {
 
      $ImageWidths[$key] = ImageSX($gd_image);
      $ImageHeights[$key] = ImageSY($gd_image);
      $bpp[$key]     = ImageIsTrueColor($gd_image) ? 32 : 24;
      $totalcolors[$key] = ImageColorsTotal($gd_image);
 
      $icXOR[$key] = '';
      for ($y = $ImageHeights[$key] - 1; $y >= 0; $y--) {
        for ($x = 0; $x < $ImageWidths[$key]; $x++) {
          $argb = $this->GetPixelColor($gd_image, $x, $y);
          $a = round(255 * ((127 - $argb[&#39;alpha&#39;]) / 127));
          $r = $argb[&#39;red&#39;];
          $g = $argb[&#39;green&#39;];
          $b = $argb[&#39;blue&#39;];
 
          if ($bpp[$key] == 32) {
            $icXOR[$key] .= chr($b).chr($g).chr($r).chr($a);
          } elseif ($bpp[$key] == 24) {
            $icXOR[$key] .= chr($b).chr($g).chr($r);
          }
 
          if ($a < 128) {
            @$icANDmask[$key][$y] .= &#39;1&#39;;
          } else {
            @$icANDmask[$key][$y] .= &#39;0&#39;;
          }
        }
        // mask bits are 32-bit aligned per scanline
        while (strlen($icANDmask[$key][$y]) % 32) {
          $icANDmask[$key][$y] .= &#39;0&#39;;
        }
      }
      $icAND[$key] = &#39;&#39;;
      foreach ($icANDmask[$key] as $y => $scanlinemaskbits) {
        for ($i = 0; $i < strlen($scanlinemaskbits); $i += 8) {
          $icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, &#39;0&#39;, STR_PAD_LEFT)));
        }
      }
 
    }
 
    foreach ($gd_image_array as $key => $gd_image) {
      $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);
 
      // BITMAPINFOHEADER - 40 bytes
      $BitmapInfoHeader[$key] = &#39;&#39;;
      $BitmapInfoHeader[$key] .= "\x28\x00\x00\x00";               // DWORD biSize;
      $BitmapInfoHeader[$key] .= $this->LittleEndian2String($ImageWidths[$key], 4);   // LONG  biWidth;
      // The biHeight member specifies the combined
      // height of the XOR and AND masks.
      $BitmapInfoHeader[$key] .= $this->LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG  biHeight;
      $BitmapInfoHeader[$key] .= "\x01\x00";                   // WORD  biPlanes;
        $BitmapInfoHeader[$key] .= chr($bpp[$key])."\x00";             // wBitCount;
      $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";               // DWORD biCompression;
      $BitmapInfoHeader[$key] .= $this->LittleEndian2String($biSizeImage, 4);      // DWORD biSizeImage;
      $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";               // LONG  biXPelsPerMeter;
      $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";               // LONG  biYPelsPerMeter;
      $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";               // DWORD biClrUsed;
      $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";               // DWORD biClrImportant;
    }
 
 
    $icondata = "\x00\x00";                   // idReserved;  // Reserved (must be 0)
    $icondata .= "\x01\x00";                   // idType;    // Resource Type (1 for icons)
    $icondata .= $this->LittleEndian2String(count($gd_image_array), 2); // idCount;   // How many images?
 
    $dwImageOffset = 6 + (count($gd_image_array) * 16);
    foreach ($gd_image_array as $key => $gd_image) {
      // ICONDIRENTRY  idEntries[1]; // An entry for each image (idCount of &#39;em)
 
      $icondata .= chr($ImageWidths[$key]);           // bWidth;     // Width, in pixels, of the image
      $icondata .= chr($ImageHeights[$key]);          // bHeight;     // Height, in pixels, of the image
      $icondata .= chr($totalcolors[$key]);           // bColorCount;   // Number of colors in image (0 if >=8bpp)
      $icondata .= "\x00";                   // bReserved;    // Reserved ( must be 0)
 
      $icondata .= "\x01\x00";                 // wPlanes;     // Color Planes
      $icondata .= chr($bpp[$key])."\x00";           // wBitCount;    // Bits per pixel
 
      $dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
      $icondata .= $this->LittleEndian2String($dwBytesInRes, 4);    // dwBytesInRes;  // How many bytes in this resource?
 
      $icondata .= $this->LittleEndian2String($dwImageOffset, 4);   // dwImageOffset;  // Where in the file is this image?
      $dwImageOffset += strlen($BitmapInfoHeader[$key]);
      $dwImageOffset += strlen($icXOR[$key]);
      $dwImageOffset += strlen($icAND[$key]);
    }
 
    foreach ($gd_image_array as $key => $gd_image) {
      $icondata .= $BitmapInfoHeader[$key];
      $icondata .= $icXOR[$key];
      $icondata .= $icAND[$key];
    }
 
    return $icondata;
  }
 
  function LittleEndian2String($number, $minbytes=1) {
    $intstring = &#39;&#39;;
    while ($number > 0) {
      $intstring = $intstring.chr($number & 255);
      $number >>= 8;
    }
    return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
  }
 
  function GetPixelColor(&$img, $x, $y) {
    if (!is_resource($img)) {
      return false;
    }
    return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y));
  }
 
}
ログイン後にコピー

3、フロントデスク

Yii::$enableIncludePath = false;
Yii::import ( &#39;application.extensions.ico.phpthumb_ico&#39;, 1 );
ログイン後にコピー

と共有しますあなたは独立したクラスです

phpthumb.ico.php

/**
   * icoMaker 在线生成ICO图标
   * @author flashalliance
   */
  public function actionIco() {
    $this->breadcrumbs=array_merge($this->breadcrumbs,array(
        &#39;ICO图标制作&#39;
    ));
    $output = "";
    $errors=array();
    if(isset($_GET[&#39;action&#39;])&&$_GET[&#39;action&#39;] == &#39;make&#39;){
      if(isset($_FILES[&#39;upimage&#39;][&#39;tmp_name&#39;]) && $_FILES[&#39;upimage&#39;][&#39;tmp_name&#39;] && is_uploaded_file($_FILES[&#39;upimage&#39;][&#39;tmp_name&#39;])){
        if($_FILES[&#39;upimage&#39;][&#39;size&#39;]>204800){
          $errors[]="你上传的文件过大,最大不能超过200K。";
        }
        $fileext = array("image/pjpeg","image/jpeg","image/gif","image/x-png","image/png");
        if(!in_array($_FILES[&#39;upimage&#39;][&#39;type&#39;],$fileext)){
          $errors[]="你上传的文件格式不正确,仅支持 png, jpg, gif格式。";
        }
        if($im = @imagecreatefrompng($_FILES[&#39;upimage&#39;][&#39;tmp_name&#39;]) or $im = @imagecreatefromgif($_FILES[&#39;upimage&#39;][&#39;tmp_name&#39;]) or $im = @imagecreatefromjpeg($_FILES[&#39;upimage&#39;][&#39;tmp_name&#39;])){
          $imginfo = @getimagesize($_FILES[&#39;upimage&#39;][&#39;tmp_name&#39;]);
          if(!is_array($imginfo)){
            $errors[]="图像格式错误!";
          }
          if(empty($errors)){
            switch($_POST[&#39;size&#39;]){
              case 1;
              $resize_im = @imagecreatetruecolor(16,16);
              $size = 16;
              break;
              case 2;
              $resize_im = @imagecreatetruecolor(32,32);
              $size = 32;
              break;
              case 3;
              $resize_im = @imagecreatetruecolor(48,48);
              $size = 48;
              break;
              default;
              $resize_im = @imagecreatetruecolor(32,32);
              $size = 32;
              break;
            }
 
            imagesavealpha($im, true);
            imagealphablending($resize_im, false);//不合并颜色,直接用$im图像颜色替换,包括透明色
            imagesavealpha($resize_im, true);//不要丢了$resize_im图像的透明色,解决生成黑色背景的问题
            imagecopyresampled($resize_im,$im,0,0,0,0,$size,$size,$imginfo[0],$imginfo[1]);
 
            Yii::$enableIncludePath = false;
            Yii::import ( &#39;application.extensions.ico.phpthumb_ico&#39;, 1 );
            $icon = new phpthumb_ico();
            $gd_image_array = array($resize_im);
            $icon_data = $icon->GD2ICOstring($gd_image_array);
            $bas_path=dirname ( Yii::app ()->BasePath );
            $bas_new_path=$bas_path.&#39;/upload/ico/&#39;;
            if(!is_dir($bas_new_path)){
              mkdir($bas_new_path, 0777, true);
            }
            $filePath=$bas_new_path. date("Ymdhis").uniqid(). rand(1,1000) . ".ico";
            if(file_put_contents($filePath, $icon_data)){
              $output = str_replace($bas_path,&#39;&#39;,$filePath);
            }
          }
        }else{
          $errors[]="生成错误请重试!";
        }
      }
    }
    $this->render ( &#39;ico&#39;,array(&#39;output&#39;=>$output,&#39;errors&#39;=>$errors));
  }
ログイン後にコピー

Index.php
<p class="col-md-12">
  <p class="form-horizontal panel panel-default margin-t-10 b-img">
    <p class="panel-heading">
      <p class="pull-left"><span class="g-bg glyphicon glyphicon-wrench margin-r-2" aria-hidden="true"></span>在线制作ICO图标</p>
      <p class="clearfix"></p>
    </p>
<?php
$form = $this->beginWidget ( &#39;CActiveForm&#39;, array (
    &#39;id&#39; => &#39;ico-form&#39;,
    &#39;htmlOptions&#39; => array (
        &#39;id&#39; => &#39;view_table&#39;,
        &#39;class&#39; => &#39;add-form padding-10&#39;,
        &#39;enctype&#39;=>&#39;multipart/form-data&#39;
    ),
    &#39;action&#39;=>&#39;/tool/ico?action=make&#39;,
    &#39;enableAjaxValidation&#39; => false
) );
?>
    <p class="form-group">
        <label class="col-lg-2 control-label">上传文件</label>
        <p class="col-md-5">
          <p class="col-md-6">
            <input id="upimage" type="file" name="upimage" class="hidden">
            <input id="tmp_file" class="form-control" type="text">
          </p>
          <p class="col-md-6"><a class="btn btn-default" onclick="$(&#39;input[id=upimage]&#39;).click();">选择文件</a></p>
        </p>
    </p>
    <p class="form-group">
        <label class="col-lg-2 text-right">选择尺寸</label>
        <p class="col-lg-5 btn-group" data-toggle="buttons">
            <label class="btn btn-sm btn-default">
             <input type="radio" name="size" id="s1" value="1" checked="checked"> 16*16
            </label>
            <label class="btn btn-sm btn-default">
             <input type="radio" name="size" id="s2" value="2"> 32*32
            </label>
            <label class="btn btn-sm btn-default">
             <input type="radio" name="size" id="s3" value="3"> 48*48
            </label>
        </p>
    </p>
    <p class="form-group">
      <label class="col-lg-2 text-right">支持格式</label>
      <p class="col-lg-5">
       png,jpg,gif
      </p>
    </p>
    <p class="list_back">
      <input type="submit" value="生 成" class="btn btn-success">
    </p>
  </p>
<?php $this->endWidget(); ?>
<?php if(!empty($errors) or !empty($output)):?>
  <p class="form-horizontal panel panel-default margin-t-10 b-img">
    <p class="panel-heading margin-b-10">
      <p class="pull-left"><span class="g-bg glyphicon glyphicon-wrench margin-r-2" aria-hidden="true"></span>生成结果</p>
      <p class="clearfix"></p>
    </p>
    <?php if(!empty($errors)):?>
    <p class="form-group">
      <label class="col-lg-2 text-right">生成失败</label>
      <p class="col-lg-5">
      <?php foreach ($errors as $e):?>
      <?php echo $e;?><br>
      <?php endforeach;?>
      </p>
    </p>
    <?php endif;?>
    <?PHP if (!empty($output)):?>
    <?php
    $form = $this->beginWidget ( &#39;CActiveForm&#39;, array (
        &#39;id&#39; => &#39;ico-form&#39;,
        &#39;htmlOptions&#39; => array (
            &#39;id&#39; => &#39;view_table&#39;,
            &#39;class&#39; => &#39;add-form padding-10&#39;,
        ),
        &#39;action&#39;=>&#39;/tool/icoDownload&#39;,
        &#39;enableAjaxValidation&#39; => false
    ) );
    ?>
    <?php echo CHtml::hiddenField(&#39;filePath&#39;,$output);?>
    <p class="form-group">
      <label class="col-lg-2 text-right">成功生成</label>
      <p class="col-lg-5">
        <img alt="在线制作ICO图标_favicon.ico" src="<?php echo $output;?>" class="margin-r-10">
        <input type="submit" value="立即下载" class="btn btn-sm btn-success margin-l-10">
      </p>
    </p>
    <?php $this->endWidget(); ?>
    <?php endif;?>
  </p>
<?php endif;?>
</p>
<!-- form -->
ログイン後にコピー

概要: 上記がこの記事の全内容です。皆さんの学習に役立つことを願っています。

関連する推奨事項:

PHP オブザーバーモードの詳細な説明

PHP がメールクラスに基づいて電子メールを送信する方法

PHP 送信ポスト配列パラメーターの使用法

以上がICOアイコンを生成するPHPコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート