2012-10-26 26 views
1

标题几乎全都说明了这一点。 我经历了一些jQuery插件,以便将图像变成黑白。 但是他们都没有提供我想到的功能。当一个指定的元素被徘徊时,我想让图像变回一个有色的图像。一旦指定的元素使用jQuery进行悬停,将图像变为黑白,然后恢复正常

这是我目前使用的插件:

(function ($) { 
$.fn.extend({ 
    BlackAndWhite: function (options) { 
     'use strict'; 
     var container = this, 
      self = this, 
      defaults = { 
       hoverEffect: true, 
       webworkerPath: false, 
       responsive: true, 
       invertHoverEffect: false, 
       speed: 500 
      }; 
      options = $.extend(defaults, options); 
     //@public vars 
     var hoverEffect = options.hoverEffect, 
      webworkerPath = options.webworkerPath, 
      invertHoverEffect = options.invertHoverEffect, 
      responsive = options.responsive, 
      fadeSpeedIn = $.isPlainObject(options.speed) ? options.speed.fadeIn : options.speed, 
      fadeSpeedOut = $.isPlainObject(options.speed) ? options.speed.fadeOut : options.speed; 
     //@private var 
     var supportsCanvas = !!document.createElement('canvas').getContext, 
      $window = $(window); 
     /* Check if Web Workers are supported */ 
     var supportWebworker = (function() { 
       return (typeof (Worker) !== "undefined") ? true : false; 
      }()); 

     var isIE7 = $.browser.msie && +$.browser.version === 7; 
     //@private methods 
     //convert any image into B&W using HTML5 canvas 
     var greyImages = function (img, canvas, width, height) { 
      var ctx = canvas.getContext('2d'), 
       currImg = img, 
       i = 0, 
       grey; 

      ctx.drawImage(img, 0, 0, width, height); 

      var imageData = ctx.getImageData(0, 0, width, height), 
       px = imageData.data, 
       length = px.length; 

      // web worker superfast implementation 
      if (supportWebworker && webworkerPath) { 

       var BnWWorker = new Worker(webworkerPath + "BnWWorker.js"); 

       BnWWorker.postMessage(imageData); 

       BnWWorker.onmessage = function (event) { 
        ctx.putImageData(event.data, 0, 0); 
       }; 
      } else { 

       // no webworker slow implementation 
       for (; i < length; i += 4) { 
        grey = px[i] * 0.3 + px[i + 1] * 0.59 + px[i + 2] * 0.11; 
        px[i] = px[i + 1] = px[i + 2] = grey; 
       } 

       ctx.putImageData(imageData, 0, 0); 
      } 
     }; 

     var injectTags = function (pic, currImageWrapper) { 

      var src = pic.src; 

      if (supportsCanvas && (!($.browser.msie && $.browser.version == '9.0'))) { 

       var currWidth = $(currImageWrapper).find('img').width(), 
        currHeight = $(currImageWrapper).find('img').height(), 
        realWidth = pic.width, 
        realHeight = pic.height; 

       //adding the canvas 
       $('<canvas width="' + realWidth + '" height="' + realHeight + '"></canvas>').prependTo(currImageWrapper); 
       //getting the canvas 
       var currCanvas = $(currImageWrapper).find('canvas'); 
       //setting the canvas position on the Pics 
       $(currCanvas).css({ 
        'position': 'absolute', 
        top: 0, 
        left: 0, 
        width: currWidth, 
        height: currHeight, 
        display: invertHoverEffect ? 'none' : 'block' 
       }); 

       greyImages(pic, currCanvas[0], realWidth, realHeight); 

       if (hoverEffect) { 
        $(currImageWrapper).mouseenter(function() { 
         if(!invertHoverEffect) { 
          $(this).find('canvas').stop(true, true).fadeOut(fadeSpeedOut); 
         } else { 
          $(this).find('canvas').stop(true, true).fadeIn(fadeSpeedIn); 
         } 
        }); 
        $(currImageWrapper).mouseleave(function() { 
         if(!invertHoverEffect) { 
          $(this).find('canvas').stop(true, true).fadeIn(fadeSpeedIn); 
         } else { 
          $(this).find('canvas').stop(true, true).fadeOut(fadeSpeedOut); 
         } 
        }); 
       } 
      } else { 

       var ieWidth = $(currImageWrapper).find('img').prop('width'); 
       var ieHeight = $(currImageWrapper).find('img').prop('height'); 

       //adding the canvas 
       $('<img src=' + src + ' width="' + ieWidth + '" height="' + ieHeight + '" class="ieFix" /> ').prependTo(currImageWrapper); 
       $('.ieFix').css({ 
        'position': 'absolute', 
        top: 0, 
        left: 0, 
        'filter': 'progid:DXImageTransform.Microsoft.BasicImage(grayscale=1)', 
        display: invertHoverEffect ? 'none' : 'block' 
       }); 

       if (hoverEffect) { 
        $(currImageWrapper).mouseenter(function() { 
         if(!invertHoverEffect) { 
          $(this).children('.ieFix').stop(true, true).fadeOut(fadeSpeedOut); 
         } else { 
          $(this).children('.ieFix').stop(true, true).fadeIn(fadeSpeedIn); 
         } 
        }); 
        $(currImageWrapper).mouseleave(function() { 
         if(!invertHoverEffect) { 
          $(this).children('.ieFix').stop(true, true).fadeIn(fadeSpeedIn); 
         } else { 
          $(this).children('.ieFix').stop(true, true).fadeOut(fadeSpeedOut); 
         } 
        }); 
       } 
      } 
     }; 
     this.init = function (options) { 

      $(container).each(function (index, currImageWrapper) { 
       var pic = new Image(); 
       pic.src = $(currImageWrapper).find('img').prop("src"); 

       if (!pic.width) { 
        $(pic).on("load", function() {injectTags(pic, currImageWrapper);}); 
       } else { 
        injectTags(pic, currImageWrapper); 
       } 
      }); 


      if (responsive) { 
       $window.on('resize orientationchange', container.resizeImages); 
      } 
     }; 

     this.resizeImages = function() { 

      $(container).each(function (index, currImageWrapper) { 
       var pic = $(currImageWrapper).find('img:not(.ieFix)'); 
       var currWidth,currHeight; 
       if (isIE7) { 
        currWidth = $(pic).prop('width'); 
        currHeight = $(pic).prop('height'); 
       } else { 
        currWidth = $(pic).width(); 
        currHeight = $(pic).height(); 
       } 

       $(this).find('.ieFix, canvas').css({ 
        width: currWidth, 
        height: currHeight 
       }); 

      }); 
     }; 

     return self.init(options); 

    } 

}); 
}(jQuery)); 
+0

