배경 이미지를 base64로 인코딩 된 이미지로 설정하는 방법이 있습니까?


84

JS에서 동적으로 배경을 변경하고 싶습니다. 내 이미지 세트는 base64로 인코딩되어 있습니다. 나는 시도한다 :

document.getElementById("bg_image").style.backgroundImage = 
   "url('http://amigo.com/300107-2853.jpg')"; 

완벽한 결과로

그러나 나는 다음과 같이 똑같이하지 못한다.

document.getElementById("bg_image").style.backgroundImage = 
   "url('data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAYAAAAUYybjAAAgAElE...')";

...도 아니다

document.getElementById("bg_image").style.backgroundImage = 
   "data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAYAAAAUYybjAAAgAElE...";

할 방법이 있습니까?


url('작동합니다, 내 문제는 액션 dataURL 실제로 줄 바꿈을 한 것으로 있었고, 나는에 있었다replace(/\n/g, '')
— neaumusic

답변:


91

나는 당신과 똑같이하려고했지만 분명히 backgroundImage가 인코딩 된 데이터로 작동하지 않습니다. 대안으로 CSS 클래스와 해당 클래스 간의 변경을 사용하는 것이 좋습니다.

"즉석에서"데이터를 생성하는 경우 CSS 파일을 동적으로로드 할 수 있습니다.

CSS :

.backgroundA {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDUxRjY0ODgyQTkxMTFFMjk0RkU5NjI5MEVDQTI2QzUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDUxRjY0ODkyQTkxMTFFMjk0RkU5NjI5MEVDQTI2QzUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENTFGNjQ4NjJBOTExMUUyOTRGRTk2MjkwRUNBMjZDNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENTFGNjQ4NzJBOTExMUUyOTRGRTk2MjkwRUNBMjZDNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuT868wAAABESURBVHja7M4xEQAwDAOxuPw5uwi6ZeigB/CntJ2lkmytznwZFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYW1qsrwABYuwNkimqm3gAAAABJRU5ErkJggg==");
}

.backgroundB {
    background-image:url("data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPbWLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVrApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KTkpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxMAF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=");
}

HTML :

<div id="test" height="20px" class="backgroundA"> 
  div test 1
</div>
<div id="test2" name="test2" height="20px" class="backgroundB">
  div test2
</div>
<input type="button" id="btn" />

자바 스크립트 :

function change() {
    if (document.getElementById("test").className =="backgroundA") {
        document.getElementById("test").className="backgroundB";
        document.getElementById("test2").className="backgroundA";
    } else {
        document.getElementById("test").className="backgroundA";
        document.getElementById("test2").className="backgroundB";
    }
}

btn.onclick= change;

나는 그것을 여기에 넣고 버튼을 누르면 div의 배경이 전환됩니다. http://jsfiddle.net/egorbatik/fFQC6/


고맙지 만 많은 요소를 다루기 때문에 수업을 교환하는 것은 실용적이지 않습니다.
— Igor Savinkin 2013-06-13

1
@IgorSavinkin과 미래에 이것을 읽는 사람. 많은 요소를 동일한 배경으로 동시에 변경하는 경우 CSS를 사용하여 변경하려는 각 요소에 대해 클래스를 배치하고 공통 조상 요소의 클래스를 변경하여 렌더링을 계단식으로 만들 수 있습니다. 예를 들어 css는 #ancestor.backgroundA .Change{background-image:...}and이며 #ancestor.backgroundB .Change{background-image...}, 여기서은 #ancestor공통 조상의 ID이고은 .Change배경 중 하나를 적용 할 모든 요소에 적용되는 클래스입니다.
— Patanjali

백만 개의 클래스가있는 CSS를 만드는 것이 좋은 방법인지 생각하기 전에 모든 사람들이이 답변을 최고로 투표하는 것을 보는 것은 재미 있습니다. 백만 개의 HD, 이미지가 들어있는 폴더). 그러나 예, 이것은 몇 가지 이미지에 대해 작동합니다.
— 가브리엘 가르시아

또한 시스템 사용 가능한 이미지에 새 이미지를 추가하는 문제를 어떻게 해결할 수 있습니까? 이 접근 방식은 확장 가능합니까?
— gabriel garcia

32

base64에서도 동일한 문제가 발생했습니다. 미래에 같은 문제가있는 사람을 위해 :

url = "data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAYAAAAUYybjAAAgAElE...";

이것은 콘솔에서 실행되지만 스크립트 내에서는 실행되지 않습니다.

$img.css("background-image", "url('" + url + "')");

그러나 그것을 조금 가지고 놀다가 이것을 생각해 냈습니다.

var img = new Image();
img.src = url;
$img.css("background-image", "url('" + img.src + "')");

프록시 이미지와 함께 작동하는 이유는 알 수 없지만 작동합니다. Firefox Dev 37 및 Chrome 40에서 테스트되었습니다.

누군가에게 도움이되기를 바랍니다.

편집하다

조금 더 조사했습니다. 인코딩 된 값에 줄 바꿈이 있기 때문에 (적어도 필자의 경우에는) 가끔 base64 인코딩이 CSS로 중단되는 것 같습니다 (제 경우 값은 ActionScript에 의해 동적으로 생성되었습니다).

예를 들어 간단히 사용 :

