Одной из задач скрипта, над которым я сейчас работаю, является точное масштабирование текста: если ширина блока текста больше, чем x, то масштабируйте fontSize, чтобы получить ровно ширину x.Иногда fontSize должен быть меньше 9px, поэтому imagick работает с дробными значениями, но заметил, что у него с этим проблемы.Например, 7.6px - это то же самое, что и 7px, поэтому скрипт не может масштабировать его должным образом, а конечный результат - слишком узкий блок текста.Есть какой-то способ сделать это более точным?Или это невозможно?
Я сделал простую демонстрацию, где вы можете увидеть выходные данные разных размеров шрифта (также с дробными значениями).Некоторые из них имеют хорошие размеры, но другие идентичны (и не должны).
Демонстрационное изображение на выходе
$font = "./COURIER.TTF";
$im = new Imagick();
$im->setCompressionQuality(100);
$im->newImage(900, 900, new ImagickPixel("white"));
$im->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor(new ImagickPixel("red"));
$draw->setFillColor(new ImagickPixel("transparent"));
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(1);
$draw->rectangle(10, 22, 860, 30);
$im->drawImage($draw);
$txt = new ImagickDraw();
$txt->setFont($font);
$txt->setFontSize(12);
$im->annotateImage($txt, 10, 30, 0, "Font size: 12");
$txt->setFontSize(11.7);
$im->annotateImage($txt, 120, 30, 0, "Font size: 11.7");
$txt->setFontSize(11.51);
$im->annotateImage($txt, 240, 30, 0, "Font size: 11.51");
$txt->setFontSize(11.45);
$im->annotateImage($txt, 370, 30, 0, "Font size: 11.45");
$txt->setFontSize(11);
$im->annotateImage($txt, 490, 30, 0, "Font size: 11");
$txt->setFontSize(10.4);
$im->annotateImage($txt, 590, 30, 0, "Font size: 10.4");
$txt->setFontSize(10);
$im->annotateImage($txt, 690, 30, 0, "Font size: 10");
$txt->setFontSize(9);
$im->annotateImage($txt, 790, 30, 0, "Font size: 9");
header('Content-type: image/png');
echo $im;