一个本地图片预览的jQuery插件

一个本地图片预览的jQuery插件

通过使用新的API或ie滤镜将图片转为Base64,再将Base64图片数据设置到img的src属性,就能将本地图片显示出来了。

本插件写的简单,有些地方不够严谨,如果需要使用,请根据实际情况来优化代码。

/*!
 * previewlocimg.js v1.0.0 
 *
 * Copyright 2017 Van
 * 
 */
(function() {
//  定义构造函数
    var preview = function(ele, opt) {
        this.$element = ele;
        this.defaults = {
            'width' : '150px',
            'height' : '200px',
//          'lineheight': '200px',
            'textalign' : 'center',
            'border' : '1px solid silver',
            'color' : 'darkgray',
            'background' : 'none',
            'text' : '选择图片...'
        },
        this.options = $.extend({}, this.defaults, opt);
    }
    
//  定义方法
    preview.prototype = {
        makeDom : function() {
            var $this = this.$element;
            $this.css({'display': 'none', 'width': '0px', 'height': '0px'});
            $this.wrap('<div class="previewlocimg"></div>');
            
            if (!this.options.border) {
                this.options.border = 'none';
            }
            
//          $this.attr('accept', 'image/jpeg,image/jpg,image/png,image/gif')
            $this.attr('accept', '.jpg,.jpeg,.png,.gif')
            
            $this.parent().css({
                'box-sizing' : 'border-box',
                'position' : 'relative',
                'z-index' : '0',
                'width' : this.options.width,
                'height' : this.options.height,
                'line-height': this.options.height,
                'text-align' : this.options.textalign,
                'border' : this.options.border,
                'color' : this.options.color,
                'background' : this.options.background,
            });
            
            var defaultimg = 'data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==';
            $this.parent().prepend("<img src='" + defaultimg + "' style='max-width: 100%; max-height: 100%; vertical-align: middle; margin-top: -4px;'/>");
            $this.parent().append("<span style='position: absolute;left: 0px;right: 0px;z-index: -1;'>" + this.options.text + "</span>");
            
            $this.parent().off('click').on('click', function() {
                $(this).children()[1].click()
            });
            
            $this.off('change').on('change', function() {
                preview.prototype.loadImg($this, $this.prev())
            });
//          $this.change(this.loadImg($this, $this.prev()));
            
            return $this;
        },
        loadImg : function(obj, preview) {  //加载图像
            var $file = obj;
            var fileObj = $file[0];
            var windowURL = window.URL || window.webkitURL;
            var dataURL;
            var $img = preview;
            var $imgBox = $file.parent();
            
            if(fileObj && fileObj.files && fileObj.files[0]) {
//              alert('--0')
                dataURL = windowURL.createObjectURL(fileObj.files[0]);
                
                $img.attr('src', dataURL);
            }else {
//              alert('--1')
                $file.show();
                $file.select();
                dataURL = document.selection.createRange().text;
//              alert(dataURL)
                $file.hide();
                var size = this.getImgSize(dataURL);
//              alert(size.width + " + " + size.height);
                
//              var maxSize = $imgBox.width() >= $imgBox.height() ? $imgBox.width() : $imgBox.height();
        
                var compSize = this.ratioCompressSize(size.width, size.height, $imgBox.width(), $imgBox.height());
                
//              alert(compSize.width + " + " + compSize.height);
                
        //      dataURL = $file.val();
                var imgObj = $img.get(0);
                imgObj.style.width = compSize.width;
                imgObj.style.height = compSize.height;
                imgObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
                imgObj.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = dataURL;
            }
        },
        getImgSize : function(src) {
            var tempEl;
            var size = {
                width : 0,
                height : 0
            };
            if (!tempEl) {
                tempEl = document.createElement('div');
                tempEl.style.position = 'absolute';
                tempEl.style.width = '1px';
                tempEl.style.height = '1px';
                tempEl.style.left = '-9999px';
                tempEl.style.top = '-9999px';
                tempEl.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image)";
                document.body.insertBefore(tempEl, document.body.firstChild);
            }
            
            tempEl.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = src;
            
            size.width = tempEl.offsetWidth;
            size.height = tempEl.offsetHeight;
            
            return size;
        },
        ratioCompressSize : function(width, height, maxWidth, maxHeight) {
            
            width = parseFloat(width);
            height = parseFloat(height);
//          maxLength = parseFloat(maxLength);
            maxWidth = parseFloat(maxWidth);
            maxHeight = parseFloat(maxHeight);
            
            var ratio;
            var size = {
                width : 0,
                height : 0
            };
            
            /**
             * 根据缩放尺寸来调整图像大小,
             */
            
            var maxlength = maxWidth >= maxHeight ? 'mw' : 'mh';
            
            var widthRatio = maxWidth / width;      //宽度缩放比例
            var heightRatio = maxHeight / height;   //高度缩放比例
                
//              alert(width + " + " + height + " + " + maxWidth + " + " + maxHeight)
                
            if (width <= maxWidth && height > maxHeight) {
                
                size.width = width * heightRatio;
                size.height = height * heightRatio
            } else if (width > maxWidth && height <= maxHeight){
                
                size.width = size * widthRatio;
                size.height = size * widthRatio;
            }else if(width > maxWidth && height > maxHeight) {
                
                if (height * widthRatio > maxHeight) {
                    //如果以宽度缩放尺寸,高度任然超出最大高度,那就以高度来缩放尺寸
                    size.width = width * heightRatio;
                    size.height = height * heightRatio;
                    
                } else if (width * heightRatio > maxWidth) {
                    //如果以高度缩放尺寸,宽度任然超出最大高度,那就以宽度来缩放尺寸
                    size.width = width * widthRatio;
                    size.height = height * widthRatio;
                    
                }
            }else {
                size.width = width;
                size.height = height;
            }
            
            return size;
            
        }
        
    }
    
    $.fn.previewlocimg = function(options) {
        var previews = new preview(this, options);
        return previews.makeDom();
    }
})();
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容