Got favicons better supported, can't get transparency right

Digging deeper, I don't think PHPGD supports 32bit bmp output which
complicates matters.
This commit is contained in:
Dan Brown 2023-02-09 15:14:41 +00:00
parent 1a189640f1
commit 2845e0003e
No known key found for this signature in database
GPG key ID: 46D9F943C24A2EF9
2 changed files with 15 additions and 4 deletions

View file

@ -28,6 +28,8 @@ class FaviconHandler
$bmpData = $image->encode('bmp');
$icoData = $this->bmpToIco($bmpData, 32, 32);
// file_put_contents(public_path('icon.bmp'), $bmpData);
// file_put_contents(public_path('icon-test.png'), $image->encode('png'));
file_put_contents($targetPath, $icoData);
}
@ -54,6 +56,9 @@ class FaviconHandler
{
// Trim off the header of the bitmap file
$rawBmpData = substr($bmpData, 14);
// Double the height in the "BITMAPINFOHEADER" since, when in an ICO file, half
// of the image data is expected to be a mask.
$rawBmpData[8] = hex2bin(dechex($height * 2));
// ICO header
$header = pack('v', 0x00); // Reserved. Must always be 0
@ -66,17 +71,23 @@ class FaviconHandler
$entry .= "\0"; // Color palette, typically 0
$entry .= "\0"; // Reserved
// AND mask
// $pxCount = $width * $height;
// $pxMask = hex2bin('00000000');
// $mask = str_repeat($pxMask, $pxCount);
$mask = '';
// Color planes, Appears to remain 1 for bmp image data
$entry .= pack('v', 0x01);
// Bits per pixel, can range from 1 to 32. From testing conversion
// via intervention from png typically provides this as 32.
$entry .= pack('v', 0x20);
// via intervention from png typically provides this as 24.
$entry .= pack('v', 0x18);
// Size of the image data in bytes
$entry .= pack('V', strlen($rawBmpData));
$entry .= pack('V', strlen($rawBmpData) + strlen($mask));
// Offset of the bmp data from file start
$entry .= pack('V', strlen($header) + strlen($entry) + 4);
// Join & return the combined parts of the ICO image data
return $header . $entry . $rawBmpData;
return $header . $entry . $rawBmpData . $mask;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB