Кода -копия выглядит следующим образом:
<! Doctype html public "-// w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<голова>
<meta http-equiv = "content-type" content = "text /html; charset = gb2312" />
<style>
Body {padding-left: 75px; фоновый цвет: бежевый}
</style>
<Скрипт>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////
// base64 кодированное GIF -изображение декодирование изображения
// от mozart0
// 2005/10/29
////////////////////////////////////////////
// Создать объект класса GIF
// класс GIF определяется внутри этой функции внутри
// str64: кодированная строка GIF -строка BASE64
// успешно вернул созданный объект GIF
// вернуть NULL, если не удалось
функция getGif (str64) {
var bytes = decodebase64 (str64);
if (! Bytes) {
Alert («Ошибка: неверное кодирование базы64»);
вернуть ноль;
}
var gif = new Gif ();
для (var i = 0; i <6; i ++)
gif.version+= string.fromCharcode (Bytes [i]);
if (gif.version.slice (0,3)! = "GIF") {
Alert («Ошибка: формат изображения без GIF»);
вернуть ноль;
}
gif.width = байты [i] | (байты [i+1] << 8);
gif.height = байты [i+2] | (байты [i+3] << 8);
var f = байты [i+4];
gif.colorresolution = (f >> 4 & 0x7) +1;
gif.sorted = (f & 0x8)? True: false;
Gif.backgroundIndex = байты [i+5];
Gif.pixelaspectradio = байты [i+6];
if (f & 0x80) {
gif.globalpalette = [];
i+= getPalette (i+7, байты, gif.globalpalette, 2 << (f & 0x7));
}
i+= 7;
для (var j = i; j <bytes.length; j ++)
if (bytes [j] == 0x21 && bytes [j+1] == 0xf9)
перерыв;
if (j == bytes.length) {
для (; i <bytes.length; i ++)
if (bytes [i] == 0x2c)
перерыв;
if (i == bytes.length) {
Alert («Ошибка: данные изображения не найдены»);
вернуть ноль;
}
var f = new Gif_frame ();
if (! etsingingframe (i, f))
вернуть ноль;
еще
gif.frames.push (f);
}
еще{
i = j;
делать{
var f = new Gif_frame ();
var t = getingingFrame (i, f);
if (! t)
вернуть ноль;
gif.frames.push (f);
для (i+= t; i <bytes.length; i ++)
if (bytes [i] == 0x21 && bytes [i+1] == 0xf9)
перерыв;
}
в то время как (я <bytes.length);
}
вернуть GIF;
// внутренний процесс, генерируйте цветовую таблицу
функция getPalette (POS, S, D, Len) {
Лен*= 3;
для (var i = pos; i <pos+len; i+= 3)
d.push ('#'+(s [i] <= 0xf? "0": "")+s [i] .toString (16)
+(s [i+1] <= 0xf? "0": "")+s [i+1] .toString (16)
+(s [i+2] <= 0xf? "0": "")+s [i+2] .toString (16));
вернуть Лен;
}
// внутренний процесс, интеграция сегментов данных
функция getBlock (pos, s, d) {
var p = pos;
while (len = s [p ++]) {
для (var i = 0; i <len; i ++)
D.push (s [p+i]);
P+= Len;
}
вернуть p-pos;
}
// внутренний процесс, получить кадр данных
Функция getSingFrame (pos, frame) {
var i = pos;
if (bytes [i] == 0x21) {
i+= 3;
if (байты [i] & 1)
frame.transparentindex = bytes [i+3];
frame.delay = bytes [i+1] | (байты [i+2] << 8);
for (i+= 5; i <bytes.length && bytes [i]! = 0x2c; i ++);
if (i == bytes.length) {
Alert («Ошибка: Идентификатор изображения не найден»);
возврат 0;
}
}
frame.offsetx = bytes [i+1] | (байты [i+2] << 8);
frame.offsety = bytes [i+3] | (байты [i+4] << 8);
frame.width = байты [i+5] | (байты [i+6] << 8);
frame.height = байты [i+7] | (байты [i+8] << 8);
var f = байты [i+9];
i+= 10;
if (f & 0x40)
Frame.Interlace = true;
if (f & 0x20)
Frame.sorted = true;
if (f & 0x80) {
frame.colorresolution = (f & 0x7) +1;
frame.localpalette = [];
i+= getPalette (i, Bytes, Frame.localpalette, 1 << Frame.colorResolution);
}
еще{
Frame.colorResolution = Gif.ColorResolution;
Frame.localpalette = Gif.globalpalette;
}
var lzwlen = bytes [i ++]+1;
i+= getBlock (i, Bytes, Frame.data);
frame.data = decodelzw (frame.data, lzwlen);
return frame.data?i-pos:0;
}
// Определите структуру данных для хранения файлов GIF
// предоставить метод Showinfo, вернуть информацию о изображении
функция gif () {
this.version = ""; // номер версии
this.width = 0; // Логическая ширина экрана
this.height = 0;
this.colorresolution = 0; // Глубина цвета
this.sorted = false;
this.globalpalette = null;
this.backgroundex = -1;
this.pixelaspectradio = 0; // соотношение сторон пикселя
this.frames = [];
this.showinfo = function (sep) {// Показать информацию об изображении, SEP - сепаратор линии
if (! sep)
sep = "/n";
var s = "GIF Информация:"+sep+"--------------------------------------- ------------------------------------------------------ -----------------------
s+= subinfo (this)+sep;
for (var i = 0; i <this.frames.length; i ++)
S+= Sep+"Кадры"+i+"------------------------------------------------- ------------------------------------------------------ ---------------------
возврат S;
функция subinfo (o) {
var s = "";
для (var i in o) {
if (i == "showinfo" || i == "Draw")
продолжать;
s+= sep+i+":";
if (typeof (o [i]) == "Object")
s+= (o [i]? O [i] .length: "null");
еще
s+= o [i];
}
возврат S;
}
}
}
// Определите структуру данных, в которой хранится кадр изображений
// предоставить метод рисовать, рисунок
Функция gif_frame () {
this.offsetx = 0;
this.offsety = 0;
this.width = 0; // Ширина изображения
this.height = 0; // Высота изображения
this.localpalette = null;
this.colorresolution = 0; // Глубина цвета
this.Interlace = false;
this.sorted = false;
this.data = [];
this.transparentindex = -1;
this.delay = 0; // задержка кадра
this.draw = function (родитель, Zoom) {
if (! this.data.length)
возвращаться;
if (! Родитель)
parent = document.body;
if (! Zoom)
Zoom = 1;
if (parent.clientwidth <this.width*Zoom)
parent.style.width = this.width*Zoom;
if (parent.clientHeight <this.height*Zoom)
parent.style.height = this.height*Zoom;
var id = "imgdefaultdraw";
var img = document.getElementbyId (id);
if (img)
Delete Parent.removechild (IMG);
img = document.createElement ("div");
img.id = id;
Parent.appendchild (IMG);
img.style.position = "Absolute";
var t = document.createElement ("div");
t.style.overflow = "hidden";
t.style.position = "Absolute";
deflayout (this.data, this.localpalette, this.width, this.height, img, t, Zoom);
Удалить t;
}
}
}
// Декодирование BASE64
// Снигать, введите строку
// успешное возвращение массива, каждый элемент содержит один байт информации
// вернуть NULL, если не удалось
Функция decodebase64 (Strin) {
if (! strin.length || strin.length%4)
вернуть ноль;
var str64 =
"Abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/=";
var index64 = [];
для (var i = 0; i <str64.length; i ++)
index64 [str64.Charat (i)] = i;
var C0, C1, C2, C3, B0, B1, B2;
var len = strin.length;
var len1 = len;
if (strin.charat (len-1) == '=')
len1- = 4;
var result = [];
for (var i = 0, j = 0; i <len1; i+= 4) {
c0 = index64 [strin.charat (i)];
c1 = index64 [strin.charat (i+1)];
c2 = index64 [strin.charat (i+2)];
c3 = index64 [strin.charat (i+3)];
b0 = (c0 << 2) | (C1 >> 4);
b1 = (c1 << 4) | (C2 >> 2);
B2 = (C2 << 6) | C3;
result.push (b0 & 0xff);
result.push (b1 & 0xff);
result.push (b2 & 0xff);
}
if (len1! = len) {
c0 = index64 [strin.charat (i)];
c1 = index64 [strin.charat (i+1)];
c2 = strin.charat (i+2);
b0 = (c0 << 2) | (C1 >> 4);
result.push (b0 & 0xff);
if (c2! = '=') {
c2 = index64 [c2];
b1 = (c1 << 4) | (C2 >> 2);
result.push (b1 & 0xff);
}
}
результат возврата;
}
// функция декодирования LZW для GIF
// arrbytes - это исходные данные, NBITS - это начальное количество кодированных битов
// успешно вернул массив, каждый элемент включает в себя индекс цвета
// вернуть NULL, если не удалось
Функция decodelzw (arrbytes, nbits) {
var cc = 1 << (nbits-1);
var eoi = cc+1;
var table = [], mask = [], result = [];
для (var i = 0; i <cc; i ++)
Таблица [i] = (i >> 8 & 0xf) .toString (16)
+(i >> 4 & 0xf) .toString (16)+(i & 0xf) .toString (16);
для (i = 2, маска [1] = 1; i <13; i ++)
Маска [i] = Маска [i-1] << 1 | 1;
var bc = nbits;
var pos = 0, temp = 0, tleft = 0, code = 0, old = 0;
while (true) {
while (tleft <bc) {
temp = temp | (arrbytes [pos ++] << tleft);
tleft+= 8;
}
Code = Temp & Mask [BC];
tleft- = bc;
TEMP >> = BC;
if (code == eoi)
перерыв;
if (code == cc) {
Table.length = cc+2;
bc = nbits;
Old = code;
продолжать;
}
var t = "";
if (code <table.length) {
t = таблица [code];
if (old! = cc)
table.push (таблица [старый]+t.slice (0,3));
}
иначе if (old <table.length) {
t = таблица [старая]+таблица [Old] .Slice (0,3);
Table.push (t);
}
еще{
Alert («Ошибка: неверные данные изображения»);
вернуть ноль;
}
Old = code;
для (var i = 0; i <t.length; i+= 3)
result.push (parseint (t.substr (i, 3), 16))
if (table.length == 1 << bc && bc <12)
BC ++;
}
результат возврата;
}
// рисовать с минимальным div в соответствии с макетом данных массива байтов
Функция Deflayout (данные, палитра, ширина, высота, изображение, блок, Zoom) {
var map = new Array (высота);
для (var i = 0; i <height; i ++) {
карта [i] = новый массив (ширина);
для (var j = 0; j <ширина; j ++)
карта [i] [j] = data [i*width+j];
}
var i, j, i1, i2, j1, j2, c;
для (i = 0; i <высота; i ++)
for (j = 0; j <ширина;) {
if (map [i] [j] == 0x100) {
J ++;
продолжать;
}
c = map [i] [j];
for (i1 = i+1; i1 <height && map [i1] [j] == c; i1 ++);
for (j1 = j+1; J1 <ширина; J1 ++) {
for (i2 = i; i2 <i1 && map [i2] [J1] == c; i2 ++);
if (i2 <i1)
перерыв;
}
для (i2 = i; i2 <i1; i2 ++)
для (j2 = j; J2 <J1; J2 ++)
карта [i2] [j2] = 0x100;
var x = block.clonenode (true);
x.style.left = j*Zoom;
x.style.top = i*Zoom;
x.style.width = (J1-J)*Zoom;
x.style.height = (i1-i)*Zoom;
x.style.backgroundcolor = palette [c];
image.appendchild (x);
J = J1;
}
}
</Script>
<Скрипт>
функция main () {
var t = new Date (). getTime ();
var xmldom = document.getElementById ("imgdata");
var gif=getGif("R0lGODlhDwAPAKECAAAAzMzM//////wAAACwAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltXp lZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==");
var info = document.getElementbyId ("info");
info.innerhtml = gif.showinfo ("<br>");
t = новая дата (). getTime ();
gif.frames [0] .draw (document.getElementByid ("canvas"), 1);
info.innerhtml+= "<br> время рисования"+(new date (). gettime ()-t)+"ms";
}
</Script>
<body onload = "main ()">
<div id = "canvas"> </div>
<hr>
<div id = "info"> страница загружается, подождите ... </div>
</body>
</html>
PS: Вот несколько онлайн -инструментов для вашей ссылки
Преобразование изображения в онлайн -инструмент кодирования Base64:
http://tools.vevb.com/transcoding/img2base64
Инструмент создания значков электронной почты онлайн:
http://tools.vevb.com/email/emaillogo
Онлайн инструмент обработки изображений PS:
http://tools.vevb.com/aideddesign/webps
Инструмент преобразования формата онлайн -картинки (JPG/BMP/GIF/PNG):
http://tools.vevb.com/aideddesign/picext
ICO ICO онлайн -генеральный инструмент:
http://tools.vevb.com/aiddesign/ico_img
Приложение: Кроме того, рекомендуется инструмент преобразования кодирования BASE64
Инструмент кодирования и декодирования BASE64:
http://tools.vevb.com/transcoding/base64