PHP generates ICO icons based on yii Framework

Source: Internet
Author: User
Tags transparent color php foreach
This article will share with you two pieces of code for generating ICO icons in php. The first one is implemented based on the YII Framework, and the second one is written in pure php, which is very good, for more information, see section 1. phpthumb_ico is the class for generating ICO icons. the source code is as follows:

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['alpha']) / 127));          $r = $argb['red'];          $g = $argb['green'];          $b = $argb['blue'];           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] .= '1';          } else {            @$icANDmask[$key][$y] .= '0';          }        }        // mask bits are 32-bit aligned per scanline        while (strlen($icANDmask[$key][$y]) % 32) {          $icANDmask[$key][$y] .= '0';        }      }      $icAND[$key] = '';      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, '0', STR_PAD_LEFT)));        }      }     }     foreach ($gd_image_array as $key => $gd_image) {      $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);       // BITMAPINFOHEADER - 40 bytes      $BitmapInfoHeader[$key] = '';      $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 '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 = '';    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));  } }

2. Background

Introduction class:

Yii::$enableIncludePath = false;Yii::import ( 'application.extensions.ico.phpthumb_ico', 1 );

Solve the problem of generating a black background

Imagealphablending ($ resize_im, false); // do not merge colors, replace directly with $ im image colors, including transparent colors
Imagesavealpha ($ resize_im, true); // do not lose the transparent color of $ resize_im image
Complete method:

