2016-12-18 3 views
0

прямо сейчас я пишу небольшое расширение хром. расширение захватывает изображение Bing дня и устанавливает его как фоновое изображение тела, а затем расширение также захватывает погоду, время, дату и т. д. Проблема в том, что иногда изображение дня, например, яркое на одном боковой и темной - с другой. Таким образом, независимо от цвета текста, некоторые из них неразборчивы. Как я могу определить, какой цвет должен иметь каждый текст в зависимости от цвета фонового изображения за конкретным текстом? Спасибо заранее.Динамически меняющийся цвет текста в зависимости от фонового изображения

+0

Это жёстко можно сделать с помощью JavaScript. Это можно легко сделать на стороне сервера, например php. –

+0

добавить темную тень для текста, как это делается для субтитров фильмов, например, – Slonski

+0

@Makyen Understood! будет исправляться как можно скорее. –

ответ

0

Вы можете использовать функцию attr() jQuery. Например, если вы IMG тег имеет атрибут идентификатор 'my_image':.

<img id="my_image" src="first.jpg"/> 

Jquery $ ("# my_image") атр ("ЦСИ", "second.jpg");

0

У меня есть что-то для работы ... Это своего рода временное, но не надежное, но я нашел сценарий, который вычисляет общую яркость, что позволяет сценарию решить, должен ли он отображать черный или белый текст. Кажется, хорошо работает, на данный момент. Вот оно:

function getImageBrightness(imageSrc) { 
    var img = document.createElement("img"); 
    img.src = imageSrc; 
    img.style.display = "none"; 
    document.body.appendChild(img); 
    var colorSum = 0; 
    img.onload = function() { 
     // create canvas 
     var canvas = document.createElement("canvas"); 
     canvas.width = this.width; 
     canvas.height = this.height; 
     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(this, 0, 0); 
     var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 
     var data = imageData.data; 
     var r, g, b, avg; 

     for (var x = 0, len = data.length; x < len; x += 4) { 
      r = data[x]; 
      g = data[x + 1]; 
      b = data[x + 2]; 

      avg = Math.floor((r + g + b)/3); 
      colorSum += avg; 
     } 

     brightness = Math.floor(colorSum/(this.width * this.height)); 
     console.log(brightness); 
     if (brightness < 150) { 
      $(".contrast").css("color", "white"); 
     } else { 
      $(".contrast").css("color", "black"); 
     } 
    } 
} 

кредит: https://jsfiddle.net/s7Wx2/

+0

Возможно, это может быть улучшено, если вы рассчитали среднее значение только по области, в которой вы показываете текст, а не по всему изображению. – Makyen

+0

@Makyen Это правильно. Любая идея о том, как я могу это сделать? –

+0

У меня есть некоторые идеи, но их использование требует экспериментов. Для этого требуется написать код для извлечения изображения (ов) и отображения текста над ним. Даже если я это сделаю, я не гарантированно правильно угадал, как вы делаете эту часть своего кода. Предотвращение необходимости делать это угадывание и сокращение объема работы, которая должна быть включена в дублирующий код, который у вас уже есть, - это некоторые из причин, по которым настоятельно предлагается [mcve] (и требуется для некоторых типов вопросов). Наличие [mcve] также делает его более вероятным, чтобы другие люди работали над поиском решений. – Makyen