【问题标题】:Background Color to transparent background image in css背景颜色到css中的透明背景图像
【发布时间】:2015-08-31 19:01:18
【问题描述】:

例如,我可以使用 background: url(dump.gif); 将背景图像放到具有 css 的特定 div 中。如果说 gif 是透明的,我可以用 css 为 it 应用背景颜色吗?假设我单击一个按钮,然后运行一个命令来仅更改透明图像的背景,并将该图像嵌入到更大的 div 中。

想象一下,玻璃被嵌入到一个更大的 div 中,并按照描述的方式设置为 css 背景。任何能够改变它的背景的方式。

“不”可以作为答案,至少我不会再怀疑了。

编辑:添加了 jsfiddle。如果 glas 具有误导性,请单击小提琴。

http://jsfiddle.net/v4yfdkmf/

基本上是移动加载图像的位置。我想用这段代码改变它的背景。

【问题讨论】:

  • 我很抱歉,但由于代词四处飘荡(例如 it),我感到有些失落。你的问题看起来很有趣,但我认为我没有完全理解它。您能否澄清图像中的哪个部分是background,图像是什么以及它们将被包含在其中的div 是什么(如果有的话?)?
  • 你想改变杯子的颜色,还是喝颜色?
  • 如果你想象玻璃在div的中心底部嵌入为css背景,它是一个gif,有轮廓但透明,就像玻璃一样。然后我只需要更改 gif 透明部分后面的背景,这样我就可以让它看起来像里面的流体
  • 例如使用 css background-color: green... 你最好在你的问题中加入一些代码,或者创建一个 Fiddle。
  • 如果您的 gif 中的玻璃轮廓之外的区域不透明,并且只有玻璃内部是透明的,那么您可以使用 - background: yellow url('glass.gif'); 将背景颜色应用于仅透明区域。跨度>

标签: javascript css


【解决方案1】:

您可以为此使用画布 API。 (另见https://developer.mozilla.org/en-US/docs/Canvas_API/Tutorial/Pixel_manipulation_with_canvas/

你可以做一些他们用在他们的颜色转换器上的东西:

var img = new Image();
img.src = 'your pic source';
img.onload = function() {
  draw(this);
};

function draw(img) {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0);
  img.style.display = 'none';
  var imageData = ctx.getImageData(0,0,canvas.width, canvas.height);
  var data = imageData.data;

您现在有了一个包含图像颜色的数组。
然后在函数中编写一些代码来循环遍历像素,并在它为白色(或 gif 具有的任何其他默认背景颜色)时基本上改变它。

然后用ctx.putImageData(imageData, 0, 0);画图

希望这就是你的意思。

【讨论】:

  • 在这种情况下,我将创建一个新元素,然后我需要将它附加到 div 中,我希望它在哪里?如果是这样,那效果就不太好了,因为我的代码很少——甚至无法适应这些变化。仍然优雅的解决方案,谢谢!也许适用于其他人。
  • 这确实是必要的。很抱歉没能帮到你!
【解决方案2】:

您可以使用 Javascript 生成一个像素 base64 编码的图像,而不是将其设置为第二个背景。检查Fiddle 或往下看:

function encodeHex(s) {
    s = s.substring(1, 7);
    if (s.length < 6) {
        s = s[0] + s[0] + s[1] + s[1] + s[2] + s[2];
    }
    return encodeRGB(
    parseInt(s[0] + s[1], 16), parseInt(s[2] + s[3], 16), parseInt(s[4] + s[5], 16));
};

function encodeRGB(r, g, b) {
    return encode_triplet(0, r, g) + encode_triplet(b, 255, 255);
};

function encode_triplet(e1, e2, e3) {
    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    enc1 = e1 >> 2;
    enc2 = ((e1 & 3) << 4) | (e2 >> 4);
    enc3 = ((e2 & 15) << 2) | (e3 >> 6);
    enc4 = e3 & 63;
    return keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
};

function generatePixel(color) {
    return "data:image/gif;base64,R0lGODlhAQABAPAA" + color + "/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";
};


var imageDiv = $('.big_div');
var originalImage = imageDiv.css('background-image');
$('.change_color').on('click', function (e) {
    var hex = $('#color_hex').val();
    var color = encodeHex(hex);
    var data = generatePixel(color);
	imageDiv.css({
        'background-image': originalImage + ', url(' + data + ')'
    });
});
.big_div {
    background: url('http://info.eps.surrey.ac.uk/logos/transbugs.gif') no-repeat center center;
    background-size: 160px 100px;
    width: 300px;
    height: 200px;
    border: 1px solid black;
    margin-bottom: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="big_div"></div>
<fieldset>
    <legend>Pick color:</legend>
    <p>
        <label for="color_hex">Hex color:</label>
        <input id="color_hex" type="text" placeholder="#ccc" />
    </p>
    <p>
        <button class="change_color">Change color</button>
    </p>
</fieldset>

颜色编码要感谢this Fiddle,找不到作者姓名。

【讨论】:

  • 感谢您的解决方案。我真的很感激你投入的时间。我希望其他人也会发现它有帮助。我会尝试应用它。
  • 快乐是我的,应该不难实现。