WordPress主题开发

WordPress图片处理脚本bfi_thumb

bfi_thumb是一款类似于TimThumb的图片处理php脚本,由于timthumb的安全性问题,很多WordPress主题不再使用这个脚本,bfi_thumb是一款很好的替代产品。它通过扩展WordPress Image Editor class来实现各种图片处理效果,相比timthumb更加安全。

概述

该脚本以WordPress Image Editor class为根基,增加了图片动态缩放、裁切、灰度、上色、反相、透明度等功能。可以对任何本地图片进行处理,也可以通过WordPress默认函数调用,如the_post_thumbnail(),直接对WordPress生成的缩略图进行二次处理。

动态生成的图片存储在wp-content/uploads/bfi_thumb目录下,使用如下代码更改目录

@define( BFITHUMB_UPLOAD_DIR, 'other_dir' );

基本用法

首先,引入脚本文件

require_once('BFI_Thumb.php');

将图片尺寸缩小到宽度为400

$params = array( 'width' => 400 );
echo "<img src='" . bfi_thumb( "URL-to-image.jpg", $params ) . "'/>";

bfi_thumb直接返回生成的图片的url。

再看,更改透明度

$params = array( 'opacity' => 80 ); // 80% opaque
bfi_thumb( "URL-to-image.jpg", $params );

上色

$params = array( 'color' => '#ff0000' );
bfi_thumb( "URL-to-image.jpg", $params );

灰度

$params = array( 'grayscale' => true );
bfi_thumb( "URL-to-image.jpg", $params );

反相

$params = array( 'negate' => true );
bfi_thumb( "URL-to-image.jpg", $params );

同时使用多个参数

$params = array( 'width' => 400, 'height' => 300, 'opacity' => 50, 'grayscale' => true, 'colorize' => '#ff0000' );
bfi_thumb( "URL-to-image.jpg", $params );

通过WordPress图片函数调用

对于任何上传到媒体库中的图片,还可以这样调用。

例如,将the_post_thumbnail返回的图片进行缩放和灰度处理,再输出

the_post_thumbnail( array( 1024, 400, 'bfi_thumb' => true, 'grayscale' => true ) );

实际处理效果

bfi_thumb_examples

正片叠底

Photoshop的正片叠底是非常酷的效果,该脚本并不支持,可以自己添加,方法如下。

[download id=54]

打开BFI_Thumb.php,更改如下代码

找到

public function colorize($hexColor){...}

在该方法后面添加新的方法

public function multiply($hexColor) {
        if (function_exists('imagefilter') &&
            function_exists('imagesavealpha') &&
            function_exists('imagecolorat')) {
            $hexColor = preg_replace('#^\##', '', $hexColor);
          
            $r = hexdec (substr ($hexColor, 0, 2));
            $g = hexdec (substr ($hexColor, 2, 2));
            $b = hexdec (substr ($hexColor, 4, 2));
          
            $imagex = imagesx($this->image);
            $imagey = imagesy($this->image);
            for ($x = 0; $x <$imagex; ++$x) {
                for ($y = 0; $y <$imagey; ++$y) {
                    $rgb = imagecolorat($this->image, $x, $y);
                    $TabColors=imagecolorsforindex ( $this->image , $rgb );
                    $color_r=floor($TabColors['red']*$r/255);
                    $color_g=floor($TabColors['green']*$g/255);
                    $color_b=floor($TabColors['blue']*$b/255);
                    $newcol = imagecolorallocate($this->image, $color_r,$color_g,$color_b);
                    imagesetpixel($this->image, $x, $y, $newcol);
                }
            }
            
            //imagesavealpha($this->image, false);
            return true;
        }
        return new WP_Error( 'image_colorize_error', __('Image color change failed.', 'default'), $this->file );
    }

找到

(isset($color) ? str_pad(preg_replace('#^\##', '', $color), 8, '0', STR_PAD_LEFT) : '00000000') .

在其后添加

(isset($multiply) ? str_pad(preg_replace('#^\##', '', $multiply), 8, '0', STR_PAD_LEFT) : '00000000') .

找到

if ( isset( $color ) ) {
	if ( is_wp_error( $editor->colorize( $color ) ) ) {
		return false;
	}
}

在其后添加

if ( isset( $multiply ) ) {
	if ( is_wp_error( $editor->multiply( $multiply ) ) ) {
		return false;
	}
}

这样就可以调用正片叠底(Multiply)功能了,如

$params = array( 'width' => 300,  'multiply' => '#ff0000' );

15条评论

    1. 不支持,脚本里这样写的
      Remote images are not supported due to security concerns.

      你可以先把远程图片保存到本地,再调用这个脚本

  1. 从松松博客过来的,贵站做的真心不错,我和大学同学也刚做了一个网站,欢迎站长朋友过来看看,能给我提点建议的话就感激不尽了,我的网站是恋字坊http://www.lianzifang.com/

  2. 现在网址会是这样的 xxx/商品分类/sss/ 这个怎么破。。。。修改language吗?

  3. 说明缩略图尺寸设置与主题不匹配,将尺寸改为可清晰显示的值,用regenerate thumbnails插件重新生成缩略图

  4. 你好。想请教一下。我的网站首页调用了woocommerce的产品到首页。但问题图片压缩得很厉害。可以怎么设置用原图或者高质量的呢。谢谢。。

评论已关闭。