天道酬勤,学无止境

Is there a word wrap function for GD2 in php?

people.

I have slight problem with GD2 text on image. I have everything working and now i try to add text on image that can wrap within image.

For example i have image with width 200px and large block of text. If you use imagettftext() text goes beyond borders of image and only partial text actually is visible. I have tried to use Zend's text wrap function, but it's not always producing accurate results here(not saying it don't work, only not in this case).

Is there some dedicated GD2 method to set some width box where text should fit and if it hits border of that box it should continue in new line?

标签

评论

Not sure its what you looking for but, you can try this:

 function wrap($fontSize, $fontFace, $string, $width){

    $ret = "";
    $arr = explode(' ', $string);

    foreach ( $arr as $word ){
      $teststring = $ret.' '.$word;
      $testbox = imagettfbbox($fontSize, 0, $fontFace, $teststring);
     if ( $testbox[2] > $width ){
       $ret.=($ret==""?"":"\n").$word;
      } else {
        $ret.=($ret==""?"":' ').$word;
      }
    }

  return $ret;
}

The function from safarov contains a small bug which demonstrated for my user case. If I sent a word larger than $width, it would newline every word afterwards, so for example:

veryloooooooooooooongtextblablaOVERFLOWING
this 
should 
be 
one 
line

The reason is, imagettfbox will always be > $width with that "malicious" word inside text. My solution was to simply check each word width separately and optionally cut the word until it fits $width (or cancel the cutting if we get to length 0). Then I proceed with normal wordwrapping. The result is something like:

veryloooooooooooooongtextblabla
this should be one line

Here's the modified function:

function wrap($fontSize, $fontFace, $string, $width) {

    $ret = "";
    $arr = explode(" ", $string);

    foreach ( $arr as $word ){
      $testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word);

      // huge word larger than $width, we need to cut it internally until it fits the width
      $len = strlen($word);
      while ( $testboxWord[2] > $width && $len > 0) {
        $word = substr($word, 0, $len);
        $len--;
        $testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word);
      }

      $teststring = $ret.' '.$word;
      $testboxString = imagettfbbox($fontSize, 0, $fontFace, $teststring);
      if ( $testboxString[2] > $width ){
        $ret.=($ret==""?"":"\n").$word;
       } else {
         $ret.=($ret==""?"":' ').$word;
      }
    }

  return $ret;
}

Unfortunately I don't think there's an easy way of doing this. The best you can do is to approximately calculate your image width and how many characters your text in its current font can fit and break it manually on that n'th character.

