Skip to content

Commit

Permalink
Got favicons better supported, can't get transparency right
Browse files Browse the repository at this point in the history
Digging deeper, I don't think PHPGD supports 32bit bmp output which
complicates matters.
  • Loading branch information
ssddanbrown committed Feb 9, 2023
1 parent 1a18964 commit 2845e00
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions app/Uploads/FaviconHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public function saveForUploadedImage(UploadedFile $file): void
$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);
}

Expand All @@ -54,6 +56,9 @@ protected function bmpToIco(string $bmpData, int $width, int $height): string
{
// 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
Expand All @@ -66,17 +71,23 @@ protected function bmpToIco(string $bmpData, int $width, int $height): string
$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 modified public/favicon.ico
Binary file not shown.

0 comments on commit 2845e00

Please sign in to comment.