배경 이미지를 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.