<div class="codetitle"> <span><a style="CURSOR: pointer" data="65911" class="copybut" id="copybut65911" onclick="doCopy('code65911')"><u>코드 복사</u></a></span> 코드는 다음과 같습니다.</div> <div class="codebody" id="code65911"> <br><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <br><html xmlns="http://www.w3.org/1999/xhtml"> <br><head><meta http-equiv="Content-Type" 콘텐츠 ="text/html; charset=gb2312" /> <br><style> 스크립트> <br>////////////////////////// <br>//base64로 인코딩된 GIF 이미지 디코딩<br>//작성자 Mozart0 <br>//2005/10/29 <br>//////////////////// <br><br>//GIF 클래스 개체 만들기<br> / /클래스 GIF는 이 함수 내에 정의됩니다. <br> // str64: Base64로 인코딩된 gif 파일 문자열 <br> // 성공 시 생성된 GIF 객체를 반환합니다. <br> // 실패 시 null을 반환합니다. <br> function getGif(str64 ){ <br>var bytes=decodeBase64(str64); <br>if(!bytes){ <br>alert("오류: 잘못된 Base64 인코딩") <br>return null; gif =new GIF(); <br>for(var i=0;i<6;i ) <BR>gif.version =String.fromCharCode(bytes[i]) <BR>if(gif.version.slice) ( 0,3)!="GIF"){ <BR>alert("오류: GIF가 아닌 이미지 형식"); <BR>return null <BR>} <BR>gif.width=bytes[i]| (바이트 [i 1]<<8) <BR>gif.height=bytes[i 2]|(바이트[i 3]< <BR>var f=bytes[i 4] ; <BR>gif.colorResolution=(f>>4&0x7) 1; <br>gif.sorted=(f&0x8)?true:false <br>gif.BackgroundIndex=bytes[i 5]; pixelAspectRadio= bytes[i 6]; <br>if(f&0x80){ <br>gif.globalPalette=[]; <br>i =getPalette(i 7,bytes,gif.globalPalette,2<<(f&0x7)) ; <BR>} <BR>i =7; for(var j=i;j<bytes.length;j ) <BR>if(bytes[j]==0x21&&bytes[j 1]==0xf9) <BR>break; <BR>if(j==bytes.length){ <BR>for(;i<bytes.length;i ) <BR>if(bytes[i]==0x2c) <BR>break; <BR>if(i==bytes.length){ <BR>alert("오류: 이미지 데이터를 찾을 수 없음"); <BR>return null; <BR>} <BR>var f=new GIF_Frame(); 🎜 >if(!getSingleFrame(i,f)) <BR>return null <BR>else <BR>gif.frames.push(f) <BR>} <BR>else{ <BR>i=j; <BR>do{ <BR>var f=new GIF_Frame(); <BR>var t=getSingleFrame(i,f); <BR>if(!t) <BR>return null; 푸시(f); <BR>for(i =t;i<bytes.length;i ) <BR>if(bytes[i]==0x21&&bytes[i 1]==0xf9) <BR>break; } <BR>while(i<bytes.length); <BR>} <BR>return gif; <BR><BR>//내부 프로세스, 색상 테이블 생성<BR>function getPalette(pos,s,d,len ) { <BR>len*=3; <BR>for(var i=pos;i<pos len;i =3) <BR>d.push('#' (s[i]<=0xf?" 0 ":"") s[i].toString(16) <BR> (s[i 1]<=0xf?"0":"") s[i 1].toString(16) <BR> ( s [i 2]<=0xf?"0":"") s[i 2].toString(16)) <BR>return len <BR>} <BR><br>//내부 프로세스, 통합 데이터 세그먼트<br>function getBlock(pos,s,d){ <BR>var p=pos <BR>while(len=s[p]){ <BR>for(var i=0;i<len ; i ) <BR>d.push(s[pi]); <BR>p =len <BR>} <BR>return p-pos; <BR><br>//내부 프로세스 데이터의 한 프레임 가져오기<br>function getSingleFrame(pos,frame){ <BR>var i=pos <BR>if(bytes[i]==0x21){ <BR>i =3; bytes[ i]&1) <BR>frame.transparentIndex=bytes[i 3] <BR>frame.delay=bytes[i 1]|(bytes[i 2]<<BR>for( i = 5;i<bytes.length&&bytes[i]!=0x2c;i ) <BR>if(i==bytes.length){ <BR>alert("오류: 이미지 식별자를 찾을 수 없음"); 0 반환 <BR>} <br>} <br>frame.offsetX=bytes[i 1]|(bytes[i 2]<<8) <BR>frame.offsetY=bytes[i 3]| (bytes[i 4]<<8); <BR>frame.width=bytes[i 5]|(bytes[i 6]<<BR>frame.height=bytes[i 7) ]|(bytes[i 8]<<8); <BR>var f=bytes[i 9] <BR>i =10; <BR>if(f&0x40) <BR>frame.interlace=true; <BR>if(f&0x20) <BR>frame.sorted=true; <BR>if(f&0x80){ <BR>frame.colorResolution=(f&0x7) 1 <BR>frame.localPalette=[]<BR>; =getPalette(i,bytes,frame.localPalette,1<<frame.colorResolution) <BR>} <BR>else{ <BR>frame.colorResolution=gif.colorResolution <BR>frame.localPalette=gif.globalPalette; ; <BR>} <BR>var lzwLen=bytes[i ] 1; <BR>i =getBlock(i,bytes,frame.data) <BR>frame.data=decodeLzw(frame.data,lzwLen); 🎜>returnframe.data?i-pos:0; <BR>} <BR><BR>//GIF 파일 저장을 위한 데이터 구조 정의<BR>//showInfo 메소드 제공 및 이미지 정보 반환<BR>function GIF ( ){ <BR>this.version=""; //버전 번호<BR>this.width=0; //논리적 화면 너비<BR>this.height=0; //논리적 화면 높이<BR> colorResolution =0; //색상 깊이<BR>this.sorted=false; //전역 색상 테이블 분류 플래그<BR>this.globalPalette=null; //전역 색상 테이블<BR>this.BackgroundIndex=-1; 배경색 인덱스<BR>this.pixelAspectRadio=0; //픽셀 종횡비<BR>this.frames=[]; //이미지의 각 프레임은 GIF_Frame을 참조하세요. <BR>this.showInfo=function(sep){ //이미지 정보 표시, sep는 줄 구분 기호입니다. <BR>if(!sep) <br>sep="n" <br>var s="Gif infomation:" sep "--------- --- -------"; <BR>s =subInfo(this) sep; <BR>for(var i=0;i<this.frames.length;i ) <BR>s =sep " 프레임 " i "----------" subInfo(this.frames[i]); <BR>return s; <BR>function subInfo(o){ <BR>var s=""; <BR>for (var i in o){ <BR>if(i=="showInfo"||i=="draw") <BR>continue; <BR>s =sep i ":" <BR>if (typeof( o[i])=="객체") <BR>s =(o[i]?o[i].length:"null") <BR>else <BR>s =o[i] ; <BR>}<BR>return s; <BR>} <BR>} <BR>} <br><br>//이미지 프레임을 저장할 데이터 구조 정의<BR>//그리기, 그리기<BR>함수 메서드 제공 GIF_Frame (){ <BR>this.offsetX=0; //X방향 오프셋<BR>this.offsetY=0; //Y방향 오프셋<BR>this.width=0; this.height=0; //이미지 높이<BR>this.localPalette=null; //로컬 색상 테이블<BR>this.colorResolution=0; //색상 깊이<BR>this.interlace=false; <BR>this.sorted=false; //로컬 색상 테이블 분류 플래그<BR>this.data=[]; //각 픽셀 색상의 정수 인덱스를 저장하는 이미지 데이터<BR>this.transparentIndex=-1 ; /투명 색상 인덱스<BR>this.delay=0; //프레임 지연<BR>this.draw=function(parent,zoom){ <BR>if(!this.data.length) <BR>return ; >if(!parent) <BR>parent=document.body; <BR>if(!zoom) <BR>zoom=1 <BR>if(parent.clientWidth<this.width*zoom) <BR>parent. style.width=this.width*zoom; <BR>if(parent.clientHeight<this.height*zoom) <BR>parent.style.height=this.height*zoom; <BR>var id=" ImgDefaultDraw"; <BR>var img=document.getElementById(id); <BR>if(img) <BR>delete parent.removeChild(img); <BR>img=document.createElement("DIV"); id=id(<BR>parent.appendChild(img); <BR>img.style.position="absolute"; <BR>var t=document.createElement("DIV") <BR>t. ="숨겨짐"; <BR>t.style.position="absolute"; <BR>defLayout(this.data,this.localPalette,this.width,this.height,img,t,zoom); t; <BR>} <BR>} <BR>} <BR><BR>//Base64 디코딩<BR>//strIn, 입력 문자열 <BR>//배열을 성공적으로 반환합니다. 각 요소에는 1바이트의 정보가 포함됩니다. <br> // 실패 시 null을 반환합니다. <br>function decodeBase64(strIn){ <BR>if(!strIn.length||strIn.length%4) <BR>return null; <BR>var str64 = <BR> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /="; <BR>var index64=[]; <BR>for(var i=0;i<str64.length;i ) <BR>index64[str64.charAt(i)]= i; >var c0,c1,c2,c3,b0,b1,b2; <BR>var len=strIn.length; <BR>var len1=len <BR>if(strIn.charAt(len-1 )==' =') <BR>len1-=4; <BR>var result=[]; <BR>for(var i=0,j=0;i<len1;i =4){ <BR> c0=index64[ strIn.charAt(i)]; <BR>c1=index64[strIn.charAt(i 1)]; <BR>c2=index64[strIn.charAt(i 2)] <BR>c3=index64 (i 3)]; <BR>b0=(c0<<2)|(c1>>4) <BR>b1=(c1<<4)|(c2>>2 ); >b2=(c2<<6)|c3; <BR>result.push(b0&0xff); <BR>result.push(b1&0xff) <BR>result.push(b2&0xff) <BR> if(len1!=len){ <BR>c0=index64[strIn.charAt(i)]; <BR>c1=index64[strIn.charAt(i 1)] <BR>c2=strIn.charIn ); <BR>b0=(c0<<2)|(c1>>4) <br>result.push(b0&0xff) <br>if(c2!='='){ <br>c2 =index64[c2]; <br>b1=(c1<<4)|(c2>>2) <br>result.push(b1&0xff) <br>} <br>} <br>결과 반환 ; <br>} <br><br>//GIF용 LZW 디코딩 함수<br>//arrBytes는 소스 데이터이고, nBits는 비트의 초기 인코딩 수입니다.<br>//성공적으로 배열을 반환하며, 각 요소에는 다음이 포함됩니다. 색상 인덱스 <br> // 실패 시 null을 반환합니다. <br>function decodeLzw(arrBytes,nBits){ <br>var cc=1<<(nBits-1) <br>var eoi=cc 1; >var table=[],mask=[],result=[]; <br>for(var i=0;i<cc;i ) <BR>table[i]=(i>>8&0xf) .toString (16) <br> (i>>4&0xf).toString(16) (i&0xf).toString(16) <br>for(i=2,mask[1]=1;imask[i]=mask[i-1]<<1|1; <BR>var bc=nBits <BR>var pos=0,temp=0,tleft=0,code=0 ,old =0; <BR>while(true){ <BR>while(tleft<bc){ <BR>temp=temp|(arrBytes[pos ]<<tleft) <BR>tleft =8; } <BR>code=temp&mask[bc]; <BR>temp>>=bc; <br>if(code==eoi) <br>if(코드 ==cc){ <br>table.length=cc 2; <br>old=code <br>계속; if(code<table.length){ <BR>t=table[code]; <BR>if(old!=cc) <BR>table.push(table[old] t.slice(0,3) ); <BR>} <BR>else if(old<table.length){ <BR>t=table[old] 테이블[old].slice(0,3) <BR>table.push(t); >} <BR>else{ <BR>alert("오류: 잘못된 이미지 데이터"); <BR>return null; <BR>} <BR>old=code <BR>for(var i=0; i< t.length;i =3) <BR>result.push(parseInt(t.substr(i,3),16)) <BR>if(table.length==1<<bc&&bc<12) <BR> bc ; <BR>} <BR>return result; <BR>} <BR><BR>//바이트 배열 데이터 레이아웃에 따라 최소한의 div로 그림을 완성합니다.<BR>function defLayout(data,palette ,width ,height,image,block,zoom){ <BR>var map=new Array(height) <BR>for(var i=0;i<height;i ){ <BR>map[i]=new 배열(너비); <BR>for(var j=0;j<width;j ) <BR>map[i][j]=data[i*width j]; <BR>} <BR>var i, j, i1,i2,j1,j2,c; <BR>for(i=0;i<height;i ) <BR>for(j=0;j<width;){ <BR>if(map[i ][ j]==0x100){ <BR>j ; <BR>계속 <BR>} <br>c=map[i][j] <br>for(i1=i 1;i1<height&&map[ i1] [j]==c;i1 ); <BR>for(j1=j 1;j1<width;j1 ){ <BR>for(i2=i;i2<i1&&map[i2][j1]==c ;i2 ); <BR>if(i2<i1) <BR>휴식 <BR>}<BR>for(i2=i;i2<i1;i2 ) <BR>for(j2=j;j2<j1;j2 ) <BR>map[i2][j2]=0x100; <BR>var x=block.cloneNode(true); <BR>x.style.left=j*zoom; <BR>x.style.top=i*zoom; <BR>x.style.width=(j1-j)*확대/축소; <BR>x.style.height=(i1-i)*확대/축소; <BR>x.style.BackgroundColor=팔레트[c]; <BR>image.appendChild(x); <BR>j=j1; <BR>} <BR>} <BR></SCRIPT> <br><br><스크립트> <br>function main(){ <br>var t=new Date().getTime(); <br>var xmldom=document.getElementById("imgData"); <br>var gif=getGif("R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAO w=="); <br>var info=document.getElementById("info"); <br>info.innerHTML=gif.showInfo("<br>"); <br>t=new Date().getTime(); <br>gif.frames[0].draw(document.getElementById("canvas"),1); <br>info.innerHTML ="<br>绘图耗时" (new Date().getTime()-t) "ms"; <br>} <br></SCRIPT> <br><body onload="main()"> <br><div id="canvas"></div> <br> <br><div id="info">页side载入中,请稍候...</div> <br></body> <br></html> <br> </div>