Я использую Imagemagick для динамической генерации OpenGraph Image.
Я обрабатываю это изображение шаг за шагом, значит:
После создания фонового изображения я начинаю добавлять элементы.
К сожалению, после создания этого изображения вокруг текста и изображений, наложенных мною, появляются странные фрагменты.
Есть идеи, как этого избежать?
Я приложил несколько изображений, чтобы продемонстрировать проблему.
РЕДАКТИРОВАТЬ:
надеюсь, это поможет
$imagename = uniqid() . ".jpg";
$image = $og_upload_path . '/' . $imagename;
$alpha = 15
$filterColor = "#08e2dd"; // Light Blue
// Asset images for processing the opengraph image
$white_background = $image_path . "/white.png";
$src_image = [Link to src image see above];
// Resize Image to 1200px width
system("convert '" . $src_image . "' -resize 1200 '" . $image . "'");
// Grayscale Image
system("convert '" . $image . "' -colorspace Gray '" . $image . "'");
// Make image transparent
system("composite -blend " . $alpha . " '" . $image . "' '" . $white_background . "' '" . $image . "'");
// Multiply Image with filter color
system("convert '" . $image . "' \ ". " \( -clone 0 -fill '" . $filterColor . "' -colorize 100 \) \ ". " -compose multiply \ ". " -composite '" . $image . "'");
// Add MainLine Text
system("convert '" . $image . "' -size 1000x -background transparent \ ". " -fill '" . $textColor_MainLine . "' \ ". " -pointsize " . $fontSize_MainLine . " \ ". " -font " . $path_fontfile . " \ ". " -gravity center caption:" . $text_MainLine . " \ ". " -gravity center -composite '" . $image . "'");
JPG — это формат изображений с потерями, а ImageMagick’s convert
полезность не сохраняет высочайшее качество по умолчанию:
Для форматов изображений JPEG и MPEG качество составляет от 1 (низкое качество изображения и максимальное сжатие) до 100 (лучшее качество, но наименее эффективное сжатие). По умолчанию используется оценочное качество входного изображения, если оно может быть определено, в противном случае 92. Когда качество превышает 90, каналы цветности не подвергаются понижающей дискретизации. Используйте опцию -sampling-factor, чтобы указать факторы для снижения цветности.
Вы можете установить -quality 100
в ваших командах, но вам лучше будет управлять изображением в форматах без потерь, а затем конвертировать в формат с потерями (например, JPG) для меньшего размера файла.
Оставайтесь в PNG
отформатировать как можно дольше и перейти только к JPG
на самом последнем этапе. Также. составьте ваши звонки convert
на как можно меньше, чтобы избежать распаковки и повторного сжатия. Таким образом, вы можете сделать свои первые 4 звонка convert
в один шаг, как это:
convert https://s3.amazonaws.com/f.cl.ly/items/0E0V2M29313B3b0p1x2W/og_image.png \
-resize 1200 \
-colorspace gray \
-evaluate multiply 0.15 -evaluate add 55700 \
\( +clone -fill "#08e2dd" -colorize 100 \) -compose multiply -composite \
output.png
Я переделал ваш composite
команда смешать 85% белого с умножением на 0,15 и добавлением 85% из 65 535 (то есть 55700), что является белым в 16-битном квантовании. Это избавляет вас от необходимости держать white.png
файл лежит без причины (так как мы знаем, что все пиксели будут 65535 в любом случае) и позволяет нам делать все с convert
вместо того, чтобы сохранять и использовать composite
и сохранить и вернуться к convert
,
Я позволю вам проверить качество и время обработки и добавить в последний шаг самостоятельно.
Спасибо всем за ваши отличные и быстрые ответы.
В конце концов, сжатие Facebook действительно является проблемой. Если вы загружаете его вручную, оно становится размытым и очень неприятным, но если вы просто используете его как изображение OpenGraph, это здорово.
Ответы и комментарии мне очень помогли!