Как сделать цветной файл PNG в оттенках серого?

Возможный дубликат:
преобразовать изображение в оттенки серого в HTML / CSS

Я хочу взять цветное изображение .png при загрузке страницы и превратить его в оттенки серого, но затем, когда вы наводите курсор на изображение, оно снова становится цветным, а при наведении курсора - серым. Я пробовал как минимум 10 различных руководств по этому поводу, но ни одно из них не помогло. Элемент, который мне нужно изменить с цвета на серый, обратно на цвет и обратно на серый, - это .photo. http://jamestestblog3.tumblr.com/ - это мой тестовый веб-сайт.

Как я могу это сделать?


person James Charless Dickinson    schedule 04.12.2011    source источник
comment
Единственный способ убедиться, 2 изображения.   -  person Dejan Marjanović    schedule 05.12.2011
comment
Майкл - Эта тема будет для публичного использования, в основном для фотоблогов. Некоторые фотоблоги публикуют до 500 фотографий в день, мне нужно, чтобы это был JQuery, а не 2 изображения.   -  person James Charless Dickinson    schedule 05.12.2011
comment
@James, насколько мне известно, для этого не существует хорошего кросс-браузерного способа. Вы бы предпочли иметь 2 изображения или решение будет работать только для 60% ваших посетителей?   -  person Gordon Gustafson    schedule 05.12.2011
comment
Я бы предпочел, чтобы решение работало для 60% моих посетителей, я не могу использовать 2 изображения, это фото-блог, и мой веб-сайт построен на записях, а не на div. (Это похоже на wordpress, когда я публикую, он попадает в мой блог. Я могу контролировать, как выглядят сообщения, но div генерируются сами по себе.)   -  person James Charless Dickinson    schedule 05.12.2011
comment
Вы можете сделать это как с SVG, так и с HTML5 Canvas.   -  person Phrogz    schedule 05.12.2011
comment
Я знаю. Мне 13 лет, и я только что закончил изучать CSS. Я понятия не имею о JQuery, Javascript, SVG или HTML5. Я был бы очень признателен, если бы кто-нибудь мог написать для меня код. Ненавижу спрашивать, но мне действительно нужно, чтобы это было сделано.   -  person James Charless Dickinson    schedule 05.12.2011
comment
@JamesCharlessDickinson См. Повторяющийся вопрос; у него есть ссылка на ответ JS, а также ответы на SVG.   -  person Phrogz    schedule 05.12.2011
comment
@Phrogz В Javascript нельзя загружать изображения из другого домена, но веб-сайт, на котором он будет находиться, должен будет загружать их с таких сайтов, как flickr, weheartit и т. Д. Кроме того, мне нужно, чтобы изображение было серым при загрузке страницы и меняло цвет при наведении курсора.   -  person James Charless Dickinson    schedule 05.12.2011
comment
@JamesCharlessDickinson Если вы собираетесь украсть изображения с других хостов, вам нужно будет написать собственный прокси-сервер на вашем веб-сервере, который загружает изображения за вас.   -  person Phrogz    schedule 05.12.2011
comment
Это не кража изображений. Это блог-сайт, где вы можете делать реблог фотографий.   -  person James Charless Dickinson    schedule 05.12.2011


Ответы (1)


Как уже упоминалось, проблема заключается в перекрестном домене. К сожалению, tumblr использует другой домен для изображений, нежели тот, на котором размещен ваш блог. В демонстрации ниже я использовал сторонний сайт преобразования (http://www.maxnov.com/getimagedata), чтобы получить данные изображения. Я пробовал то же самое в своей теме tumblr (http://www.tumblr.com/theme/32199), но в итоге не использовал его.

Демо: http://jsfiddle.net/ThinkingStiff/vXWvz/

HTML:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://thinkingstiff.com/scripts/get-image-data.js"></script>

<img id="image" alt="" src="http://thinkingstiff.com/images/100x100.png" />

Сценарий:

function initializeImage( imageElement ) {

    $.getImageData( {

        url: imageElement.src,
        success: function( image ) {

            if( !imageElement.dataset.color ) {

                var canvas = document.createElement( 'canvas' ),
                    context = canvas.getContext( '2d' ),
                    width = image.width,
                    height = image.height;

                canvas.width = width;
                canvas.height = height;
                context.drawImage( image, 0, 0 );

                var pixels = context.getImageData( 0, 0, width, height );

                for( var y = 0; y < pixels.height; y++ ) {

                     for( var x = 0; x < pixels.width; x++ ) {

                          var i = ( y * 4 ) * pixels.width + x * 4;
                          var avg = ( 
                                pixels.data[i] 
                              + pixels.data[i + 1] 
                              + pixels.data[i + 2] 
                          ) / 3;
                          pixels.data[i] = avg;
                          pixels.data[i + 1] = avg;
                          pixels.data[i + 2] = avg;

                     };

                };

                context.putImageData( pixels, 0, 0, 0, 0, pixels.width, pixels.height );
                imageElement.dataset.color = imageElement.src;
                imageElement.dataset.gray = canvas.toDataURL();
                imageElement.src = canvas.toDataURL();

            };

        }

    } );

};

var image = document.getElementById( 'image' );

initializeImage( image );

image.addEventListener( 'mouseover', function () {

    this.src = this.dataset.color;

} );

image.addEventListener( 'mouseout', function () {

    this.src = this.dataset.gray;

} );
person ThinkingStiff    schedule 04.12.2011
comment
Я обновил это, чтобы использовать $ .getImageData, чтобы он был завершен. - person ThinkingStiff; 05.12.2011