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'
;
}
}
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
[
$key
] =
''
;
$BitmapInfoHeader
[
$key
] .=
"\x28\x00\x00\x00"
;
$BitmapInfoHeader
[
$key
] .=
$this
->LittleEndian2String(
$ImageWidths
[
$key
], 4);
$BitmapInfoHeader
[
$key
] .=
$this
->LittleEndian2String(
$ImageHeights
[
$key
] * 2, 4);
$BitmapInfoHeader
[
$key
] .=
"\x01\x00"
;
$BitmapInfoHeader
[
$key
] .=
chr
(
$bpp
[
$key
]).
"\x00"
;
$BitmapInfoHeader
[
$key
] .=
"\x00\x00\x00\x00"
;
$BitmapInfoHeader
[
$key
] .=
$this
->LittleEndian2String(
$biSizeImage
, 4);
$BitmapInfoHeader
[
$key
] .=
"\x00\x00\x00\x00"
;
$BitmapInfoHeader
[
$key
] .=
"\x00\x00\x00\x00"
;
$BitmapInfoHeader
[
$key
] .=
"\x00\x00\x00\x00"
;
$BitmapInfoHeader
[
$key
] .=
"\x00\x00\x00\x00"
;
}
$icondata
=
"\x00\x00"
;
$icondata
.=
"\x01\x00"
;
$icondata
.=
$this
->LittleEndian2String(
count
(
$gd_image_array
), 2);
$dwImageOffset
= 6 + (
count
(
$gd_image_array
) * 16);
foreach
(
$gd_image_array
as
$key
=>
$gd_image
) {
$icondata
.=
chr
(
$ImageWidths
[
$key
]);
$icondata
.=
chr
(
$ImageHeights
[
$key
]);
$icondata
.=
chr
(
$totalcolors
[
$key
]);
$icondata
.=
"\x00"
;
$icondata
.=
"\x01\x00"
;
$icondata
.=
chr
(
$bpp
[
$key
]).
"\x00"
;
$dwBytesInRes
= 40 +
strlen
(
$icXOR
[
$key
]) +
strlen
(
$icAND
[
$key
]);
$icondata
.=
$this
->LittleEndian2String(
$dwBytesInRes
, 4);
$icondata
.=
$this
->LittleEndian2String(
$dwImageOffset
, 4);
$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
));
}
}