$img.css("background-image", "url('" + url.replace(/(\r\n|\n|\r)/gm, "") + "')");

또한 작동하며 프록시 이미지를 사용하는 것보다 몇 ms 더 빠른 것 같습니다.


2
줄 바꿈을 제거하면 문제가 해결되었습니다.
— Evan

좋은 조사.
— Sølve Tornøe

31

이것을 시도해보십시오. 성공 응답이 있습니다.

$("#divId").css("background-image", "url('data:image/png;base64," + base64String + "')");

경우에 보인다 data:image/png;base64길고 문자열 JQuery와 변수로 정의하고 작업을하지 않습니다. 하지만 문자열이 PHClaus 예제와 같은 PHP 변수로 정의 된 경우 작동합니다 .... 내가 테스트 한 내용에 대한 정보
— Andris

12

이 트릭을 Gabriel Garcia의 다음 솔루션에 추가-

var img = 'data:image/png;base64, ...'; //place ur base64 encoded img here
document.body.style.backgroundImage = 'url(' + img + ')';

그러나 제 경우에는 이것이 작동하지 않았습니다. URL을 img 변수로 이동하면 트릭이 발생했습니다. 그래서 최종 코드는 다음과 같습니다.

var img = "url('data:image/png;base64, "+base64Data + "')";
document.body.style.backgroundImage = img; 

1
@Amit Kumar Rai 당신이 맞습니다. 내 코드에서 작은 따옴표가 누락되어 실제로 코드가 작동하도록 작성했습니다.
— 가브리엘 가르시아

7

나는 이것을 시도했다 (그리고 나를 위해 일했다) :

var img = 'data:image/png;base64, ...'; //place ur base64 encoded img here
document.body.style.backgroundImage = 'url(\'' + img + '\')';

ES6 구문 :

let img = 'data:image/png;base64, ...'
document.body.style.backgroundImage = ´url('${img}')´

조금 더 나은:

let setBackground = src=>{
    this.style.backgroundImage = `url('${src}')`
}

let node = nodeIGotFromDOM, img = imageBase64EncodedFromMyGF
setBackground.call(node, img)

1
재미 있습니다. 이것이 바로 사람들이 말하는 코드가 작동하지 않는다는 것이기 때문입니다.
— Pimp Trizkit 17.04.27

이것은 나에게도 효과적입니다. Microsoft Edge 및 IE 11에서도 테스트
— Ryan.C

2

내가 일반적으로하는 일은 먼저 전체 문자열을 변수에 저장하는 것입니다.

<?php
$img_id = 'data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAY...';
?>

그런 다음 JS가 해당 변수로 무언가를 수행하기를 원합니다.

<script type="text/javascript">
document.getElementById("img_id").backgroundImage="url('<?php echo $img_id; ?>')";
</script>

다음과 같은 것을 사용하여 PHP를 통해 동일한 변수를 직접 참조 할 수 있습니다.

<img src="<?php echo $img_id; ?>">

나를 위해 작동합니다;)


2

이것은 순수한 전화를 거는 올바른 방법입니다. CSS가 없습니다.

<div style='background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAFCAYAAABW1IzHAAAAHklEQVQokWNgGPaAkZHxPyMj439sYrSQo51PBgsAALa0ECF30JSdAAAAAElFTkSuQmCC)repeat-x center;'></div>

<DIV 스타일 = '배경 : 홈페이지 (데이터 : 이미지 / PNG로, Base64로, iVBORw0KGgoAAAANSUhEUgAAABwAAAAFCAYAAABW1IzHAAAAHklEQVQokWNgGPaAkZHxPyMj439sYrSQo51PBgsAALa0ECF30JSdAAAAAElFTkSuQmCC) 반복-X 센터;'> </ DIV>
— user5641497

코드를 게시하려면 공백 4 개로 들여 쓰거나 코드를 선택하고 Ctrl-K를 누릅니다.

2

이것이 도움이 될 것이라고 생각합니다. Base64는 CSS에 의해 다른 방식으로 처리됩니다. 이미지의 데이터 유형을 base64로 설정해야합니다. 그러면 CSS가 base64를 이미지로 변경하여 사용자에게 표시하는 데 도움이됩니다. jquery 스크립트를 사용하여 배경 이미지를 할당하여 자바 스크립트에서 이것을 사용할 수 있으며, 자동으로 base64를 mage로 변경하고 표시합니다.

url = "data:image;base64,"+data.replace(/(\r\n|\n|\r)/gm, "");
$("body").css("background-image", "url('" + url.replace(/(\r\n|\n|\r)/gm, "") + "')");


코드 전용 답변은 권장하지 않습니다. 편집을 클릭하고 코드가 질문을 어떻게 처리하는지 요약하는 단어를 추가하거나 귀하의 답변이 이전 답변 / 답변과 어떻게 다른지 설명하십시오. 이 답변과 이전에 게시 된 답변 중 하나의 실제 차이를 볼 수 없습니다.
— Nick

0

제 경우에는 height및을 설정하지 않았기 때문 width입니다.

그러나 또 다른 문제가 있습니다.

배경 이미지는 다음을 사용하여 제거 할 수 있습니다.

element.style.backgroundImage=""

그러나 사용하여 설정할 수 없습니다

element.style.backgroundImage="some base64 data"

Jquery가 잘 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.