我想说的跨浏览器的简单的路要走只是采用两个图像。 – adeneo

+0

[将图像转换为HTML/CSS中的灰度]的可能重复(http://stackoverflow.com/questions/609273/convert-an-image-to-grayscale-in-html-css) – Neil

+0

大声笑。不是重复的。看看作者姓名:p –

回答

2

我想你也可以通过使用CSS3来做到这一点。为了使任何图像(可以说有类“图像”),以黑色和白色,你可以用这个去: -

img.Image{ 
-webkit-filter: grayscale(100%); 
-moz-filter: grayscale(100%); 
filter: grayscale(100%); 
} 

并把它放回彩色一个悬停,你可以这样做: -

img.Image:hover{ 
-webkit-filter: grayscale(0%); 
-moz-filter: grayscale(0%); 
filter: grayscale(0%); 
} 
0

Convert an image to grayscale in HTML/CSS建议通过平均的红色,绿色和蓝色分量greyscaling在Firefox中的图像。但是,这不会导致亮度相同的图像。你会使用去饱和过滤器获得更好的结果:

<svg xmlns="http://www.w3.org/2000/svg"> 
    <filter id="gray"> 
    <feColorMatrix type="saturate" values="0"/> 
    </filter> 
</svg> 

使用filter: url(grayscale.svg#grayscale);在你的CSS。 (如果你的文档非常简单,那么你实际上可以把HTML,CSS和SVG放在同一个文档中。)

+0

我试过这种方法,但它在IE中不起作用:s –

1

的jQuery,同样的事情可以通过执行实现这一目标: -

制作的图像变成黑色和白色,这样做: - 如果你想这个在文件准备

,然后

$('document').ready(function(){ 
$("img.Image").css({'-webkit-filter':'grayscale(100%)','-moz- filter':'grayscale(100%)','filter': 'grayscale(100%)'});  
}); 

那么之后你需要,我认为这是什么: -

$("img.Image").on('hover',function(){ 
$(this).css({'-webkit-filter':'grayscale(0%)','-moz-filter':'grayscale(0%)','filter':'grayscale(0%)'}); 
},function(){ 
$(this).css({'-webkit-filter':'grayscale(100%)','-moz-filter':'grayscale(100%)','filter': 'grayscale(100%)'}); 
} 
); 
相关问题