IMagick: шрифт неправильно масштабируется - PullRequest
0 голосов
/ 26 апреля 2019

Одной из задач скрипта, над которым я сейчас работаю, является точное масштабирование текста: если ширина блока текста больше, чем 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;
...