Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
寒墨茗殇
裁剪图片上传
提交
7b22a1a5
裁
裁剪图片上传
项目概览
寒墨茗殇
/
裁剪图片上传
与 Fork 源项目一致
Fork自
inscode / VueJS
通知
1
Star
3
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
裁
裁剪图片上传
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
7b22a1a5
编写于
11月 29, 2023
作者:
Q
qq_40591925
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Auto Commit
上级
1a162e8b
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
17 addition
and
2 deletion
+17
-2
src/components/cropperUpload/GIFJS/cropGifHandle.js
src/components/cropperUpload/GIFJS/cropGifHandle.js
+14
-2
src/components/cropperUpload/GIFJS/gif.worker.js
src/components/cropperUpload/GIFJS/gif.worker.js
+3
-0
未找到文件。
src/components/cropperUpload/GIFJS/cropGifHandle.js
浏览文件 @
7b22a1a5
...
@@ -2,7 +2,18 @@
...
@@ -2,7 +2,18 @@
import
GifToCanvas
from
'
../GIFJS/gifToCanvas.js
'
import
GifToCanvas
from
'
../GIFJS/gifToCanvas.js
'
// import GIF from "../GIFJS/GIF.js";
// import GIF from "../GIFJS/GIF.js";
import
GIF
from
"
gif.js
"
;
import
GIF
from
"
gif.js
"
;
const
cropGifHandle
=
(
cropperRef
,
file
,
cb
)
=>
{
const
fetchToBlodUrl
=
(
url
)
=>
{
return
new
Promise
((
r
)
=>
{
fetch
(
url
)
.
then
(
respone
=>
respone
.
blob
())
// 将响应体转换成blob格式数据
.
then
(
blob
=>
{
r
(
URL
.
createObjectURL
(
blob
))
})
.
catch
(()
=>
{
r
(
null
)});
})
}
const
workerScriptUrl
=
await
fetchToBlodUrl
(
'
./gif.worker.js
'
)
const
cropGifHandle
=
async
(
cropperRef
,
file
,
cb
)
=>
{
if
(
cropperRef
)
{
if
(
cropperRef
)
{
if
(
cb
)
cb
(
false
,
null
)
if
(
cb
)
cb
(
false
,
null
)
// vue-cropper 与 cropper.js 的api不同,进行转化
// vue-cropper 与 cropper.js 的api不同,进行转化
...
@@ -22,7 +33,8 @@ const cropGifHandle = (cropperRef, file, cb) => {
...
@@ -22,7 +33,8 @@ const cropGifHandle = (cropperRef, file, cb) => {
workers
:
1
,
workers
:
1
,
quality
:
2
,
quality
:
2
,
// gif.worker.js放到public 或者 网络地址
// gif.worker.js放到public 或者 网络地址
workerScript
:
`
${
window
.
location
.
origin
}
/gif.worker.js`
,
// workerScript: `${window.location.origin}/gif.worker.js`,
workerScript
:
workerScriptUrl
,
// transparent: 'rgba(0,0,0,0)',
// transparent: 'rgba(0,0,0,0)',
background
:
'
rgba(0,0,0,0)
'
background
:
'
rgba(0,0,0,0)
'
})
})
...
...
src/components/cropperUpload/GIFJS/gif.worker.js
0 → 100644
浏览文件 @
7b22a1a5
// gif.worker.js 0.2.0 - https://github.com/jnordberg/gif.js
(
function
e
(
t
,
n
,
r
){
function
s
(
o
,
u
){
if
(
!
n
[
o
]){
if
(
!
t
[
o
]){
var
a
=
typeof
require
==
"
function
"
&&
require
;
if
(
!
u
&&
a
)
return
a
(
o
,
!
0
);
if
(
i
)
return
i
(
o
,
!
0
);
var
f
=
new
Error
(
"
Cannot find module '
"
+
o
+
"
'
"
);
throw
f
.
code
=
"
MODULE_NOT_FOUND
"
,
f
}
var
l
=
n
[
o
]
=
{
exports
:{}};
t
[
o
][
0
].
call
(
l
.
exports
,
function
(
e
){
var
n
=
t
[
o
][
1
][
e
];
return
s
(
n
?
n
:
e
)},
l
,
l
.
exports
,
e
,
t
,
n
,
r
)}
return
n
[
o
].
exports
}
var
i
=
typeof
require
==
"
function
"
&&
require
;
for
(
var
o
=
0
;
o
<
r
.
length
;
o
++
)
s
(
r
[
o
]);
return
s
})({
1
:[
function
(
require
,
module
,
exports
){
var
NeuQuant
=
require
(
"
./TypedNeuQuant.js
"
);
var
LZWEncoder
=
require
(
"
./LZWEncoder.js
"
);
function
ByteArray
(){
this
.
page
=-
1
;
this
.
pages
=
[];
this
.
newPage
()}
ByteArray
.
pageSize
=
4096
;
ByteArray
.
charMap
=
{};
for
(
var
i
=
0
;
i
<
256
;
i
++
)
ByteArray
.
charMap
[
i
]
=
String
.
fromCharCode
(
i
);
ByteArray
.
prototype
.
newPage
=
function
(){
this
.
pages
[
++
this
.
page
]
=
new
Uint8Array
(
ByteArray
.
pageSize
);
this
.
cursor
=
0
};
ByteArray
.
prototype
.
getData
=
function
(){
var
rv
=
""
;
for
(
var
p
=
0
;
p
<
this
.
pages
.
length
;
p
++
){
for
(
var
i
=
0
;
i
<
ByteArray
.
pageSize
;
i
++
){
rv
+=
ByteArray
.
charMap
[
this
.
pages
[
p
][
i
]]}}
return
rv
};
ByteArray
.
prototype
.
writeByte
=
function
(
val
){
if
(
this
.
cursor
>=
ByteArray
.
pageSize
)
this
.
newPage
();
this
.
pages
[
this
.
page
][
this
.
cursor
++
]
=
val
};
ByteArray
.
prototype
.
writeUTFBytes
=
function
(
string
){
for
(
var
l
=
string
.
length
,
i
=
0
;
i
<
l
;
i
++
)
this
.
writeByte
(
string
.
charCodeAt
(
i
))};
ByteArray
.
prototype
.
writeBytes
=
function
(
array
,
offset
,
length
){
for
(
var
l
=
length
||
array
.
length
,
i
=
offset
||
0
;
i
<
l
;
i
++
)
this
.
writeByte
(
array
[
i
])};
function
GIFEncoder
(
width
,
height
){
this
.
width
=~~
width
;
this
.
height
=~~
height
;
this
.
transparent
=
null
;
this
.
transIndex
=
0
;
this
.
repeat
=-
1
;
this
.
delay
=
0
;
this
.
image
=
null
;
this
.
pixels
=
null
;
this
.
indexedPixels
=
null
;
this
.
colorDepth
=
null
;
this
.
colorTab
=
null
;
this
.
neuQuant
=
null
;
this
.
usedEntry
=
new
Array
;
this
.
palSize
=
7
;
this
.
dispose
=-
1
;
this
.
firstFrame
=
true
;
this
.
sample
=
10
;
this
.
dither
=
false
;
this
.
globalPalette
=
false
;
this
.
out
=
new
ByteArray
}
GIFEncoder
.
prototype
.
setDelay
=
function
(
milliseconds
){
this
.
delay
=
Math
.
round
(
milliseconds
/
10
)};
GIFEncoder
.
prototype
.
setFrameRate
=
function
(
fps
){
this
.
delay
=
Math
.
round
(
100
/
fps
)};
GIFEncoder
.
prototype
.
setDispose
=
function
(
disposalCode
){
if
(
disposalCode
>=
0
)
this
.
dispose
=
disposalCode
};
GIFEncoder
.
prototype
.
setRepeat
=
function
(
repeat
){
this
.
repeat
=
repeat
};
GIFEncoder
.
prototype
.
setTransparent
=
function
(
color
){
this
.
transparent
=
color
};
GIFEncoder
.
prototype
.
addFrame
=
function
(
imageData
){
this
.
image
=
imageData
;
this
.
colorTab
=
this
.
globalPalette
&&
this
.
globalPalette
.
slice
?
this
.
globalPalette
:
null
;
this
.
getImagePixels
();
this
.
analyzePixels
();
if
(
this
.
globalPalette
===
true
)
this
.
globalPalette
=
this
.
colorTab
;
if
(
this
.
firstFrame
){
this
.
writeLSD
();
this
.
writePalette
();
if
(
this
.
repeat
>=
0
){
this
.
writeNetscapeExt
()}}
this
.
writeGraphicCtrlExt
();
this
.
writeImageDesc
();
if
(
!
this
.
firstFrame
&&!
this
.
globalPalette
)
this
.
writePalette
();
this
.
writePixels
();
this
.
firstFrame
=
false
};
GIFEncoder
.
prototype
.
finish
=
function
(){
this
.
out
.
writeByte
(
59
)};
GIFEncoder
.
prototype
.
setQuality
=
function
(
quality
){
if
(
quality
<
1
)
quality
=
1
;
this
.
sample
=
quality
};
GIFEncoder
.
prototype
.
setDither
=
function
(
dither
){
if
(
dither
===
true
)
dither
=
"
FloydSteinberg
"
;
this
.
dither
=
dither
};
GIFEncoder
.
prototype
.
setGlobalPalette
=
function
(
palette
){
this
.
globalPalette
=
palette
};
GIFEncoder
.
prototype
.
getGlobalPalette
=
function
(){
return
this
.
globalPalette
&&
this
.
globalPalette
.
slice
&&
this
.
globalPalette
.
slice
(
0
)
||
this
.
globalPalette
};
GIFEncoder
.
prototype
.
writeHeader
=
function
(){
this
.
out
.
writeUTFBytes
(
"
GIF89a
"
)};
GIFEncoder
.
prototype
.
analyzePixels
=
function
(){
if
(
!
this
.
colorTab
){
this
.
neuQuant
=
new
NeuQuant
(
this
.
pixels
,
this
.
sample
);
this
.
neuQuant
.
buildColormap
();
this
.
colorTab
=
this
.
neuQuant
.
getColormap
()}
if
(
this
.
dither
){
this
.
ditherPixels
(
this
.
dither
.
replace
(
"
-serpentine
"
,
""
),
this
.
dither
.
match
(
/-serpentine/
)
!==
null
)}
else
{
this
.
indexPixels
()}
this
.
pixels
=
null
;
this
.
colorDepth
=
8
;
this
.
palSize
=
7
;
if
(
this
.
transparent
!==
null
){
this
.
transIndex
=
this
.
findClosest
(
this
.
transparent
,
true
)}};
GIFEncoder
.
prototype
.
indexPixels
=
function
(
imgq
){
var
nPix
=
this
.
pixels
.
length
/
3
;
this
.
indexedPixels
=
new
Uint8Array
(
nPix
);
var
k
=
0
;
for
(
var
j
=
0
;
j
<
nPix
;
j
++
){
var
index
=
this
.
findClosestRGB
(
this
.
pixels
[
k
++
]
&
255
,
this
.
pixels
[
k
++
]
&
255
,
this
.
pixels
[
k
++
]
&
255
);
this
.
usedEntry
[
index
]
=
true
;
this
.
indexedPixels
[
j
]
=
index
}};
GIFEncoder
.
prototype
.
ditherPixels
=
function
(
kernel
,
serpentine
){
var
kernels
=
{
FalseFloydSteinberg
:[[
3
/
8
,
1
,
0
],[
3
/
8
,
0
,
1
],[
2
/
8
,
1
,
1
]],
FloydSteinberg
:[[
7
/
16
,
1
,
0
],[
3
/
16
,
-
1
,
1
],[
5
/
16
,
0
,
1
],[
1
/
16
,
1
,
1
]],
Stucki
:[[
8
/
42
,
1
,
0
],[
4
/
42
,
2
,
0
],[
2
/
42
,
-
2
,
1
],[
4
/
42
,
-
1
,
1
],[
8
/
42
,
0
,
1
],[
4
/
42
,
1
,
1
],[
2
/
42
,
2
,
1
],[
1
/
42
,
-
2
,
2
],[
2
/
42
,
-
1
,
2
],[
4
/
42
,
0
,
2
],[
2
/
42
,
1
,
2
],[
1
/
42
,
2
,
2
]],
Atkinson
:[[
1
/
8
,
1
,
0
],[
1
/
8
,
2
,
0
],[
1
/
8
,
-
1
,
1
],[
1
/
8
,
0
,
1
],[
1
/
8
,
1
,
1
],[
1
/
8
,
0
,
2
]]};
if
(
!
kernel
||!
kernels
[
kernel
]){
throw
"
Unknown dithering kernel:
"
+
kernel
}
var
ds
=
kernels
[
kernel
];
var
index
=
0
,
height
=
this
.
height
,
width
=
this
.
width
,
data
=
this
.
pixels
;
var
direction
=
serpentine
?
-
1
:
1
;
this
.
indexedPixels
=
new
Uint8Array
(
this
.
pixels
.
length
/
3
);
for
(
var
y
=
0
;
y
<
height
;
y
++
){
if
(
serpentine
)
direction
=
direction
*-
1
;
for
(
var
x
=
direction
==
1
?
0
:
width
-
1
,
xend
=
direction
==
1
?
width
:
0
;
x
!==
xend
;
x
+=
direction
){
index
=
y
*
width
+
x
;
var
idx
=
index
*
3
;
var
r1
=
data
[
idx
];
var
g1
=
data
[
idx
+
1
];
var
b1
=
data
[
idx
+
2
];
idx
=
this
.
findClosestRGB
(
r1
,
g1
,
b1
);
this
.
usedEntry
[
idx
]
=
true
;
this
.
indexedPixels
[
index
]
=
idx
;
idx
*=
3
;
var
r2
=
this
.
colorTab
[
idx
];
var
g2
=
this
.
colorTab
[
idx
+
1
];
var
b2
=
this
.
colorTab
[
idx
+
2
];
var
er
=
r1
-
r2
;
var
eg
=
g1
-
g2
;
var
eb
=
b1
-
b2
;
for
(
var
i
=
direction
==
1
?
0
:
ds
.
length
-
1
,
end
=
direction
==
1
?
ds
.
length
:
0
;
i
!==
end
;
i
+=
direction
){
var
x1
=
ds
[
i
][
1
];
var
y1
=
ds
[
i
][
2
];
if
(
x1
+
x
>=
0
&&
x1
+
x
<
width
&&
y1
+
y
>=
0
&&
y1
+
y
<
height
){
var
d
=
ds
[
i
][
0
];
idx
=
index
+
x1
+
y1
*
width
;
idx
*=
3
;
data
[
idx
]
=
Math
.
max
(
0
,
Math
.
min
(
255
,
data
[
idx
]
+
er
*
d
));
data
[
idx
+
1
]
=
Math
.
max
(
0
,
Math
.
min
(
255
,
data
[
idx
+
1
]
+
eg
*
d
));
data
[
idx
+
2
]
=
Math
.
max
(
0
,
Math
.
min
(
255
,
data
[
idx
+
2
]
+
eb
*
d
))}}}}};
GIFEncoder
.
prototype
.
findClosest
=
function
(
c
,
used
){
return
this
.
findClosestRGB
((
c
&
16711680
)
>>
16
,(
c
&
65280
)
>>
8
,
c
&
255
,
used
)};
GIFEncoder
.
prototype
.
findClosestRGB
=
function
(
r
,
g
,
b
,
used
){
if
(
this
.
colorTab
===
null
)
return
-
1
;
if
(
this
.
neuQuant
&&!
used
){
return
this
.
neuQuant
.
lookupRGB
(
r
,
g
,
b
)}
var
c
=
b
|
g
<<
8
|
r
<<
16
;
var
minpos
=
0
;
var
dmin
=
256
*
256
*
256
;
var
len
=
this
.
colorTab
.
length
;
for
(
var
i
=
0
,
index
=
0
;
i
<
len
;
index
++
){
var
dr
=
r
-
(
this
.
colorTab
[
i
++
]
&
255
);
var
dg
=
g
-
(
this
.
colorTab
[
i
++
]
&
255
);
var
db
=
b
-
(
this
.
colorTab
[
i
++
]
&
255
);
var
d
=
dr
*
dr
+
dg
*
dg
+
db
*
db
;
if
((
!
used
||
this
.
usedEntry
[
index
])
&&
d
<
dmin
){
dmin
=
d
;
minpos
=
index
}}
return
minpos
};
GIFEncoder
.
prototype
.
getImagePixels
=
function
(){
var
w
=
this
.
width
;
var
h
=
this
.
height
;
this
.
pixels
=
new
Uint8Array
(
w
*
h
*
3
);
var
data
=
this
.
image
;
var
srcPos
=
0
;
var
count
=
0
;
for
(
var
i
=
0
;
i
<
h
;
i
++
){
for
(
var
j
=
0
;
j
<
w
;
j
++
){
this
.
pixels
[
count
++
]
=
data
[
srcPos
++
];
this
.
pixels
[
count
++
]
=
data
[
srcPos
++
];
this
.
pixels
[
count
++
]
=
data
[
srcPos
++
];
srcPos
++
}}};
GIFEncoder
.
prototype
.
writeGraphicCtrlExt
=
function
(){
this
.
out
.
writeByte
(
33
);
this
.
out
.
writeByte
(
249
);
this
.
out
.
writeByte
(
4
);
var
transp
,
disp
;
if
(
this
.
transparent
===
null
){
transp
=
0
;
disp
=
0
}
else
{
transp
=
1
;
disp
=
2
}
if
(
this
.
dispose
>=
0
){
disp
=
dispose
&
7
}
disp
<<=
2
;
this
.
out
.
writeByte
(
0
|
disp
|
0
|
transp
);
this
.
writeShort
(
this
.
delay
);
this
.
out
.
writeByte
(
this
.
transIndex
);
this
.
out
.
writeByte
(
0
)};
GIFEncoder
.
prototype
.
writeImageDesc
=
function
(){
this
.
out
.
writeByte
(
44
);
this
.
writeShort
(
0
);
this
.
writeShort
(
0
);
this
.
writeShort
(
this
.
width
);
this
.
writeShort
(
this
.
height
);
if
(
this
.
firstFrame
||
this
.
globalPalette
){
this
.
out
.
writeByte
(
0
)}
else
{
this
.
out
.
writeByte
(
128
|
0
|
0
|
0
|
this
.
palSize
)}};
GIFEncoder
.
prototype
.
writeLSD
=
function
(){
this
.
writeShort
(
this
.
width
);
this
.
writeShort
(
this
.
height
);
this
.
out
.
writeByte
(
128
|
112
|
0
|
this
.
palSize
);
this
.
out
.
writeByte
(
0
);
this
.
out
.
writeByte
(
0
)};
GIFEncoder
.
prototype
.
writeNetscapeExt
=
function
(){
this
.
out
.
writeByte
(
33
);
this
.
out
.
writeByte
(
255
);
this
.
out
.
writeByte
(
11
);
this
.
out
.
writeUTFBytes
(
"
NETSCAPE2.0
"
);
this
.
out
.
writeByte
(
3
);
this
.
out
.
writeByte
(
1
);
this
.
writeShort
(
this
.
repeat
);
this
.
out
.
writeByte
(
0
)};
GIFEncoder
.
prototype
.
writePalette
=
function
(){
this
.
out
.
writeBytes
(
this
.
colorTab
);
var
n
=
3
*
256
-
this
.
colorTab
.
length
;
for
(
var
i
=
0
;
i
<
n
;
i
++
)
this
.
out
.
writeByte
(
0
)};
GIFEncoder
.
prototype
.
writeShort
=
function
(
pValue
){
this
.
out
.
writeByte
(
pValue
&
255
);
this
.
out
.
writeByte
(
pValue
>>
8
&
255
)};
GIFEncoder
.
prototype
.
writePixels
=
function
(){
var
enc
=
new
LZWEncoder
(
this
.
width
,
this
.
height
,
this
.
indexedPixels
,
this
.
colorDepth
);
enc
.
encode
(
this
.
out
)};
GIFEncoder
.
prototype
.
stream
=
function
(){
return
this
.
out
};
module
.
exports
=
GIFEncoder
},{
"
./LZWEncoder.js
"
:
2
,
"
./TypedNeuQuant.js
"
:
3
}],
2
:[
function
(
require
,
module
,
exports
){
var
EOF
=-
1
;
var
BITS
=
12
;
var
HSIZE
=
5003
;
var
masks
=
[
0
,
1
,
3
,
7
,
15
,
31
,
63
,
127
,
255
,
511
,
1023
,
2047
,
4095
,
8191
,
16383
,
32767
,
65535
];
function
LZWEncoder
(
width
,
height
,
pixels
,
colorDepth
){
var
initCodeSize
=
Math
.
max
(
2
,
colorDepth
);
var
accum
=
new
Uint8Array
(
256
);
var
htab
=
new
Int32Array
(
HSIZE
);
var
codetab
=
new
Int32Array
(
HSIZE
);
var
cur_accum
,
cur_bits
=
0
;
var
a_count
;
var
free_ent
=
0
;
var
maxcode
;
var
clear_flg
=
false
;
var
g_init_bits
,
ClearCode
,
EOFCode
;
function
char_out
(
c
,
outs
){
accum
[
a_count
++
]
=
c
;
if
(
a_count
>=
254
)
flush_char
(
outs
)}
function
cl_block
(
outs
){
cl_hash
(
HSIZE
);
free_ent
=
ClearCode
+
2
;
clear_flg
=
true
;
output
(
ClearCode
,
outs
)}
function
cl_hash
(
hsize
){
for
(
var
i
=
0
;
i
<
hsize
;
++
i
)
htab
[
i
]
=-
1
}
function
compress
(
init_bits
,
outs
){
var
fcode
,
c
,
i
,
ent
,
disp
,
hsize_reg
,
hshift
;
g_init_bits
=
init_bits
;
clear_flg
=
false
;
n_bits
=
g_init_bits
;
maxcode
=
MAXCODE
(
n_bits
);
ClearCode
=
1
<<
init_bits
-
1
;
EOFCode
=
ClearCode
+
1
;
free_ent
=
ClearCode
+
2
;
a_count
=
0
;
ent
=
nextPixel
();
hshift
=
0
;
for
(
fcode
=
HSIZE
;
fcode
<
65536
;
fcode
*=
2
)
++
hshift
;
hshift
=
8
-
hshift
;
hsize_reg
=
HSIZE
;
cl_hash
(
hsize_reg
);
output
(
ClearCode
,
outs
);
outer_loop
:
while
((
c
=
nextPixel
())
!=
EOF
){
fcode
=
(
c
<<
BITS
)
+
ent
;
i
=
c
<<
hshift
^
ent
;
if
(
htab
[
i
]
===
fcode
){
ent
=
codetab
[
i
];
continue
}
else
if
(
htab
[
i
]
>=
0
){
disp
=
hsize_reg
-
i
;
if
(
i
===
0
)
disp
=
1
;
do
{
if
((
i
-=
disp
)
<
0
)
i
+=
hsize_reg
;
if
(
htab
[
i
]
===
fcode
){
ent
=
codetab
[
i
];
continue
outer_loop
}}
while
(
htab
[
i
]
>=
0
)}
output
(
ent
,
outs
);
ent
=
c
;
if
(
free_ent
<
1
<<
BITS
){
codetab
[
i
]
=
free_ent
++
;
htab
[
i
]
=
fcode
}
else
{
cl_block
(
outs
)}}
output
(
ent
,
outs
);
output
(
EOFCode
,
outs
)}
function
encode
(
outs
){
outs
.
writeByte
(
initCodeSize
);
remaining
=
width
*
height
;
curPixel
=
0
;
compress
(
initCodeSize
+
1
,
outs
);
outs
.
writeByte
(
0
)}
function
flush_char
(
outs
){
if
(
a_count
>
0
){
outs
.
writeByte
(
a_count
);
outs
.
writeBytes
(
accum
,
0
,
a_count
);
a_count
=
0
}}
function
MAXCODE
(
n_bits
){
return
(
1
<<
n_bits
)
-
1
}
function
nextPixel
(){
if
(
remaining
===
0
)
return
EOF
;
--
remaining
;
var
pix
=
pixels
[
curPixel
++
];
return
pix
&
255
}
function
output
(
code
,
outs
){
cur_accum
&=
masks
[
cur_bits
];
if
(
cur_bits
>
0
)
cur_accum
|=
code
<<
cur_bits
;
else
cur_accum
=
code
;
cur_bits
+=
n_bits
;
while
(
cur_bits
>=
8
){
char_out
(
cur_accum
&
255
,
outs
);
cur_accum
>>=
8
;
cur_bits
-=
8
}
if
(
free_ent
>
maxcode
||
clear_flg
){
if
(
clear_flg
){
maxcode
=
MAXCODE
(
n_bits
=
g_init_bits
);
clear_flg
=
false
}
else
{
++
n_bits
;
if
(
n_bits
==
BITS
)
maxcode
=
1
<<
BITS
;
else
maxcode
=
MAXCODE
(
n_bits
)}}
if
(
code
==
EOFCode
){
while
(
cur_bits
>
0
){
char_out
(
cur_accum
&
255
,
outs
);
cur_accum
>>=
8
;
cur_bits
-=
8
}
flush_char
(
outs
)}}
this
.
encode
=
encode
}
module
.
exports
=
LZWEncoder
},{}],
3
:[
function
(
require
,
module
,
exports
){
var
ncycles
=
100
;
var
netsize
=
256
;
var
maxnetpos
=
netsize
-
1
;
var
netbiasshift
=
4
;
var
intbiasshift
=
16
;
var
intbias
=
1
<<
intbiasshift
;
var
gammashift
=
10
;
var
gamma
=
1
<<
gammashift
;
var
betashift
=
10
;
var
beta
=
intbias
>>
betashift
;
var
betagamma
=
intbias
<<
gammashift
-
betashift
;
var
initrad
=
netsize
>>
3
;
var
radiusbiasshift
=
6
;
var
radiusbias
=
1
<<
radiusbiasshift
;
var
initradius
=
initrad
*
radiusbias
;
var
radiusdec
=
30
;
var
alphabiasshift
=
10
;
var
initalpha
=
1
<<
alphabiasshift
;
var
alphadec
;
var
radbiasshift
=
8
;
var
radbias
=
1
<<
radbiasshift
;
var
alpharadbshift
=
alphabiasshift
+
radbiasshift
;
var
alpharadbias
=
1
<<
alpharadbshift
;
var
prime1
=
499
;
var
prime2
=
491
;
var
prime3
=
487
;
var
prime4
=
503
;
var
minpicturebytes
=
3
*
prime4
;
function
NeuQuant
(
pixels
,
samplefac
){
var
network
;
var
netindex
;
var
bias
;
var
freq
;
var
radpower
;
function
init
(){
network
=
[];
netindex
=
new
Int32Array
(
256
);
bias
=
new
Int32Array
(
netsize
);
freq
=
new
Int32Array
(
netsize
);
radpower
=
new
Int32Array
(
netsize
>>
3
);
var
i
,
v
;
for
(
i
=
0
;
i
<
netsize
;
i
++
){
v
=
(
i
<<
netbiasshift
+
8
)
/
netsize
;
network
[
i
]
=
new
Float64Array
([
v
,
v
,
v
,
0
]);
freq
[
i
]
=
intbias
/
netsize
;
bias
[
i
]
=
0
}}
function
unbiasnet
(){
for
(
var
i
=
0
;
i
<
netsize
;
i
++
){
network
[
i
][
0
]
>>=
netbiasshift
;
network
[
i
][
1
]
>>=
netbiasshift
;
network
[
i
][
2
]
>>=
netbiasshift
;
network
[
i
][
3
]
=
i
}}
function
altersingle
(
alpha
,
i
,
b
,
g
,
r
){
network
[
i
][
0
]
-=
alpha
*
(
network
[
i
][
0
]
-
b
)
/
initalpha
;
network
[
i
][
1
]
-=
alpha
*
(
network
[
i
][
1
]
-
g
)
/
initalpha
;
network
[
i
][
2
]
-=
alpha
*
(
network
[
i
][
2
]
-
r
)
/
initalpha
}
function
alterneigh
(
radius
,
i
,
b
,
g
,
r
){
var
lo
=
Math
.
abs
(
i
-
radius
);
var
hi
=
Math
.
min
(
i
+
radius
,
netsize
);
var
j
=
i
+
1
;
var
k
=
i
-
1
;
var
m
=
1
;
var
p
,
a
;
while
(
j
<
hi
||
k
>
lo
){
a
=
radpower
[
m
++
];
if
(
j
<
hi
){
p
=
network
[
j
++
];
p
[
0
]
-=
a
*
(
p
[
0
]
-
b
)
/
alpharadbias
;
p
[
1
]
-=
a
*
(
p
[
1
]
-
g
)
/
alpharadbias
;
p
[
2
]
-=
a
*
(
p
[
2
]
-
r
)
/
alpharadbias
}
if
(
k
>
lo
){
p
=
network
[
k
--
];
p
[
0
]
-=
a
*
(
p
[
0
]
-
b
)
/
alpharadbias
;
p
[
1
]
-=
a
*
(
p
[
1
]
-
g
)
/
alpharadbias
;
p
[
2
]
-=
a
*
(
p
[
2
]
-
r
)
/
alpharadbias
}}}
function
contest
(
b
,
g
,
r
){
var
bestd
=~
(
1
<<
31
);
var
bestbiasd
=
bestd
;
var
bestpos
=-
1
;
var
bestbiaspos
=
bestpos
;
var
i
,
n
,
dist
,
biasdist
,
betafreq
;
for
(
i
=
0
;
i
<
netsize
;
i
++
){
n
=
network
[
i
];
dist
=
Math
.
abs
(
n
[
0
]
-
b
)
+
Math
.
abs
(
n
[
1
]
-
g
)
+
Math
.
abs
(
n
[
2
]
-
r
);
if
(
dist
<
bestd
){
bestd
=
dist
;
bestpos
=
i
}
biasdist
=
dist
-
(
bias
[
i
]
>>
intbiasshift
-
netbiasshift
);
if
(
biasdist
<
bestbiasd
){
bestbiasd
=
biasdist
;
bestbiaspos
=
i
}
betafreq
=
freq
[
i
]
>>
betashift
;
freq
[
i
]
-=
betafreq
;
bias
[
i
]
+=
betafreq
<<
gammashift
}
freq
[
bestpos
]
+=
beta
;
bias
[
bestpos
]
-=
betagamma
;
return
bestbiaspos
}
function
inxbuild
(){
var
i
,
j
,
p
,
q
,
smallpos
,
smallval
,
previouscol
=
0
,
startpos
=
0
;
for
(
i
=
0
;
i
<
netsize
;
i
++
){
p
=
network
[
i
];
smallpos
=
i
;
smallval
=
p
[
1
];
for
(
j
=
i
+
1
;
j
<
netsize
;
j
++
){
q
=
network
[
j
];
if
(
q
[
1
]
<
smallval
){
smallpos
=
j
;
smallval
=
q
[
1
]}}
q
=
network
[
smallpos
];
if
(
i
!=
smallpos
){
j
=
q
[
0
];
q
[
0
]
=
p
[
0
];
p
[
0
]
=
j
;
j
=
q
[
1
];
q
[
1
]
=
p
[
1
];
p
[
1
]
=
j
;
j
=
q
[
2
];
q
[
2
]
=
p
[
2
];
p
[
2
]
=
j
;
j
=
q
[
3
];
q
[
3
]
=
p
[
3
];
p
[
3
]
=
j
}
if
(
smallval
!=
previouscol
){
netindex
[
previouscol
]
=
startpos
+
i
>>
1
;
for
(
j
=
previouscol
+
1
;
j
<
smallval
;
j
++
)
netindex
[
j
]
=
i
;
previouscol
=
smallval
;
startpos
=
i
}}
netindex
[
previouscol
]
=
startpos
+
maxnetpos
>>
1
;
for
(
j
=
previouscol
+
1
;
j
<
256
;
j
++
)
netindex
[
j
]
=
maxnetpos
}
function
inxsearch
(
b
,
g
,
r
){
var
a
,
p
,
dist
;
var
bestd
=
1
e3
;
var
best
=-
1
;
var
i
=
netindex
[
g
];
var
j
=
i
-
1
;
while
(
i
<
netsize
||
j
>=
0
){
if
(
i
<
netsize
){
p
=
network
[
i
];
dist
=
p
[
1
]
-
g
;
if
(
dist
>=
bestd
)
i
=
netsize
;
else
{
i
++
;
if
(
dist
<
0
)
dist
=-
dist
;
a
=
p
[
0
]
-
b
;
if
(
a
<
0
)
a
=-
a
;
dist
+=
a
;
if
(
dist
<
bestd
){
a
=
p
[
2
]
-
r
;
if
(
a
<
0
)
a
=-
a
;
dist
+=
a
;
if
(
dist
<
bestd
){
bestd
=
dist
;
best
=
p
[
3
]}}}}
if
(
j
>=
0
){
p
=
network
[
j
];
dist
=
g
-
p
[
1
];
if
(
dist
>=
bestd
)
j
=-
1
;
else
{
j
--
;
if
(
dist
<
0
)
dist
=-
dist
;
a
=
p
[
0
]
-
b
;
if
(
a
<
0
)
a
=-
a
;
dist
+=
a
;
if
(
dist
<
bestd
){
a
=
p
[
2
]
-
r
;
if
(
a
<
0
)
a
=-
a
;
dist
+=
a
;
if
(
dist
<
bestd
){
bestd
=
dist
;
best
=
p
[
3
]}}}}}
return
best
}
function
learn
(){
var
i
;
var
lengthcount
=
pixels
.
length
;
var
alphadec
=
30
+
(
samplefac
-
1
)
/
3
;
var
samplepixels
=
lengthcount
/
(
3
*
samplefac
);
var
delta
=~~
(
samplepixels
/
ncycles
);
var
alpha
=
initalpha
;
var
radius
=
initradius
;
var
rad
=
radius
>>
radiusbiasshift
;
if
(
rad
<=
1
)
rad
=
0
;
for
(
i
=
0
;
i
<
rad
;
i
++
)
radpower
[
i
]
=
alpha
*
((
rad
*
rad
-
i
*
i
)
*
radbias
/
(
rad
*
rad
));
var
step
;
if
(
lengthcount
<
minpicturebytes
){
samplefac
=
1
;
step
=
3
}
else
if
(
lengthcount
%
prime1
!==
0
){
step
=
3
*
prime1
}
else
if
(
lengthcount
%
prime2
!==
0
){
step
=
3
*
prime2
}
else
if
(
lengthcount
%
prime3
!==
0
){
step
=
3
*
prime3
}
else
{
step
=
3
*
prime4
}
var
b
,
g
,
r
,
j
;
var
pix
=
0
;
i
=
0
;
while
(
i
<
samplepixels
){
b
=
(
pixels
[
pix
]
&
255
)
<<
netbiasshift
;
g
=
(
pixels
[
pix
+
1
]
&
255
)
<<
netbiasshift
;
r
=
(
pixels
[
pix
+
2
]
&
255
)
<<
netbiasshift
;
j
=
contest
(
b
,
g
,
r
);
altersingle
(
alpha
,
j
,
b
,
g
,
r
);
if
(
rad
!==
0
)
alterneigh
(
rad
,
j
,
b
,
g
,
r
);
pix
+=
step
;
if
(
pix
>=
lengthcount
)
pix
-=
lengthcount
;
i
++
;
if
(
delta
===
0
)
delta
=
1
;
if
(
i
%
delta
===
0
){
alpha
-=
alpha
/
alphadec
;
radius
-=
radius
/
radiusdec
;
rad
=
radius
>>
radiusbiasshift
;
if
(
rad
<=
1
)
rad
=
0
;
for
(
j
=
0
;
j
<
rad
;
j
++
)
radpower
[
j
]
=
alpha
*
((
rad
*
rad
-
j
*
j
)
*
radbias
/
(
rad
*
rad
))}}}
function
buildColormap
(){
init
();
learn
();
unbiasnet
();
inxbuild
()}
this
.
buildColormap
=
buildColormap
;
function
getColormap
(){
var
map
=
[];
var
index
=
[];
for
(
var
i
=
0
;
i
<
netsize
;
i
++
)
index
[
network
[
i
][
3
]]
=
i
;
var
k
=
0
;
for
(
var
l
=
0
;
l
<
netsize
;
l
++
){
var
j
=
index
[
l
];
map
[
k
++
]
=
network
[
j
][
0
];
map
[
k
++
]
=
network
[
j
][
1
];
map
[
k
++
]
=
network
[
j
][
2
]}
return
map
}
this
.
getColormap
=
getColormap
;
this
.
lookupRGB
=
inxsearch
}
module
.
exports
=
NeuQuant
},{}],
4
:[
function
(
require
,
module
,
exports
){
var
GIFEncoder
,
renderFrame
;
GIFEncoder
=
require
(
"
./GIFEncoder.js
"
);
renderFrame
=
function
(
frame
){
var
encoder
,
page
,
stream
,
transfer
;
encoder
=
new
GIFEncoder
(
frame
.
width
,
frame
.
height
);
if
(
frame
.
index
===
0
){
encoder
.
writeHeader
()}
else
{
encoder
.
firstFrame
=
false
}
encoder
.
setTransparent
(
frame
.
transparent
);
encoder
.
setRepeat
(
frame
.
repeat
);
encoder
.
setDelay
(
frame
.
delay
);
encoder
.
setQuality
(
frame
.
quality
);
encoder
.
setDither
(
frame
.
dither
);
encoder
.
setGlobalPalette
(
frame
.
globalPalette
);
encoder
.
addFrame
(
frame
.
data
);
if
(
frame
.
last
){
encoder
.
finish
()}
if
(
frame
.
globalPalette
===
true
){
frame
.
globalPalette
=
encoder
.
getGlobalPalette
()}
stream
=
encoder
.
stream
();
frame
.
data
=
stream
.
pages
;
frame
.
cursor
=
stream
.
cursor
;
frame
.
pageSize
=
stream
.
constructor
.
pageSize
;
if
(
frame
.
canTransfer
){
transfer
=
function
(){
var
i
,
len
,
ref
,
results
;
ref
=
frame
.
data
;
results
=
[];
for
(
i
=
0
,
len
=
ref
.
length
;
i
<
len
;
i
++
){
page
=
ref
[
i
];
results
.
push
(
page
.
buffer
)}
return
results
}();
return
self
.
postMessage
(
frame
,
transfer
)}
else
{
return
self
.
postMessage
(
frame
)}};
self
.
onmessage
=
function
(
event
){
return
renderFrame
(
event
.
data
)}},{
"
./GIFEncoder.js
"
:
1
}]},{},[
4
]);
//# sourceMappingURL=gif.worker.js.map
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录