Вход Регистрация
Файл: ather_lib/graph/ico_images.php
Строк: 885
<?php
/**
 * @package com.jpexs.image.ico
 *
 * JPEXS ICO Image functions
 * @version 2.1
 * @author JPEXS
 * @copyright (c) JPEXS 2004-2009
 *
 * Webpage: http://www.jpexs.com
 * Email: jpexs@jpexs.com
 *
 * If you like my script, you can donate... visit my webpages or email me for more info.
 *
 *        Version changes:
 *                v2.1 - redesigned sourcecode, phpdoc included, all internal functions and global variables have prefix "jpexs_"
 *                v2.0 - For icons with Alpha channel now you can set background color
 *                     - ImageCreateFromExeIco added
 *                     - Fixed ICO_MAX_SIZE and ICO_MAX_COLOR values
 *
 * TODO list:
 *      - better error handling
 *      - class encapsulation
 * License:
 *      - you can freely use it
 *      - you can freely distribute sourcecode
 *      - you can freely modify it as long as you leave my copyright/author info in source code
 *      - if you developing closesource application, you should add my name at least to "about" page of your web application
 *      - if you create an amazing modification, please contact me... I can publish link to your webpage if you're interested...
 *      - if you want to use my script in commercial application for earning money, you should make a donation to me first
 */

/** TrueColor images constant  */
define("ICO_TRUE_COLOR"0x1000000);
/** XPColor images constant (Alpha channel) */
define("ICO_XP_COLOR"4294967296);
/** Image with maximum colors */
define("ICO_MAX_COLOR", -2);
/** Image with maximal size */
define("ICO_MAX_SIZE", -2);


/** TrueColor images constant
 * @deprecated Deprecated since version 2.1, please use ICO_ constants
 */
define("TRUE_COLOR"0x1000000);
/** XPColor images constant (Alpha channel)
 * @deprecated Deprecated since version 2.1, please use ICO_ constants
 */
define("XP_COLOR"4294967296);
/** Image with maximum colors
 * @deprecated Deprecated since version 2.1, please use ICO_ constants
 */
define("MAX_COLOR", -2);
/** Image with maximal size
 * @deprecated Deprecated since version 2.1, please use ICO_ constants
 */
define("MAX_SIZE", -2);


/**
 * Reads image from a ICO file
 *
 * @param string $filename Target ico file to load
 * @param int $icoColorCount Icon color count (For multiple icons ico file) - 2,16,256, ICO_TRUE_COLOR, ICO_XP_COLOR or ICO_MAX_COLOR
 * @param int $icoSize Icon width (For multiple icons ico file) or ICO_MAX_SIZE
 * @param int $alphaBgR Background color R value for alpha-channel images (Default is White)
 * @param int $alphaBgG Background color G value for alpha-channel images (Default is White)
 * @param int $alphaBgB Background color B value for alpha-channel images (Default is White)
 * @return resource Image resource
 */
