rendering in 1:1 aspect ratio. looks strange
This commit is contained in:
@@ -97,7 +97,7 @@ final class Ruady_OG_Head {
|
|||||||
|
|
||||||
$post_url = get_permalink( $post );
|
$post_url = get_permalink( $post );
|
||||||
$post_title = get_the_title( $post );
|
$post_title = get_the_title( $post );
|
||||||
$excerpt = get_the_excerpt( $post );
|
$excerpt = get_the_excerpt( $post );
|
||||||
$site_title = get_bloginfo( 'name' );
|
$site_title = get_bloginfo( 'name' );
|
||||||
$site_url = site_url();
|
$site_url = site_url();
|
||||||
$site_url_p = parse_url($site_url);
|
$site_url_p = parse_url($site_url);
|
||||||
@@ -155,6 +155,33 @@ final class Ruady_OG_Head {
|
|||||||
self::render_png_for_post( $post );
|
self::render_png_for_post( $post );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static function wrap_text_ttf(string $text, int $maxWidth, string $fontFile, float $size): array {
|
||||||
|
$words = preg_split('/\s+/', trim($text));
|
||||||
|
$lines = [];
|
||||||
|
$current = '';
|
||||||
|
|
||||||
|
foreach ($words as $word) {
|
||||||
|
$test = $current === '' ? $word : $current . ' ' . $word;
|
||||||
|
$box = imagettfbbox($size, 0, $fontFile, $test);
|
||||||
|
$width = $box[2] - $box[0];
|
||||||
|
|
||||||
|
if ($width <= $maxWidth) {
|
||||||
|
$current = $test;
|
||||||
|
} else {
|
||||||
|
if ($current !== '') {
|
||||||
|
$lines[] = $current;
|
||||||
|
}
|
||||||
|
$current = $word;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($current !== '') {
|
||||||
|
$lines[] = $current;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $lines;
|
||||||
|
}
|
||||||
|
|
||||||
private static function render_png_for_post( WP_Post $post ): void {
|
private static function render_png_for_post( WP_Post $post ): void {
|
||||||
if ( ! function_exists( 'imagecreatetruecolor' ) ) {
|
if ( ! function_exists( 'imagecreatetruecolor' ) ) {
|
||||||
self::render_text_error( 500, 'GD extension not available' );
|
self::render_text_error( 500, 'GD extension not available' );
|
||||||
@@ -168,13 +195,13 @@ final class Ruady_OG_Head {
|
|||||||
self::render_text_error( 500, 'Could not create image' );
|
self::render_text_error( 500, 'Could not create image' );
|
||||||
}
|
}
|
||||||
|
|
||||||
$bg = imagecolorallocate( $image, 224, 241, 212 ); // theme background (light green)
|
$bg = imagecolorallocate( $image, 224, 241, 212 ); // theme background (light green)
|
||||||
$fg = imagecolorallocate( $image, 0, 0, 0 ); // theme foreground (black)
|
$fg = imagecolorallocate( $image, 0, 0, 0 ); // theme foreground (black)
|
||||||
$tt = imagecolorallocate( $image, 72, 119, 40 ); // theme primary (dark green)
|
$tt = imagecolorallocate( $image, 72, 119, 40 ); // theme primary (dark green)
|
||||||
$accent = imagecolorallocate( $image, 204, 235, 235 ); // theme tertiary (light blue)
|
//$accent = imagecolorallocate( $image, 204, 235, 235 ); // theme tertiary (light blue)
|
||||||
|
|
||||||
imagefilledrectangle( $image, 0, 0, $width, $height, $bg );
|
imagefilledrectangle( $image, 0, 0, $width, $height, $bg );
|
||||||
imagefilledrectangle( $image, 0, 0, $width, 12, $accent );
|
//imagefilledrectangle( $image, 0, 0, $width, 12, $accent );
|
||||||
|
|
||||||
$title = wp_strip_all_tags( get_the_title( $post ) );
|
$title = wp_strip_all_tags( get_the_title( $post ) );
|
||||||
$site = wp_strip_all_tags( get_bloginfo( 'name' ) );
|
$site = wp_strip_all_tags( get_bloginfo( 'name' ) );
|
||||||
@@ -184,9 +211,37 @@ final class Ruady_OG_Head {
|
|||||||
$title = self::truncate( $title, 90 );
|
$title = self::truncate( $title, 90 );
|
||||||
$site = self::truncate( $site, 90 );
|
$site = self::truncate( $site, 90 );
|
||||||
|
|
||||||
|
/*
|
||||||
imagestring( $image, 5, 40, 60, $title, $tt );
|
imagestring( $image, 5, 40, 60, $title, $tt );
|
||||||
imagestring( $image, 3, 40, 110, $site, $fg );
|
imagestring( $image, 3, 40, 110, $site, $fg );
|
||||||
imagestring( $image, 2, 40, 580, 'Post ID: ' . (string) $post->ID, $accent );
|
imagestring( $image, 2, 40, 580, 'Post ID: ' . (string) $post->ID, $accent );
|
||||||
|
*/
|
||||||
|
|
||||||
|
//////////////////////////////////
|
||||||
|
|
||||||
|
$excerpt = get_the_excerpt( $post );
|
||||||
|
$description = html_entity_decode(wp_strip_all_tags( $excerpt ));
|
||||||
|
|
||||||
|
$fontFile = __DIR__ . '/fonts/EBGaramond-VariableFont_wght.ttf';
|
||||||
|
//$size = 28;
|
||||||
|
$size = 36;
|
||||||
|
//$x = 60;
|
||||||
|
$x = (int) (($width - $height) / 2 + 30);
|
||||||
|
$y = 120;
|
||||||
|
$lineHeight = (int) ($size * 1.9);
|
||||||
|
//$maxWidth = 1080;
|
||||||
|
$maxWidth = $height - 2*60; // prepare text for 1:1 ratio cropping
|
||||||
|
$maxHeight = $height - 60;
|
||||||
|
|
||||||
|
// wrap_text_ttf(string $text, int $maxWidth, string $fontFile, float $size)
|
||||||
|
$lines = self::wrap_text_ttf($description, $maxWidth, $fontFile, $size);
|
||||||
|
|
||||||
|
foreach ($lines as $line) {
|
||||||
|
imagettftext($image, $size, 0, $x, $y, $fg, $fontFile, $line);
|
||||||
|
$y += $lineHeight;
|
||||||
|
if ($y > $maxHeight) break;
|
||||||
|
}
|
||||||
|
//////////////////////////////////
|
||||||
|
|
||||||
status_header( 200 );
|
status_header( 200 );
|
||||||
header( 'Content-Type: image/png' );
|
header( 'Content-Type: image/png' );
|
||||||
|
|||||||
Reference in New Issue
Block a user