If you are using a monospace fonts (unlikely, I know), you can get an accurate result as they are evenly spaced.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • PNG优化工具(PNG optimisation tools)
    问题 不久前,我使用了一种PNG优化服务,称为(我认为)“ smush it”。 您向它提供了一个网络链接,它返回了所有PNG图像的zip压缩文件,它们的文件大小很好,很好地被弄脏了…… 我想在网站的图片上传过程中实现类似的优化功能; 有谁知道我可以为此目的使用的预先存在的库(最好是PHP或Python)? 简短的Google指示我使用了几种命令行样式工具,但我宁愿不走这条路。 回答1 用PHP执行此命令行工具 pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB -brute -l 9 -max -reduce -m 0 -q IMAGE optipng -o7 -q pngout.png pngout pngout.png -q -y -k0 -s0 advpng -z -4 pngout.png > /dev/null png粉碎 OptiPNG pngout advpng 回答2 只要您的PHP使用GD2支持进行编译(当今非常普遍): <?php $image = imagecreatefromstring(file_get_contents('/path/to/image.original.png')); imagepng($image, '/path/to/image.smushed.png', 9)
  • Fetching a file on a server, resizing with PHP GD2, security considerations
    What are the security considerations when a server fetches a file from an untrusted domain? What are the security considerations when resizing an image that you don't trust with PHPs GD2 library? The file will be stored on the server machine, and will be offered for download. I know I can't trust the MIME-Type header. Is there anything else I should be aware of? I have a webservice that looks like this: input An http-URL (or a String that is expected to be a URL) output A meta description of the file, or an error if there was one. The meta description has one of two forms: It's an image + a
  • 创建图像而不将其存储为本地文件(Creating an image without storing it as a local file)
    问题 这是我的情况-我想从用户上传的图像中创建一个调整大小的jpeg图像,然后将其发送到S3进行存储,但是我希望避免将调整大小的jpeg写入磁盘,然后为S3请求重新加载它。 有没有一种方法可以完全在内存中完成此操作,并且将JPEG格式的图像数据保存在变量中? 回答1 大多数使用PHP的人都选择ImageMagick或Gd2 我从没用过Imagemagick。 Gd2方法: <?php // assuming your uploaded file was 'userFileName' if ( ! is_uploaded_file(validateFilePath($_FILES[$userFileName]['tmp_name'])) ) { trigger_error('not an uploaded file', E_USER_ERROR); } $srcImage = imagecreatefromjpeg( $_FILES[$userFileName]['tmp_name'] ); // Resize your image (copy from srcImage to dstImage) imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, RESIZED_IMAGE_WIDTH, RESIZED_IMAGE_HEIGHT
  • 带有像素尺寸的PHP自动换行(PHP word wrap with pixel dimensions)
    问题 我正在寻找一种使用PHP将文本包装到特定宽度的盒子中的方法。 我输入了动态文本字符串和可变的字体大小。 我找到了一种从该线程中按所需方式剪切文本的好方法:在PHP中使用长行单词更聪明的自动换行功能? 使用以下代码块: function smart_wordwrap($string, $width = 10, $break = "\n") { // split on problem words over the line length $pattern = sprintf('/([^ ]{%d,})/', $width); $output = ''; $words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); foreach ($words as $word) { if (false !== strpos($word, ' ')) { // normal behaviour, rebuild the string $output .= $word; } else { // work out how many characters would be on the current line $wrapped = explode($break, wordwrap
  • PHP word wrap with pixel dimensions
    I'm looking for a way to wrap text into a box of specific width using PHP. I have dynamic text strings coming in, and variable font sizes. I found a great way to cut the text up the way I want it from this thread: Smarter word-wrap in PHP for long words? Using this block of code: function smart_wordwrap($string, $width = 10, $break = "\n") { // split on problem words over the line length $pattern = sprintf('/([^ ]{%d,})/', $width); $output = ''; $words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); foreach ($words as $word) { if (false !== strpos($word, '
  • 如何在HTML中将长行换行而没有空格?(How to wrap long lines without spaces in HTML?)
    问题 如果用户键入的长行中没有空格或空白,则会超出当前元素的宽度,从而破坏格式。 就像是: 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈...... ................................................... ................................................... 我试过仅在PHP中使用wordwrap() ,但是问题是,如果有链接或其他有效的HTML,它就会中断。 CSS中似乎有一些选项,但是它们都不在所有浏览器中都起作用。 请参阅IE中的自动换行。 你怎么解决这个问题? 回答1 我还没有亲自使用它,但是Hyphenator看起来很有前途。 另请参阅相关(可能重复)的问题: 在CSS / JS中自动换行谁解决了我的div-break-breaks-my-div问题? (提示:不是stackoverflow) 回答2 在CSS3中: word-wrap:break-word 回答3 我试图解决相同的问题,但在这里找到了解决方案: http://perishablepress.com/press/2010/06/01/wrapping-content/ 解决方案:将以下CSS属性添加到容器中 div { white-space: pre; /* CSS 2.0 */ white-space
  • Balanced word wrap (Minimum raggedness) in PHP
    I'm going to make a word wrap algorithm in PHP. I want to split small chunks of text (short phrases) in n lines of maximum m characters (n is not given, so there will be as much lines as needed). The peculiarity is that lines length (in characters) has to be much balanced as possible across lines. Example of input text: How to do things Wrong output (this is the normal word-wrap behavior), m=6: How to do things Desired output, always m=6: How to do things Does anyone have suggestions or guidelines on how to implement this function? Basically, I'm searching something for pretty print short
  • 在CSS / JS中自动换行(word wrap in css / js)
    问题 我正在寻找一种跨浏览器的方式来包装具有预定宽度的div内不包含空格(例如长URL)的文本的较长部分。 这里有一些解决方案,我在网络上找到,为什么他们不为我工作: 溢出:隐藏/自动/滚动-我需要整个文本在不滚动的情况下可见。 div可以垂直增长,但不能水平增长。 注射&shy; 通过js /服务器端输入字符串-&shy; FF3现在支持FF3,但是复制和粘贴带有&shy;的URL。 在中间无法在Safari中使用。 另外,据我所知,没有一种干净的方法来测量文本宽度,以找出最佳的字符串偏移量以将这些字符添加到其中(这是一种怪癖,请参阅下一项)。 另一个问题是,放大Firefox和Opera可以轻松解决这个问题。 将文本转储到隐藏元素中并测量offsetWidth-与上面的项目有关,它需要在字符串中添加额外的字符。 同样,测量一长段文本所需的中断数量可能很容易需要数千个昂贵的DOM插入(每个子字符串长度一个),这可以有效地冻结该站点。 使用等宽字体-再次,缩放会弄乱宽度计算,并且文本无法随意设置样式。 看起来很有希望但还不存在的事情 word-wrap:断行词-它现在是CSS3工作草案的一部分,但Firefox,Opera或Safari尚不支持。 如果它今天可以在所有浏览器中使用,那么这将是理想的解决方案:( 通过js /服务器端将<wbr>标记注入字符串中
  • 获取字符串的最后一个单词(Get the last word of a string)
    问题 我已经尝试了一些方法来完成最后的工作: $string = 'Sim-only 500 | Internet 2500'; preg_replace("Sim-Only ^([1-9]|[1-9][0-9]|[1-9][0-9][0-9][0-9])$ | Internet ","",$string AND preg_match("/[^ ]*$/","",{abo_type[1]}) 第一个不起作用,第二个返回一个数组,但确实需要一个字符串。 回答1 如果您紧接句子中的最后一个单词,为什么不这样做呢? $string = '​Sim-only 500 ​| Internet 2500'; $pieces = explode(' ', $string); $last_word = array_pop($pieces); echo $last_word; 我不建议您使用正则表达式,因为除非有必要,否则不要使用正则表达式。 $string = 'Retrieving the last word of a string using PHP.'; preg_match('/[^ ]*$/', $string, $results); $last_word = $results[0]; // $last_word = PHP. 如果关注资源/效率/开销,那么使用substr(
  • 如何在PHP的前20个单词中截断字符串?(How can I truncate a string to the first 20 words in PHP?)
    问题 如何在PHP中20个单词后截断字符串? 回答1 function limit_text($text, $limit) { if (str_word_count($text, 0) > $limit) { $words = str_word_count($text, 2); $pos = array_keys($words); $text = substr($text, 0, $pos[$limit]) . '...'; } return $text; } echo limit_text('Hello here is a long sentence that will be truncated by the', 5); 输出: Hello here is a long ... 回答2 将数字3更改为下面的数字20 ,以获得前20个字,或将其作为参数传递。 下面演示了如何获取前3个字:(因此,将3更改为20即可更改默认值): function first3words($s, $limit=3) { return preg_replace('/((\w+\W*){'.($limit-1).'}(\w+))(.*)/', '${1}', $s); } var_dump(first3words("hello yes, world wah ha ha")); # => "hello
  • 在新行中换行(wrapping text words in new line)
    问题 我正在使用以下代码来包装用户在文本区域中输入的长文本以进行评论: function addNewlines(comments) { var result = ''; while ($.trim(comments).length > 0) { result += comments.substring(0,70) + '\n'; comments = comments.substring(70); } return result; } 问题显示在下面的屏幕截图中。 关于如何解决它的任何想法? 我们可以使用lastindexof(" ")方法获取子字符串中的最后一个空格来逻辑解决这个问题吗? 任何人都可以调整这个小代码以使其正确吗? 回答1 我相信用 CSS 包裹文本是一个更好的解决方案,但是这里有一个链接可能会有帮助 wrap-text-in-javascript 顺便说一句,我记得有一个 JQuery 插件也可以用来包装文本谷歌它。 回答2 在 CSS 中尝试word-wrap: break-word 。 浏览器(甚至 IE 5.5+)都很好地支持word-wrap属性。 更多信息:https://developer.mozilla.org/en-US/docs/CSS/word-wrap 示例用法:FIDDLE 回答3 尝试以下方法之一: word-wrap:no-wrap
  • DatagridView 添加与删除行
    下文转自:http://my.dajiaozi.com/net/60--rows-cannot-be-programmatically-added-to-the-datagridviews-rows.html Rows cannot be programmatically added to the DataGridView's rows 当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。 关于这个问题的解决方法,网上只有以 dataTable / dataSet 做为数据源的解决办法。 一是,不绑定。二是,在 dataTable 上用 AddNew 。第三种是新插入一行,在绑定。 我现在是以 LINQ 为数据源来绑定 dataGridView 的。不绑定的话,要写很多代码,第三种没有测试,看描述,应该也是很麻烦。我想采取第二种,但是 LINQ 的结果不能直接转换成 DataTable 或 DataSet (请参见:http://msdn.microsoft.com/en-us/vbasic/bb688086.aspx) 一开始想用 BindingSource ,但是给BindingSource设完DataSource 之后,忘了给DataGridView 设定 DataSource 了,看不到结果,误以为用 BindingSource 不行。
  • 适用于UTF-8的多字节安全wordwrap()函数(Multi-byte safe wordwrap() function for UTF-8)
    问题 PHP的wordwrap()函数不适用于UTF-8等多字节字符串。 注释中有几个mb安全功能示例,但是使用一些不同的测试数据,它们似乎都存在一些问题。 该函数应采用与wordwrap()完全相同的参数。 特别要确保它能: 如果$cut = true则切中单词,否则不切中单词如果$break = ' '则不能在单词中插入多余的空格也适用于$break = "\n" 适用于ASCII和所有有效的UTF-8 回答1 我还没有找到适合我的工作代码。 这是我写的。 对我来说,它正在运行,以为它可能不是最快的。 function mb_wordwrap($str, $width = 75, $break = "\n", $cut = false) { $lines = explode($break, $str); foreach ($lines as &$line) { $line = rtrim($line); if (mb_strlen($line) <= $width) continue; $words = explode(' ', $line); $line = ''; $actual = ''; foreach ($words as $word) { if (mb_strlen($actual.$word) <= $width) $actual .= $word.' '
  • PHP不区分大小写的单词替换(PHP Case Insensitive Word Replacement)
    问题 好的,我正在尝试在正在制作的此搜索脚本中将搜索词加粗,除非我无法使其不区分大小写。 function highlight($term,$target){ $terms = explode(" ", $term); foreach($terms as $term){ $result = (eregi_replace($term, "<strong>$term</strong>", $target)); } return $result; } 那就是我到目前为止所拥有的功能。在PHP.net上说eregi_replace是不区分大小写的匹配,但是由于某种原因,它显然不起作用。 (我是菜鸟)。 有任何想法吗? :D 回答1 从PHP 5.3开始不推荐使用ereg_* _ ereg_* (POSIX正则表达式)函数,并且很长时间以来都不建议使用。 最好使用PCRE( preg_* )函数(例如preg_replace)。 为此,您可以创建一个不区分大小写的正则表达式,然后将匹配项包装在<strong>标记中: function highlight($term, $target) { $terms = array_unique(explode(" ", $term)); // we only want to replace each term once foreach ($terms
  • Smarter word-wrap in PHP for long words?
    I'm looking for a way to make word-wrap in PHP a bit smarter. So it doesn't pre-break long words leaving any prior small words alone on one line. Let's say I have this (the real text is always completely dynamic, this is just to show): wordwrap('hello! heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true); This outputs: hello! heeeeeeeeeeeeeeereisavery longword See, it leaves the small word alone on the first line. How can I get it to ouput something more like this: hello! heeeeeeeeeeee eeereisaverylongword So it utilizes any available space on each line. I have tried several custom
  • phpstorm中的自动换行(Word wrapping in phpstorm)
    问题 如何在phpstorm中启用自动换行? 我只需要为我的某些文件(扩展名为.txt)启用它。 有可能吗? 回答1 对于所有文件(打开文件的默认设置): Settings/Preferences | Editor | General | Use soft wraps in editor Settings/Preferences | Editor | General | Use soft wraps in editor 对于编辑器中当前打开的文件: Menu | View | Active Editor | Use Soft Wraps Menu | View | Active Editor | Use Soft Wraps 在最新的IDE版本中,您还可以通过编辑器装订线区域(在编辑器左侧具有行号的区域)的上下文菜单访问此选项。 Search Everywhere (按Shift 2倍)或Help | Find Action... Help | Find Action... (在Windows上使用默认键盘映射,在Windows上为Ctrl + Shift + A )也可以用于快速更改此选项(而不是进入“设置/首选项”)。 回答2 您必须启用软包装。 通过此路径找到该选项。 查看>活动编辑器>使用软包装 回答3 Right click行号区域,然后选择: Soft-Wrap All
  • 任何人都可以在php中建议最佳的图像大小调整脚本吗? [关闭](Can anybody suggest the best image resize script in php? [closed])
    问题 在这里很难说出要问什么。 这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。 如需帮助澄清此问题以便可以重新打开,请访问帮助中心。 8年前关闭。 你好 我需要在php中使用所有类型的图像调整脚本大小 回答1 WideImage是一个用PHP 5编写的面向对象的图像处理库,是用PHP 5编写的。它是一个纯PHP库,除了GD2扩展之外,不需要任何外部库。 我曾经在一个私人项目中使用过它,对我来说相当不错。 样品 // Chaining operations: wiImage::load('image.png')->resize(50, 30)->saveToFile('new-image.jpg', 30); // Load, crop, flip and output to browser in one line (no http headers included): echo wiImage::load('image.png')->crop(30, 30, '50%', '50%')->flip()->asString('png'); // watermarking $img = wiImage::load('pic.jpeg'); $watermark = wiImage::load('watermark.jpg'); $new_img =
  • How can I get word wrap to work in Eclipse PDT for PHP files?
    Programming PHP in Eclipse PDT is predominately a joy: code completion, templates, method jumping, etc. However, one thing that drives me crazy is that I can't get my lines in PHP files to word wrap so on long lines I'm typing out indefinitely to the right. I click on Windows|Preferences and type in "wrap" and get: - Java | Code Style | Formatter - Java | Editor | Typing - Web and XML | CSS Files | Source I've tried changing the "wrap automatically" that I found there and the "Line width" to 72 but they had no effect. How can I get word wrap to work in Eclipse PDT for PHP files?
  • 如有必要,如何允许文本自动换行?(How can I allow text to wrap inside a word if necessary?)
    问题 我正在寻找最好的解决方案,以使文本在必要时可以在单词中间包裹。 最好的说,我的意思是大多数浏览器兼容的,并且会优先选择分词,然后再将其打断。 如果标记看起来比我的标记更好,也会有所帮助(请参阅我的答案)。 编辑: 请注意,这是专门针对用户生成的内容的。 编辑2: 该网站上约有25%的Firefox用户仍在使用v3.0或更低版本,因此支持他们至关重要。 这是根据上个月的数据(约121,000次访问)得出的。 回答1 css属性word-wrap: break-word将迫使长字如果对于容器来说太长,则换行到下一行。 IE(回溯),Firefox和Safari支持此功能。 编辑:看起来您也可以在旧版本的Firefox中使用white-space: -moz-pre-wrap和white-space: pre-wrap来实现此目的。 有关更多信息,请参见此处。 不过,我尚未使用较旧版本的Firefox进行过测试。 回答2 由于没有明确的答案(取决于您的需求,例如,您是否需要连字符,必须支持哪些浏览器?),所以我通过Adobe BrowserLab进行了一些研究,以找出可用的选项: 如果不需要连字符,则可以使用<wbr>获得最佳兼容性。 如果需要连字符,请使用­ 是您最好的选择,但是请注意,在Firefox 2.0 Mac / Windows或Safari 3.0中,此操作不起作用
  • 如何为Opera浏览器换行符(How to Wrap unspaces word for Opera Browser)
    问题 我目前正在所有使用php的浏览器中测试此功能。 <style> #preview_desc{ text-wrap: suppress; word-break: break-all; word-wrap: break-word; /* IE>=5.5 */ white-space: -moz-pre-wrap; /* For Fx<=2 */ white-space: pre-wrap; /* Fx>3, Opera>8, Safari>3 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-line; width:158px; padding-left:5px; padding-right:5px; line-height:12px; font-family:'Arial', Helvetica, sans-serif; font-size:11px; text-align:justify; background:#f30000; } </style> <div id="preview_desc" class="adlookmsg_box"> Refeforotherapplicationandcontainasdhlsakfhnaiufalsdufgnaloskdufglkjblfasug </div>