function imageCreateFromIco($filename,$icoColorCount=ICO_MAX_COLOR,$icoSize=ICO_MAX_SIZE,$alphaBgR=255,$alphaBgG=255,$alphaBgB=255)
{
$Ikona=jpexs_GetIconsInfo($filename);

$IconID=-1;

$ColMax=-1;
$SizeMax=-1;

for(
$p=0;$p<count($Ikona);$p++)
{
$Ikona[$p]["NumberOfColors"]=pow(2,$Ikona[$p]["Info"]["BitsPerPixel"]);
};

for(
$p=0;$p<count($Ikona);$p++)
{

if((
$ColMax==-1)or($Ikona[$p]["NumberOfColors"]>=$Ikona[$ColMax]["NumberOfColors"]))
if((
$icoSize==$Ikona[$p]["Width"])or($icoSize==ICO_MAX_SIZE))
 {
  
$ColMax=$p;
 };

if((
$SizeMax==-1)or($Ikona[$p]["Width"]>=$Ikona[$SizeMax]["Width"]))
if((
$icoColorCount==$Ikona[$p]["NumberOfColors"])or($icoColorCount==ICO_MAX_COLOR))
 {
   
$SizeMax=$p;
 };


if(
$Ikona[$p]["NumberOfColors"]==$icoColorCount)
if(
$Ikona[$p]["Width"]==$icoSize)
 {

 
$IconID=$p;
 };
};

  if(
$icoColorCount==ICO_MAX_COLOR$IconID=$ColMax;
  if(
$icoSize==ICO_MAX_SIZE$IconID=$SizeMax;

$ColName=$icoColorCount;

if(
$icoSize==ICO_MAX_SIZE$icoSize="Max";
if(
$ColName==ICO_TRUE_COLOR$ColName="True";
if(
$ColName==ICO_XP_COLOR$ColName="XP";
if(
$ColName==ICO_MAX_COLOR$ColName="Max";
if(
$IconID==-1) die("Icon with $ColName colors and $icoSize x $icoSize size doesn't exist in this file!");


jpexs_readIcon($filename,$IconID,$Ikona);

 
$biBitCount=$Ikona[$IconID]["Info"]["BitsPerPixel"];


  if(
$Ikona[$IconID]["Info"]["BitsPerPixel"]==0)
  {
  
$Ikona[$IconID]["Info"]["BitsPerPixel"]=24;
  };

 
$biBitCount=$Ikona[$IconID]["Info"]["BitsPerPixel"];
 if(
$biBitCount==0$biBitCount=1;


$Ikona[$IconID]["BitCount"]=$Ikona[$IconID]["Info"]["BitsPerPixel"];



if(
$Ikona[$IconID]["BitCount"]>=24)
{
$img=imagecreatetruecolor($Ikona[$IconID]["Width"],$Ikona[$IconID]["Height"]);
if(
$Ikona[$IconID]["BitCount"]==32):
  
$backcolor=imagecolorallocate($img,$alphaBgR,$alphaBgG,$alphaBgB);
  
imagefilledrectangle($img,0,0,$Ikona[$IconID]["Width"]-1,$Ikona[$IconID]["Height"]-1,$backcolor);
endif;
for(
$y=0;$y<$Ikona[$IconID]["Height"];$y++)
for(
$x=0;$x<$Ikona[$IconID]["Width"];$x++)
 {
 
$R=$Ikona[$IconID]["Data"][$x][$y]["r"];
 
$G=$Ikona[$IconID]["Data"][$x][$y]["g"];
 
$B=$Ikona[$IconID]["Data"][$x][$y]["b"];
 if(
$Ikona[$IconID]["BitCount"]==32)
 {
 
$Alpha=127-round($Ikona[$IconID]["Data"][$x][$y]["alpha"]*127/255);
 if(
$Ikona[$IconID]["Maska"][$x][$y]==1$Alpha=127;
 
$color=imagecolorexactalpha($img,$R,$G,$B,$Alpha);
 if(
$color==-1$color=imagecolorallocatealpha($img,$R,$G,$B,$Alpha);
 }
 else
 {
 
$color=imagecolorexact($img,$R,$G,$B);
 if(
$color==-1$color=imagecolorallocate($img,$R,$G,$B);
 };

 
imagesetpixel($img,$x,$y,$color);

 };

}
else
{
$img=imagecreate($Ikona[$IconID]["Width"],$Ikona[$IconID]["Height"]);
for(
$p=0;$p<count($Ikona[$IconID]["Paleta"]);$p++)
 
$Paleta[$p]=imagecolorallocate($img,$Ikona[$IconID]["Paleta"][$p]["r"],$Ikona[$IconID]["Paleta"][$p]["g"],$Ikona[$IconID]["Paleta"][$p]["b"]);

for(
$y=0;$y<$Ikona[$IconID]["Height"];$y++)
for(
$x=0;$x<$Ikona[$IconID]["Width"];$x++)
 {
 
imagesetpixel($img,$x,$y,$Paleta[$Ikona[$IconID]["Data"][$x][$y]]);
 };
};
$IsTransparent=false;  
for(
$y=0;$y<$Ikona[$IconID]["Height"];$y++)
for(
$x=0;$x<$Ikona[$IconID]["Width"];$x++)
 if(
$Ikona[$IconID]["Maska"][$x][$y]==1)
  {
   
$IsTransparent=true;
   break;
  };
if(
$Ikona[$IconID]["BitCount"]==32)
{
 
imagealphablending($imgfalse);
 if(
function_exists("imagesavealpha"))
  
imagesavealpha($img,true);
};

if(
$IsTransparent)
 {
  if((
$Ikona[$IconID]["BitCount"]>=24)or(imagecolorstotal($img)>=256))
   {
   
$img2=imagecreatetruecolor(imagesx($img),imagesy($img));
   
imagecopy($img2,$img,0,0,0,0,imagesx($img),imagesy($img));
   
imagedestroy($img);
   
$img=$img2;
   
imagetruecolortopalette($img,true,255);

   };
    
$Pruhledna=imagecolorallocate($img,0,0,0);
    for(
$y=0;$y<$Ikona[$IconID]["Height"];$y++)
     for(
$x=0;$x<$Ikona[$IconID]["Width"];$x++)
      if(
$Ikona[$IconID]["Maska"][$x][$y]==1)
       {
        
imagesetpixel($img,$x,$y,$Pruhledna);
       };
  
imagecolortransparent($img,$Pruhledna);
 };

return 
$img;


};




function 
jpexs_readIcon($filename,$id,&$Ikona)
{
global 
$jpexs_currentBit;

$f=fopen($filename,"rb");

fseek($f,6+$id*16);
  
$Width=jpexs_freadbyte($f);
  
$Height=jpexs_freadbyte($f);
fseek($f,6+$id*16+12);
$OffSet=jpexs_freaddword($f);
fseek($f,$OffSet);

$p=$id;

  
$Ikona[$p]["Info"]["HeaderSize"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["ImageWidth"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["ImageHeight"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["NumberOfImagePlanes"]=jpexs_freadword($f);
  
$Ikona[$p]["Info"]["BitsPerPixel"]=jpexs_freadword($f);
  
$Ikona[$p]["Info"]["CompressionMethod"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["SizeOfBitmap"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["HorzResolution"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["VertResolution"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["NumColorUsed"]=jpexs_freadlngint($f);
  
$Ikona[$p]["Info"]["NumSignificantColors"]=jpexs_freadlngint($f);


 
$biBitCount=$Ikona[$p]["Info"]["BitsPerPixel"];

 if(
$Ikona[$p]["Info"]["BitsPerPixel"]<=8)
  {

 
$barev=pow(2,$biBitCount);

  for(
$b=0;$b<$barev;$b++)
    {
    
$Ikona[$p]["Paleta"][$b]["b"]=jpexs_freadbyte($f);
    
$Ikona[$p]["Paleta"][$b]["g"]=jpexs_freadbyte($f);
    
$Ikona[$p]["Paleta"][$b]["r"]=jpexs_freadbyte($f);
    
jpexs_freadbyte($f);
    };

$Zbytek=(4-ceil(($Width/(8/$biBitCount)))%4)%4;


for(
$y=$Height-1;$y>=0;$y--)
    {
     
$jpexs_currentBit=0;
     for(
$x=0;$x<$Width;$x++)
      {
         
$C=jpexs_freadbits($f,$biBitCount);
         
$Ikona[$p]["Data"][$x][$y]=$C;
      };

    if(
$jpexs_currentBit!=0) {jpexs_freadbyte($f);};
    for(
$g=0;$g<$Zbytek;$g++)
     
jpexs_freadbyte($f);
     };

}
elseif(
$biBitCount==24)
{
 
$Zbytek=$Width%4;

   for(
$y=$Height-1;$y>=0;$y--)
    {
     for(
$x=0;$x<$Width;$x++)
      {
       
$B=jpexs_freadbyte($f);
       
$G=jpexs_freadbyte($f);
       
$R=jpexs_freadbyte($f);
       
$Ikona[$p]["Data"][$x][$y]["r"]=$R;
       
$Ikona[$p]["Data"][$x][$y]["g"]=$G;
       
$Ikona[$p]["Data"][$x][$y]["b"]=$B;
      }
    for(
$z=0;$z<$Zbytek;$z++)
     
jpexs_freadbyte($f);
   };
}
elseif(
$biBitCount==32)
{
 
$Zbytek=$Width%4;

   for(
$y=$Height-1;$y>=0;$y--)
    {
     for(
$x=0;$x<$Width;$x++)
      {
       
$B=jpexs_freadbyte($f);
       
$G=jpexs_freadbyte($f);
       
$R=jpexs_freadbyte($f);
       
$Alpha=jpexs_freadbyte($f);
       
$Ikona[$p]["Data"][$x][$y]["r"]=$R;
       
$Ikona[$p]["Data"][$x][$y]["g"]=$G;
       
$Ikona[$p]["Data"][$x][$y]["b"]=$B;
       
$Ikona[$p]["Data"][$x][$y]["alpha"]=$Alpha;
      }
    for(
$z=0;$z<$Zbytek;$z++)
     
jpexs_freadbyte($f);
   };
};


//Maska
$Zbytek=(4-ceil(($Width/(8)))%4)%4;
for(
$y=$Height-1;$y>=0;$y--)
    {
     
$jpexs_currentBit=0;
     for(
$x=0;$x<$Width;$x++)
      {
         
$C=jpexs_freadbits($f,1);
         
$Ikona[$p]["Maska"][$x][$y]=$C;
      };
    if(
$jpexs_currentBit!=0) {jpexs_freadbyte($f);};
    for(
$g=0;$g<$Zbytek;$g++)
     
jpexs_freadbyte($f);
     };
//--------------

fclose($f);

};

function 
jpexs_GetIconsInfo($filename)
{
global 
$jpexs_currentBit;

$f=fopen($filename,"rb");

$Reserved=jpexs_freadword($f);
$Type=jpexs_freadword($f);
$Count=jpexs_freadword($f);
for(
$p=0;$p<$Count;$p++)
 {
  
$Ikona[$p]["Width"]=jpexs_freadbyte($f);
  
$Ikona[$p]["Height"]=jpexs_freadbyte($f);
  
$Ikona[$p]["ColorCount"]=jpexs_freadword($f);
 if(
$Ikona[$p]["ColorCount"]==0$Ikona[$p]["ColorCount"]=256;
  
$Ikona[$p]["Planes"]=jpexs_freadword($f);
  
$Ikona[$p]["BitCount"]=jpexs_freadword($f);
  
$Ikona[$p]["BytesInRes"]=jpexs_freaddword($f);
  
$Ikona[$p]["ImageOffset"]=jpexs_freaddword($f);
 };

if(!
feof($f)):
  for(
$p=0;$p<$Count;$p++)
   {
    
fseek($f,$Ikona[$p]["ImageOffset"]+14);
    
$Ikona[$p]["Info"]["BitsPerPixel"]=jpexs_freadword($f);
   };
endif;
fclose($f);
return 
$Ikona;
};




/**
 * Reads image from a icon in exe file
 * @param string $filename Target exefile
 * @param int $icoIndex Index of the icon in exefile
 * @param int $icoColorCount Icon color count (For multiple icons ico file) - 2,16,256, ICO_TRUE_COLOR, ICO_XP_COLOR or ICO_MAX_COLOR
 * @param int $icoSize Icon width (For multiple icons ico file) or ICO_MAX_SIZE
 * @param int $alphaBgR Background color R value for alpha-channel images (Default is White)
 * @param int $alphaBgG Background color G value for alpha-channel images (Default is White)
 * @param int $alphaBgB Background color B value for alpha-channel images (Default is White)
 * @return resource Image resource or false on error
 */
function imageCreateFromExeIco($filename,$icoIndex,$icoColorCount=16,$icoSize=16,$alphaBgR=255,$alphaBgG=255,$alphaBgB=255)
{
 
$ok=saveExeIcon($filename,"icotemp.dat",$icoIndex);
 if(!
$ok):
  
$im=false;
 else:
   
$im=imageCreateFromIco("icotemp.dat",$icoColorCount,$icoSize,$alphaBgR,$alphaBgG,$alphaBgB);
   
unlink("icotemp.dat");
 endif;
 return 
$im;
};


/**
 * Saves icon(s) from the exe file
 * @global int $jpexs_StartOfRsrc Internal reserved variable
 * @global int $jpexs_ImageBase Internal reserved variable
 * @global int $jpexs_ResVirtualAddress Internal reserved variable
 * @param string $filename Target exefile
 * @param string $icoFileNameOrPath Filename to save ico or path (Default "") Path if you want more than 1 icon. If "", the filename is "$icoIndex.ico"
 * @param int|array $iconIndex Index(es) of the icon in exefile  (Default -1) If -1, all icons are saved, Can be an array of indexes.
 * @return boolean True on successful save
 */
function saveExeIcon($filename,$icoFileNameOrPath="",$iconIndex=-1/*-1 for all,or can be array*/
{
  global 
$jpexs_f,$jpexs_StartOfRsrc,$jpexs_ImageBase,$jpexs_ResVirtualAddress;
  
$jpexs_f=fopen($filename,"r");
  
$MZ=fread($jpexs_f,2);
  if(
$MZ!="MZ"NotValidExe();
  
fseek($jpexs_f,60);
  
$OffsetToNewHeader=jpexs_freaddword($jpexs_f);
  
fseek($jpexs_f,$OffsetToNewHeader);
  
$PE=fread($jpexs_f,2);
  if(
$PE!="PE"NotValidExe();
  
fread($jpexs_f,4);
  
$NumberOfSections=jpexs_freadword($jpexs_f);
  
fseek($jpexs_f,ftell($jpexs_f)+12);
  
$SizeOfOptionalHeader=jpexs_freadword($jpexs_f);
  
$PosMagic=ftell($jpexs_f)+2;
  
fseek($jpexs_f,$PosMagic+$SizeOfOptionalHeader);

  for(
$p=0;$p<$NumberOfSections;$p++):
    
$SectionName[$p]=trim(fread($jpexs_f,8));
    
$VirtualSize[$p]=jpexs_freaddword($jpexs_f);
    
$VirtualAddress[$p]=jpexs_freaddword($jpexs_f);
    
$PhysicalSize[$p]=jpexs_freaddword($jpexs_f);
    
$PhysicalOffset[$p]=jpexs_freaddword($jpexs_f);
    
fread($jpexs_f,16);
    if(
$SectionName[$p]==".rsrc"):
      
$jpexs_ResVirtualAddress=$VirtualAddress[$p];
      
fseek($jpexs_f,$PhysicalOffset[$p]);
      
$jpexs_StartOfRsrc=$PhysicalOffset[$p];
      
jpexs_readResDirectoryEntry($R,$PhysicalOffset[$p]);
      
$IconCount=null;
      
$Ikona=null;
      while (list (
$key$val) = each ($R["Subdir"])):
        if(
$key==14):
          
$r=0;
          while (list (
$key2$val2) = each ($R["Subdir"][$key]["Subdir"])):
             while (list (
$key3$val3) = each ($R["Subdir"][$key]["Subdir"][$key2]["Subdir"])):
               
fseek($jpexs_f,$val3["DataOffset"]);
               
$Reserved=jpexs_freadword($jpexs_f);
               
$Type=jpexs_freadword($jpexs_f);
               
$ic=jpexs_freadword($jpexs_f);
               
$IconCount[]=$ic;
               for(
$s=0;$s<$ic;$s++)
                {
                 
$Ikona[$r][$s]["Width"]=jpexs_freadbyte($jpexs_f);
                 
$Ikona[$r][$s]["Height"]=jpexs_freadbyte($jpexs_f);
                 
$Ikona[$r][$s]["ColorCount"]=jpexs_freadword($jpexs_f);
                 
$Ikona[$r][$s]["Planes"]=jpexs_freadword($jpexs_f);
                 
$Ikona[$r][$s]["BitCount"]=jpexs_freadword($jpexs_f);
                 
$Ikona[$r][$s]["BytesInRes"]=jpexs_freaddword($jpexs_f);
                 
$Ikona[$r][$s]["IconId"]=jpexs_freadword($jpexs_f);
                };
               
fseek($jpexs_f,$val3["DataOffset"]);
               
$r++;
             endwhile;
          endwhile;
        endif;
      endwhile;

      
reset ($R["Subdir"]);

      while (list (
$key$val) = each ($R["Subdir"])):
        if(
$key==3):
          while (list (
$key2$val2) = each ($R["Subdir"][$key]["Subdir"])):
          for(
$r=0;$r<count($Ikona);$r++):
           for(
$s=0;$s<count($Ikona[$r]);$s++):
             while (list (
$key3$val3) = each ($R["Subdir"][$key]["Subdir"][$Ikona[$r][$s]["IconId"]]["Subdir"])):
               if((
$iconIndex==$r)or($iconIndex==-1)or((is_array($iconIndex))and(in_array($r,$iconIndex)))):
                 
fseek($jpexs_f,$val3["DataOffset"]);
                 
$Ikona[$r][$s]["Data"]=fread($jpexs_f,$val3["DataSize"]);
                 
$Ikona[$r][$s]["DataSize"]=$val3["DataSize"];
               endif;
             endwhile;
           endfor;
           endfor;
          endwhile;
        endif;
      endwhile;
      
$ok=false;
      for(
$r=0;$r<count($Ikona);$r++):
        if((
$iconIndex==$r)or($iconIndex==-1)or((is_array($iconIndex))and(in_array($r,$iconIndex)))):
          
$savefile=$icoFileNameOrPath;
          if(
$icoFileNameOrPath=="")
           {
             
$savefile="$r.ico";
           }
           else
           {
            if((
$iconIndex==-1)or(is_array($iconIndex)))
              
$savefile=$icoFileNameOrPath."$r.ico";
           };
          
$f2=fopen($savefile,"w");
          
fwrite($f2,jpexs_inttoword(0));
          
fwrite($f2,jpexs_inttoword(1));
          
fwrite($f2,jpexs_inttoword(count($Ikona[$r])));
          
$Offset=6+16*count($Ikona[$r]);
          for(
$s=0;$s<count($Ikona[$r]);$s++):
            
fwrite($f2,jpexs_inttobyte($Ikona[$r][$s]["Width"]));
            
fwrite($f2,jpexs_inttobyte($Ikona[$r][$s]["Height"]));
            
fwrite($f2,jpexs_inttoword($Ikona[$r][$s]["ColorCount"]));
            
fwrite($f2,jpexs_inttoword($Ikona[$r][$s]["Planes"]));
            
fwrite($f2,jpexs_inttoword($Ikona[$r][$s]["BitCount"]));
            
fwrite($f2,jpexs_inttodword($Ikona[$r][$s]["BytesInRes"]));
            
fwrite($f2,jpexs_inttodword($Offset));
            
$Offset+=$Ikona[$r][$s]["DataSize"];
          endfor;
          for(
$s=0;$s<count($Ikona[$r]);$s++):
            
fwrite($f2,$Ikona[$r][$s]["Data"]);
          endfor;
          
fclose($f2);
          
$ok=true;
        endif;
      endfor;
      return 
$ok;
    endif;
  endfor;

  
fclose($jpexs_f);
};

/**
 * Internal function for reading exe icons
 */
function jpexs_readResDirectoryEntry(&$parentRes,$offset)
{
global 
$jpexs_f,$jpexs_StartOfRsrc,$jpexs_ImageBase,$jpexs_ResVirtualAddress;
$lastPos=ftell($jpexs_f);
$Res=null;
fseek($jpexs_f,$offset);
//IMAGE_RESOURCE_DIRECTORY
      
$Characteristics=jpexs_freaddword($jpexs_f);
      
$TimeDateStamp=jpexs_freaddword($jpexs_f);
      
$MajorVersion=jpexs_freadword($jpexs_f);
      
$MinorVersion=jpexs_freadword($jpexs_f);
      
$NumberOfNamedEntries=jpexs_freadword($jpexs_f);
      
$NumberOfIdEntries=jpexs_freadword($jpexs_f);
      for(
$q=0;$q<$NumberOfNamedEntries+$NumberOfIdEntries;$q++):
        
//IMAGE_RESOURCE_DIRECTORY_ENTRY
        
$ResName=jpexs_freaddword($jpexs_f);
        
$lastPos2=ftell($jpexs_f);
        if(
$ResName>=0x80000000):
          
//String Name
          
$ResNameOffset=$ResName-0x80000000;
          
fseek($jpexs_f,$jpexs_StartOfRsrc+$ResNameOffset);
          
$StringLength=jpexs_freadword($jpexs_f);
          
$Identificator=(fread($jpexs_f,$StringLength*2));
          
fseek($jpexs_f,$lastPos2);
        else:
          
//Integer Id
          
$Identificator=$ResName;
        endif;

        
$ResOffsetToData=jpexs_freaddword($jpexs_f);
        if(
$ResOffsetToData>=0x80000000):
          
$SubResOffset=$ResOffsetToData-0x80000000;
          
jpexs_readResDirectoryEntry($Res["$Identificator"],$jpexs_StartOfRsrc+$SubResOffset);
        else:
          
$RawDataOffset=$ResOffsetToData;
          
$lastPos2=ftell($jpexs_f);
          
fseek($jpexs_f,$jpexs_StartOfRsrc+$RawDataOffset);
          
//IMAGE_RESOURCE_DATA_ENTRY
          
$OffsetToData=jpexs_freaddword($jpexs_f);
          
$Res["$Identificator"]["DataOffset"]=$jpexs_StartOfRsrc-$jpexs_ResVirtualAddress+$OffsetToData;
          
$Res["$Identificator"]["DataSize"]=jpexs_freaddword($jpexs_f);
          
$CodePage=jpexs_freaddword($jpexs_f);
          
$Reserved=jpexs_freaddword($jpexs_f);
          
fseek($jpexs_f,$lastPos2);
        endif;
      endfor;
fseek($jpexs_f,$lastPos);
$parentRes["Subdir"]=$Res;
};

/**
 * Creates ico file from image resource(s)
 * @param resource|array $images Target Image resource (Can be array of image resources)
 * @param string $filename Target ico file to save icon to, If ommited or "", image is written to snadard output - use header("Content-type: image/x-icon"); */
function imageIco($images,$filename="")
{

if(
is_array($images))
{
$ImageCount=count($images);
$Image=$images;
}
else
{
$Image[0]=$images;
$ImageCount=1;
};


$WriteToFile=false;

if(
$filename!="")
{
$WriteToFile=true;
};


$ret="";

$ret.=jpexs_inttoword(0); //PASSWORD
$ret.=jpexs_inttoword(1); //SOURCE
$ret.=jpexs_inttoword($ImageCount); //ICONCOUNT


for($q=0;$q<$ImageCount;$q++)
{
$img=$Image[$q];

$Width=imagesx($img);
$Height=imagesy($img);

$ColorCount=imagecolorstotal($img);

$Transparent=imagecolortransparent($img);
$IsTransparent=$Transparent!=-1;


if(
$IsTransparent$ColorCount--;

if(
$ColorCount==0) {$ColorCount=0$BitCount=24;};
if((
$ColorCount>0)and($ColorCount<=2)) {$ColorCount=2$BitCount=1;};
if((
$ColorCount>2)and($ColorCount<=16)) { $ColorCount=16$BitCount=4;};
if((
$ColorCount>16)and($ColorCount<=256)) { $ColorCount=0$BitCount=8;};


//ICONINFO:
$ret.=jpexs_inttobyte($Width);//
$ret.=jpexs_inttobyte($Height);//
$ret.=jpexs_inttobyte($ColorCount);//
$ret.=jpexs_inttobyte(0);//RESERVED

$Planes=0;
if(
$BitCount>=8$Planes=1;

$ret.=jpexs_inttoword($f,$Planes);//PLANES
if($BitCount>=8$WBitCount=$BitCount;
if(
$BitCount==4$WBitCount=0;
if(
$BitCount==1$WBitCount=0;
$ret.=jpexs_inttoword($WBitCount);//BITS

$Zbytek=(4-($Width/(8/$BitCount))%4)%4;
$ZbytekMask=(4-($Width/8)%4)%4;

$PalSize=0;

$Size=40+($Width/(8/$BitCount)+$Zbytek)*$Height+(($Width/8+$ZbytekMask) * $Height);
if(
$BitCount<24)
 
$Size+=pow(2,$BitCount)*4;
$IconId=1;
$ret.=jpexs_inttodword($Size); //SIZE
$OffSet=6+16*$ImageCount+$FullSize;
$ret.=jpexs_inttodword(6+16*$ImageCount+$FullSize);//OFFSET
$FullSize+=$Size;
//-------------

};


for(
$q=0;$q<$ImageCount;$q++)
{
$img=$Image[$q];
$Width=imagesx($img);
$Height=imagesy($img);
$ColorCount=imagecolorstotal($img);

$Transparent=imagecolortransparent($img);
$IsTransparent=$Transparent!=-1;

if(
$IsTransparent$ColorCount--;
if(
$ColorCount==0) {$ColorCount=0$BitCount=24;};
if((
$ColorCount>0)and($ColorCount<=2)) {$ColorCount=2$BitCount=1;};
if((
$ColorCount>2)and($ColorCount<=16)) { $ColorCount=16$BitCount=4;};
if((
$ColorCount>16)and($ColorCount<=256)) { $ColorCount=0$BitCount=8;};



//ICONS
$ret.=jpexs_inttodword(40);//HEADSIZE
$ret.=jpexs_inttodword($Width);//
$ret.=jpexs_inttodword(2*$Height);//
$ret.=jpexs_inttoword(1); //PLANES
$ret.=jpexs_inttoword($BitCount);   //
$ret.=jpexs_inttodword(0);//Compress method


$ZbytekMask=($Width/8)%4;

$Zbytek=($Width/(8/$BitCount))%4;
$Size=($Width/(8/$BitCount)+$Zbytek)*$Height+(($Width/8+$ZbytekMask) * $Height);

$ret.=jpexs_inttodword($Size);//SIZE

$ret.=jpexs_inttodword(0);//HPIXEL_M
$ret.=jpexs_inttodword(0);//V_PIXEL_M
$ret.=jpexs_inttodword($ColorCount); //UCOLORS
$ret.=jpexs_inttodword(0); //DCOLORS
//---------------


$CC=$ColorCount;
if(
$CC==0$CC=256;

if(
$BitCount<24)
{
 
$ColorTotal=imagecolorstotal($img);
 if(
$IsTransparent$ColorTotal--;

 for(
$p=0;$p<$ColorTotal;$p++)
  {
   
$color=imagecolorsforindex($img,$p);
   
$ret.=jpexs_inttobyte($color["blue"]);
   
$ret.=jpexs_inttobyte($color["green"]);
   
$ret.=jpexs_inttobyte($color["red"]);
   
$ret.=jpexs_inttobyte(0); //RESERVED
  
};

 
$CT=$ColorTotal;
 for(
$p=$ColorTotal;$p<$CC;$p++)
  {
   
$ret.=jpexs_inttobyte(0);
   
$ret.=jpexs_inttobyte(0);
   
$ret.=jpexs_inttobyte(0);
   
$ret.=jpexs_inttobyte(0); //RESERVED
  
};
};






if(
$BitCount<=8)
{

 for(
$y=$Height-1;$y>=0;$y--)
 {
  
$bWrite="";
  for(
$x=0;$x<$Width;$x++)
   {
   
$color=imagecolorat($img,$x,$y);
   if(
$color==$Transparent)
    
$color=imagecolorexact($img,0,0,0);
   if(
$color==-1$color=0;
   if(
$color>pow(2,$BitCount)-1$color=0;

   
$bWrite.=jpexs_decbinx($color,$BitCount);
   if(
strlen($bWrite)==8)
    {
     
$ret.=jpexs_inttobyte(bindec($bWrite));
     
$bWrite="";
    };
   };

  if((
strlen($bWrite)<8)and(strlen($bWrite)!=0))
    {
     
$sl=strlen($bWrite);
     for(
$t=0;$t<8-$sl;$t++)
      
$sl.="0";
     
$ret.=jpexs_inttobyte(bindec($bWrite));
    };
  for(
$z=0;$z<$Zbytek;$z++)
   
$ret.=jpexs_inttobyte(0);
 };
};



if(
$BitCount>=24)
{
 for(
$y=$Height-1;$y>=0;$y--)
 {
  for(
$x=0;$x<$Width;$x++)
   {
   
$color=imagecolorsforindex($img,imagecolorat($img,$x,$y));
   
$ret.=jpexs_inttobyte($color["blue"]);
   
$ret.=jpexs_inttobyte($color["green"]);
   
$ret.=jpexs_inttobyte($color["red"]);
   if(
$BitCount==32)
    
$ret.=jpexs_inttobyte(0);//Alpha for ICO_XP_COLORS
   
};
  for(
$z=0;$z<$Zbytek;$z++)
   
$ret.=jpexs_inttobyte(0);
 };
};


//MASK

 
for($y=$Height-1;$y>=0;$y--)
 {
  
$byteCount=0;
  
$bOut="";
  for(
$x=0;$x<$Width;$x++)
   {
    if((
$Transparent!=-1)and(imagecolorat($img,$x,$y)==$Transparent))
     {
      
$bOut.="1";
     }
     else
     {
      
$bOut.="0";
     };
   };
  for(
$p=0;$p<strlen($bOut);$p+=8)
  {
   
$byte=bindec(substr($bOut,$p,8));
   
$byteCount++;
   
$ret.=jpexs_inttobyte($byte);
  };
 
$Zbytek=$byteCount%4;
  for(
$z=0;$z<$Zbytek;$z++)
   {
   
$ret.=jpexs_inttobyte(0xff);
   };
 };

//------------------

};//q





if($WriteToFile)
{
 
$f=fopen($filename,"w");
 
fwrite($f,$ret);
 
fclose($f);
}
else
{
 echo 
$ret;
};

};




/*
* Internal functions:
*-------------------------
* jpexs_inttobyte($n) - returns chr(n)
* jpexs_inttodword($n) - returns dword (n)
* jpexs_inttoword($n) - returns word(n)
* jpexs_freadbyte($file) - reads 1 byte from $file
* jpexs_freadword($file) - reads 2 bytes (1 word) from $file
* jpexs_freaddword($file) - reads 4 bytes (1 dword) from $file
* jpexs_freadlngint($file) - same as freaddword($file)
* jpexs_decbin8($d) - returns binary string of d zero filled to 8
* jpexs_RetBits($byte,$start,$len) - returns bits $start->$start+$len from $byte
* jpexs_freadbits($file,$count) - reads next $count bits from $file
*/


function jpexs_decbin8($d)
{
return 
jpexs_decbinx($d,8);
};

function 
jpexs_decbinx($d,$n)
{
$bin=decbin($d);
$sbin=strlen($bin);
for(
$j=0;$j<$n-$sbin;$j++)
 
$bin="0$bin";
return 
$bin;
};

function 
jpexs_retBits($byte,$start,$len)
{
$bin=jpexs_decbin8($byte);
$r=bindec(substr($bin,$start,$len));
return 
$r;

};



$jpexs_currentBit=0;
function 
jpexs_freadbits($f,$count)
{
 global 
$jpexs_currentBit,$jpexs_SMode;
 
$Byte=jpexs_freadbyte($f);
 
$LastCBit=$jpexs_currentBit;
 
$jpexs_currentBit+=$count;
 if(
$jpexs_currentBit==8)
  {
   
$jpexs_currentBit=0;
  }
 else
  {
   
fseek($f,ftell($f)-1);
  };
 return 
jpexs_retBits($Byte,$LastCBit,$count);
};


function 
jpexs_freadbyte($f)
{
 return 
ord(fread($f,1));
};

function 
jpexs_freadword($f)
{
 
$b1=jpexs_freadbyte($f);
 
$b2=jpexs_freadbyte($f);
 return 
$b2*256+$b1;
};


function 
jpexs_freadlngint($f)
{
return 
jpexs_freaddword($f);
};

function 
jpexs_freaddword($f)
{
 
$b1=jpexs_freadword($f);
 
$b2=jpexs_freadword($f);
 return 
$b2*65536+$b1;
};

function 
jpexs_inttobyte($n)
{
return 
chr($n);
};

function 
jpexs_inttodword($n)
{
return 
chr($n 255).chr(($n >> 8) & 255).chr(($n >> 16) & 255).chr(($n >> 24) & 255);
};

function 
jpexs_inttoword($n)
 {
 return 
chr($n 255).chr(($n >> 8) & 255);
 };

?>
Онлайн: 0
Реклама