/*** IcoMaker generates ICO icons online * @ author flashalliance */public function actionIco () {$ this-> breadcrumbs = array_merge ($ this-> breadcrumbs, array ('ico icon maker '); $ output = ""; $ errors = array (); if (isset ($ _ GET ['action']) & $ _ GET ['action'] = 'make') {if (isset ($ _ FILES ['upimage'] ['tmp _ name']) & $ _ FILES ['upload'] ['tmp _ name'] & is_uploaded_file ($ _ FILES ['upload'] ['tmp _ name']) {if ($ _ FILES ['upimage'] ['size']> 204 800) {$ errors [] = "the file you uploaded is too large to exceed 200 KB. ";}$ Fileext = array (" image/pjpeg "," image/jpeg "," image/gif "," image/x-png ", "image/png"); if (! In_array ($ _ FILES ['upimage'] ['type'], $ fileext) {$ errors [] = "the file you uploaded is incorrectly formatted and only supports png, jpg and gif formats. ";} If ($ im = @ imagecreatefrompng ($ _ FILES ['upimage'] ['tmp _ name']) or $ im = @ imagecreatefromgif ($ _ FILES ['upimage'] ['tmp _ name']) or $ im = @ imagecreatefromjpeg ($ _ FILES ['upimage'] ['tmp _ name']) {$ imginfo = @ getimagesize ($ _ FILES ['upimage'] ['tmp _ name']); if (! Is_array ($ imginfo) {$ errors [] = "incorrect image format! ";} If (empty ($ errors) {switch ($ _ POST ['size']) {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); // does not match And color, directly replace with $ im image color, including transparent imagesavealpha ($ resize_im, true); // do not lose the transparent color of $ resize_im image, imagecopyresampled ($ resize_im, $ im, $ size, $ imginfo [0], $ imginfo [1]); Yii :: $ enableIncludePath = false; Yii: import ('application. extensions. ico. phpthumb_ico ', 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. '/upload/ico/'; 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,'', $ filePath );}}} else {$ errors [] = "generation error. please try again! ";}}$ This-> render ('ico ', array ('output' => $ output, 'errors' => $ errors ));}

3. front-end

Create ICO icons online

<? Php $ form = $ this-> beginWidget ('cactiveform', array ('id' => 'ico-form ', 'htmlopexception' => array ('id' => 'View _ table', 'class' => 'Add-form padding-10 ', 'enabledype '=> 'multipart/form-data'), 'Action' =>'/tool/ico? Action = make ', 'enableajaxvalidation' => false);?>

Upload files

Select File

Select size

16*16 32*32 48*48

Supported formats

Png, jpg, and gif

<? Php $ this-> endWidget ();?> <? Php if (! Empty ($ errors) or! Empty ($ output):?>

Generate results

<? Php if (! Empty ($ errors):?>

Generation failed

<? Php foreach ($ errors as $ e):?> <? Php echo $ e;?>
<? Php endforeach;?>

<? Php endif;?> <? PHP if (! Empty ($ output):?> <? Php $ form = $ this-> beginWidget ('cactiveform', array ('id' => 'ico-form ', 'htmlopexception' => array ('id' => 'View _ table', 'class' => 'Add-form padding-10 ',), 'action' => '/tool/icodownload', 'enableajaxvalidation' => false);?> <? Php echo CHtml: hiddenField ('filepath', $ output);?>

Generated successfully

"Class =" margin-r-10 ">

<? Php $ this-> endWidget ();?> <? Php endif;?>

<? Php endif;?>

I will share with you an independent class.

Phpthumb. ico. php

<?php ////////////////////////////////////////////////////////////// /// phpThumb() by James Heinrich 
 
    // //    available at http://phpthumb.sourceforge.net   /// ////////////////////////////////////////////////////////////// ///                             // // phpthumb.ico.php - .ICO output format functions     // //                             /// ////////////////////////////////////////////////////////////// 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['alpha']) / 127));           $r = $argb['red'];           $g = $argb['green'];           $b = $argb['blue'];           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] .= '1';           } else {             @$icANDmask[$key][$y] .= '0';           }         }         // mask bits are 32-bit aligned per scanline         while (strlen($icANDmask[$key][$y]) % 32) {           $icANDmask[$key][$y] .= '0';         }       }       $icAND[$key] = '';       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, '0', STR_PAD_LEFT)));         }       }     }     foreach ($gd_image_array as $key => $gd_image) {       $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);       // BITMAPINFOHEADER - 40 bytes       $BitmapInfoHeader[$key] = '';       $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 '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 = '';     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));   } } ?>
 

Index. php

 Ico icon
    

<? PHP $ output = ""; if (isset ($ _ GET ['action']) & $ _ GET ['action'] = 'make ') {if (isset ($ _ FILES ['upimage'] ['tmp _ name']) & $ _ FILES ['upload'] ['tmp _ name'] & is_uploaded_file ($ _ FILES ['upload'] ['tmp _ name']) {if ($ _ FILES ['upimage'] ['type']> 210000) {echo "the size of the file you uploaded exceeds the limit and cannot exceed 200 KB "; exit () ;}$ fileext = array ("image/pjpeg", "image/gif", "image/x-png", "image/png ", "image/jpeg", "image/jpg"); if (! In_array ($ _ FILES ['upimage'] ['type'], $ fileext) {echo "the file format you uploaded is incorrect. only jpg, gif, and png FILES are supported "; exit ();} if ($ im = @ imagecreatefrompng ($ _ FILES ['upimage'] ['tmp _ name']) or $ im = @ imagecreatefromgif ($ _ FILES ['upimage'] ['tmp _ name']) or $ im = @ imagecreatefromjpeg ($ _ FILES ['upimage'] ['tmp _ name']) {$ imginfo = @ getimagesize ($ _ FILES ['upimage'] ['tmp _ name']); if (! Is_array ($ imginfo) {echo "incorrect image format! ";} Switch ($ _ POST ['size']) {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;} imagecopyresampled ($ resize_im, $ im, 0, 0, 0, $ size, $ size, $ imginfo [0], $ imginfo [1]); include" Phpthumb. ico. php "; $ icon = new phpthumb_ico (); $ gd_image_array = array ($ resize_im); $ icon_data = $ icon-> GD2ICOstring ($ gd_image_array ); $ filename = "temp /". date ("Ymdhis "). rand (1,1000 ). ". ico "; if (file_put_contents ($ filename, $ icon_data) {$ output =" generated successfully! Right-click and choose save as local.
Click to download ";}} else {echo" to generate an error. please try again! ";}}?>

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.