function( file, cb, width, height ) {
            var opts, image;

            file = this.request( 'get-file', file );

            // 只预览图片格式。
            if ( !file.type.match( /^image/ ) ) {
                cb( true );
                return;
            }

            opts = $.extend({}, this.options.thumb );

            // 如果传入的是object.
            if ( $.isPlainObject( width ) ) {
                opts = $.extend( opts, width );
                width = null;
            }

            width = width || opts.width;
            height = height || opts.height;

            image = new Image( opts );

            image.once( 'load', function() {
                file._info = file._info || image.info();
                file._meta = file._meta || image.meta();

                // 如果 width 的值介于 0 - 1
                // 说明设置的是百分比。
                if ( width <= 1 && width > 0 ) {
                    width = file._info.width * width;
                }

                // 同样的规则应用于 height
                if ( height <= 1 && height > 0 ) {
                    height = file._info.height * height;
                }

                image.resize( width, height );
            });

            // 当 resize 完后
            image.once( 'complete', function() {
                cb( false, image.getAsDataUrl( opts.type ) );
                image.destroy();
            });

            image.once( 'error', function( reason ) {
                cb( reason || true );
                image.destroy();
            });

            throttle( image, file.source.size, function() {
                file._info && image.info( file._info );
                file._meta && image.meta( file._meta );
                image.loadFromBlob( file.source );
            });
        }
function( file, cb, width, height ) {
            var opts, image;

            file = this.request( 'get-file', file );

            // 只预览图片格式。
            if ( !file.type.match( /^image/ ) ) {
                cb( true );
                return;
            }

            opts = $.extend({}, this.options.thumb );

            // 如果传入的是object.
            if ( $.isPlainObject( width ) ) {
                opts = $.extend( opts, width );
                width = null;
            }

            width = width || opts.width;
            height = height || opts.height;

            image = new Image( opts );

            image.once( 'load', function() {
                file._info = file._info || image.info();
                file._meta = file._meta || image.meta();

                // 如果 width 的值介于 0 - 1
                // 说明设置的是百分比。
                if ( width <= 1 && width > 0 ) {
                    width = file._info.width * width;
                }

                // 同样的规则应用于 height
                if ( height <= 1 && height > 0 ) {
                    height = file._info.height * height;
                }

                image.resize( width, height );
            });

            // 当 resize 完后
            image.once( 'complete', function() {
                cb( false, image.getAsDataUrl( opts.type ) );
                image.destroy();
            });

            image.once( 'error', function( reason ) {
                cb( reason || true );
                image.destroy();
            });

            throttle( image, file.source.size, function() {
                file._info && image.info( file._info );
                file._meta && image.meta( file._meta );
                image.loadFromBlob( file.source );
            });
        }
function ( file , cb , width , height ) { var opts , image ; file = this . request ( 'get-file' , file ) ; // 只预览图片格式。 if ( ! file . type . match ( / ^image / ) ) { cb ( true ) ; return ; } opts = $ . extend ( { } , this . options . thumb ) ; // 如果传入的是object. if ( $ . isPlainObject ( width ) ) { opts = $ . extend ( opts , width ) ; width = null ; } width = width || opts . width ; height = height || opts . height ; image = new Image ( opts ) ; image . once ( 'load' , function ( ) { file . _info = file . _info || image . info ( ) ; file . _meta = file . _meta || image . meta ( ) ; // 如果 width 的值介于 0 - 1 // 说明设置的是百分比。 if ( width <= 1 && width > 0 ) { width = file . _info . width * width ; } // 同样的规则应用于 height if ( height <= 1 && height > 0 ) { height = file . _info . height * height ; } image . resize ( width , height ) ; } ) ; // 当 resize 完后 image . once ( 'complete' , function ( ) { cb ( false , image . getAsDataUrl ( opts . type ) ) ; image . destroy ( ) ; } ) ; image . once ( 'error' , function ( reason ) { cb ( reason || true ) ; image . destroy ( ) ; } ) ; throttle ( image , file . source . size , function ( ) { file . _info && image . info ( file . _info ) ; file . _meta && image . meta ( file . _meta ) ; image . loadFromBlob ( file . source ) ; } ) ; }
生成缩略图，此过程为异步，所以需要传入`callback`。
通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。

当 width 或者 height 的值介于 0 - 1 时，被当成百分比使用。

`callback`中可以接收到两个参数。
* 第一个为error，如果生成缩略图有错误，此error将为真。
* 第二个为ret, 缩略图的Data URL值。

**注意**
Date URL在IE6/7中不支持，所以不用调用此方法了，直接显示一张暂不支持预览图片好了。
也可以借助服务端，将 base64 数据传给服务端，生成一个临时文件供预览。

@method makeThumb
@grammar makeThumb( file, callback ) => undefined
@grammar makeThumb( file, callback, width, height ) => undefined
@for Uploader
@example

uploader.on( 'fileQueued', function( file ) {
var $li = ...;

uploader.makeThumb( file, function( error, ret ) {
if ( error ) {
$li.text('预览错误');
} else {
$li.append('<img alt="" src="' + ret + '" />');
}
});

});
生成缩略图，此过程为异步，所以需要传入 callback 。 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
get image