2015-07-03 2 views
1

Im загружает изображение с 3 цветами в элемент HTMLCanvas на мобильном устройстве Android (Samsung Galaxy S3). При проверке использованных цветов в используемом изображении, я получаю намного больше цветов. При запуске того же кода на обычном ПК я получаю точные цвета и подсчитываю.Canvas on mobile возвращает неправильные цвета

Пример код:

function getColorsFromImageData (imageData) { 
    var colors = {}; 
    var data = imageData.data; 

    for (var i = 0, len = data.length; i < len; i += 4) { 
     if (data[i+3] == 0) continue; 
     var rgb = data[i] + "," + data[i+1] + "," + data[i+2]; 
     if (colors[rgb]) 
      colors[rgb]++; 
     else 
      colors[rgb] = 1; 
    } 
    return colors; 
}; 

function createColorElement (color, count) { 
    var elm = document.createElement("span"); 
    elm.style.backgroundColor = "rgb(" + color + ")"; 
    elm.className = "color"; 
    elm.innerHTML = color + " (" + count + ")"; 
    document.getElementById("colors").appendChild(elm); 
} 

window.onload = function() { 
    var canvas = document.getElementById("c"); 
    var img = new Image(); 
    img.onload = function() { 
     canvas.width = img.width; 
     canvas.height = img.height; 
     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(img,0,0); 

     var data = ctx.getImageData(0, 0, img.width, img.height); 
     var colors = getColorsFromImageData(data); 

     var count = 0; 
     for (var color in colors) { 
      createColorElement(color, colors[color]); 
      count++; 
     } 

     document.getElementById("count").innerHTML = count; 
    } 
    img.src = "test.png"; 
}; 

Вот скрипка: http://jsfiddle.net/d6714wdg/

Как я могу получить точные цвета на мобильном телефоне?

Фон: Я создаю онлайн-дизайнер на основе HTMLCanvas. Мне нужны точные значения цвета и отсутствие сглаживания, потому что все цвета должны соответствовать набору предопределенных цветов, соответствующих используемому цвету шерсти.

Спасибо за любую помощь.

+0

@Kaiido. Спасибо за вашу помощь. Я тоже нашел этот ответ, и IMO это другая проблема, поскольку я использую только пиксельные данные с полной непрозрачностью (альфа-канал - 255), и моя проблема до сих пор не выполнялась на настольных реализациях, но только на мобильных устройствах. И Firefox, и Chrome на мобильных устройствах показывают одинаковое поведение. – kirschkern

+0

Загрузка jsfiddle в Chrome 43 на моем мобильном устройстве возвращает итоговое количество 15 цветов (изначально определены только 3). Возможно, я не полностью понимаю проблему, описанную в вашем связанном объяснении, но, глядя на значения цвета в моем jsfiddle, они все очень близко друг к другу, и те, которые я ожидаю увидеть, также присутствуют и те, у которых самый высокий счет. Это не соответствует объяснению. Правильно? Спасибо, что придерживаюсь темы, я очень ценю это. – kirschkern

+0

Плохо, это не проблема. И это действительно исправляет мою собственную проблему, так что спасибо :-) – Kaiido

ответ

1

Проблема, с которой вы сталкиваетесь, связана с тем, что холст делает сглаживание по drawImage() по умолчанию.

Это можно отключить, установив для объекта imageSmoothingEnabled значение false.

Это свойство еще не стабилизировалась, и вы будете нуждаться в конструктор префиксы:

ctx.mozImageSmoothingEnabled = false; 
ctx.webkitImageSmoothingEnabled = false; 
ctx.msImageSmoothingEnabled = false; 
ctx.imageSmoothingEnabled = false; 
ctx.drawImage(img, 0, 0); 

updated fiddle

+1

О, боже! Мне приходилось отключать ImageSmoothing все время, но не ожидал, что на мобильном устройстве будет отличаться другое поведение. Теперь все снова круто. Ты потряс мой день. Большое спасибо! – kirschkern

Смежные вопросы