Изменить белый фон изображения на фон всей страницы при помощи CSS

114
01 ноября 2019, 10:00

Фон всей страницы серый. Скачал небольшой логотип, естественно на странице он отображается как белый квадрат внутри которого расположен логотип. Вопрос: как изменить/закрасить белый фон изображения в серый цвет страницы при помощи CSS?

Answer 1

в фотошопе убрать белый фон логотипа и сохранить в формате png. При помощи css - никак, если у вас jpg/png c фоном.

Answer 2

Решил задачку при помощи Inkscape за пару минут.

  • Загружаем лого File >>> Open
  • В inkscape выбираем Path >>> Trace Bitmap
  • Убираем галки с чекбоксов Smooth и Stack scans
  • Ставим галку Remove background
  • Radio-группа выбираем Greys (whatever)
  • Scans по минимуму 2
  • Update >>> OK
  • File >>> Export png
  • Видео https://www.youtube.com/watch?v=ESXJ_0Fa0rs
Answer 3

Вариант сделать вручную не рассматриваю - тут вопросы и ответы по программированию.

Это конечно не CSS, это фильтр на WebGL который заменяет выбранный цвет цвет на прозрачный с определенным порогом.

Использование:

let img = removeColor(
    url, // адрес картинки
    255, // red
    255, // green
    255, // blue
    0.1  // порог
);

Этот вызов вернет canvas, с изображением, в котором выбранный цвет заменен на прозрачный.

function removeColor(url, r, g, b, a) { 
 
  let canvas = document.createElement('canvas'); 
  let gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); 
  let loader = new Image(); 
  loader.crossOrigin = "anonymous"; 
  loader.src = url; 
  loader.onload = function() {  
   
    let w = canvas.width = loader.width; 
    let h = canvas.height = loader.height; 
 
    let pid = gl.createProgram(); 
 
    shader(` 
      attribute vec2 coords; 
       
      void main(void) { 
        gl_Position = vec4(coords.xy, 0.0, 1.0); 
      } 
    `, gl.VERTEX_SHADER); 
 
    shader(` 
      precision highp float; 
      uniform sampler2D texture; 
 
      void main(void) { 
        vec2 uv = vec2( 
          gl_FragCoord.x/${w}.,  
          1. - gl_FragCoord.y/${h}. 
        ); 
        vec4 tex = texture2D(texture, uv); 
        vec3 c = abs(vec3(${r}., ${g}., ${b}.)/255. - tex.rgb); 
        if (c.r < ${a} && c.g < ${a} && c.b < ${a}) 
            gl_FragColor = vec4(0.); 
        else 
            gl_FragColor = vec4(tex.xyz, 1.); 
      } 
    `, gl.FRAGMENT_SHADER); 
 
    gl.linkProgram(pid); 
    gl.useProgram(pid); 
 
    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); 
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,  3, -1, -1, 3, -1]), gl.STATIC_DRAW); 
 
    let al = gl.getAttribLocation(pid, "coords"); 
    gl.vertexAttribPointer(al, 2, gl.FLOAT, false, 0, 0); 
    gl.enableVertexAttribArray(al); 
 
    gl.bindTexture(gl.TEXTURE_2D, gl.createTexture()); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, loader); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 
 
    gl.uniform1i(gl.getUniformLocation(pid, "texture"), 0); 
    gl.viewport(0, 0, w, h); 
    gl.clearColor(0, 0, 0, 0); 
    gl.drawArrays(gl.TRIANGLES, 0, 3); 
 
    function shader(src, type) { 
      let sid = gl.createShader(type); 
      gl.shaderSource(sid, src); 
      gl.compileShader(sid); 
      gl.attachShader(pid, sid); 
    } 
  } 
   
  return canvas; 
}
body { 
  background-color: lightgray; 
  overflow: hidden; 
  padding-top: 20px; 
  zoom: 87%; 
}
<img> 
<script> 
  let url = "https://webglfundamentals.org/webgl/resources/star.jpg"; 
  document.querySelector('img').src = url; 
  setTimeout(() => { 
    document.body.append(removeColor(url, 255, 255, 255, 0.1)); 
    document.body.append(removeColor(url, 0, 0, 0, 0.5)); 
  }); 
</script>

READ ALSO
Не работают css стили после подключения Spring sequrity

Не работают css стили после подключения Spring sequrity

Работаю над веб приложением с использованием Spring MVC и после подключения Spring sequrity перестали работать подключенные css стилиПерепробовал разные...

111
Проблема с подключаемым шрифтом

Проблема с подключаемым шрифтом

Возникла какая-то странная проблемаВерстаю страничку в редакторе и проверяю его на соответствие с макетом в FireFox

126
В чем разница между этими способами создания двумерного массива?

В чем разница между этими способами создания двумерного массива?

Как объяснить то, что массив arr1 так странно реагирует на замену элемента?

117
Преобразования для примитивов [дубликат]

Преобразования для примитивов [дубликат]

На данный вопрос уже ответили:

116