Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


decoding GIF to bitmap frames [script]

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Extensions
View previous topic :: View next topic  
Author Message
DaSpamer
Grandmaster Cheater Supreme
Reputation: 52

Joined: 13 Sep 2011
Posts: 1578

PostPosted: Wed May 22, 2019 5:55 pm    Post subject: decoding GIF to bitmap frames [script] This post has 1 review(s) Reply with quote

Seen a post recently on how to animate an image.
So came up with this solution, by using Egor-Skriptunoff GIF decoder library (source https://github.com/Egor-Skriptunoff/pure_lua_GIF);
we're able to decode GIF image into nested table pixels.
And then we can encode it into bitmap format, using this function I wrote.

EDIT:
This is the whole script (gif decoder & bitmap encoder), source (contains also the example): https://pastebin.com/mX1f4FUM

Modified the extract gif, it should return now a table with each bitmap loaded into a stream and the gif object itself (to get information or what not check script source for more information).

Here's an example,
getting string from internet and supplying the data directly, and creating animation.

Code:
local _internet
function getImageString(url)
   _internet = (_internet or getInternet());
   return _internet.getURL(url);
end

local f = createForm();
f.autosize = true; -- auto size to image size
local i = createImage(f);
-- get gif information and extract it;
local gifString = getImageString('https://media.tenor.com/images/dfb11ec7ee94e551ceeac653ce636d21/tenor.gif')
bitmapStreams,gif = extractGIF(gifString);
i.width,i.height = gif.get_width_height(); -- set width && height

-- animate the image!
t = createTimer(f);
t.interval = gif.get_image_parameters().delay_in_ms; -- based on first frame delay
local id = 1;
t.onTimer = function(sender)
   id = (id > #bitmapStreams and 1 or id);
   local stream = bitmapStreams[id];
   stream.position = 0;
   i.Picture.loadFromStream(stream);
   id = id + 1;
end







(old - first script to extract frames and save locally)
Use the following script to extract a GIF image into bitmap frames, afterwards just save it as table file or as string (don't forget to encode it using base64), and use it as you wish, or just use this script on the go with threads.
preview:


Cannot post this script here cause of the darn cloudflare quick trigger, so have a pastebin url.
https://pastebin.com/NRvJkrY5

note: it contains an encoded GIF from the internet, change path at the bottom of the script.

Second edit:
Fixed syntax error;
Third edit:
Just encoded it using the CE function an added url to script source.

_________________
HEY Hitler
Do you get lazy when making trainers?
Well no more!
My CETrainer will generate it for you in seconds, so you won't get lazy! Very Happy

http://forum.cheatengine.org/viewtopic.php?t=564919


Last edited by DaSpamer on Thu May 23, 2019 10:04 am; edited 5 times in total
Back to top
View user's profile Send private message
Corroder
Grandmaster Cheater Supreme
Reputation: 75

Joined: 10 Apr 2015
Posts: 1667

PostPosted: Wed May 22, 2019 11:50 pm    Post subject: Reply with quote

Nice job mate,
Since I don't see base64 encoder function (think some users don't know about it), here is an addition:

Code:
path = "E://sample.gif"
file = io.open(path, "rb")
image = file:read("*a")

---- Convert image to base64 encode string

function createBase64romPicture(data)
 local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    return ((data:gsub('.', function(x)
        local r,b='',x:byte()
        for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then return '' end
        local c=0
        for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
        return b:sub(c+1,c+1)
    end)..({ '', '==', '=' })[#data%3+1])
end

bs64 = createBase64romPicture(image)    --- creating base64 image
print(bs64)
img = tostring(bs64)

_________________
Stealing Code From Stolen Code...
And Admit It.. Hmmm....Typically LOL
Back to top
View user's profile Send private message
DaSpamer
Grandmaster Cheater Supreme
Reputation: 52

Joined: 13 Sep 2011
Posts: 1578

PostPosted: Thu May 23, 2019 7:37 am    Post subject: Reply with quote

Well I supplied base64 decoding function (in the pastebin script) just to use an encoded sample gif in script.
Also edited the first post with whole source and animation example.

_________________
HEY Hitler
Do you get lazy when making trainers?
Well no more!
My CETrainer will generate it for you in seconds, so you won't get lazy! Very Happy

http://forum.cheatengine.org/viewtopic.php?t=564919
Back to top
View user's profile Send private message
Corroder
Grandmaster Cheater Supreme
Reputation: 75

Joined: 10 Apr 2015
Posts: 1667

PostPosted: Thu May 23, 2019 9:04 am    Post subject: Reply with quote

Note :

Before the original script has encoded with CE Encoded function, it gives an error when trying to execute:

"105: attempt to index a nil value (upvalue 'K')"

Then, when trying to load gif file from local this by change:

Code:
local gifString = getImageString('https://media.tenor.com/images/dfb11ec7ee94e551ceeac653ce636d21/tenor.gif')


change to

Code:
local gifString = 'E:\\sampe.gif'


it gives an error-controlled by assert statement "wrong file format', while the sample.gif is really a gif file.


EDIT: This one works fine:
source: https://pastebin.com/mX1f4FUM

_________________
Stealing Code From Stolen Code...
And Admit It.. Hmmm....Typically LOL
Back to top
View user's profile Send private message
DaSpamer
Grandmaster Cheater Supreme
Reputation: 52

Joined: 13 Sep 2011
Posts: 1578

PostPosted: Thu May 23, 2019 10:09 am    Post subject: Reply with quote

Corroder wrote:
Note :

Before the original script has encoded with CE Encoded function, it gives an error when trying to execute:

"105: attempt to index a nil value (upvalue 'K')"

Then, when trying to load gif file from local this by change:

Code:
local gifString = getImageString('https://media.tenor.com/images/dfb11ec7ee94e551ceeac653ce636d21/tenor.gif')


change to

Code:
local gifString = 'E:\\sampe.gif'


it gives an error-controlled by assert statement "wrong file format', while the sample.gif is really a gif file.


EDIT: This one works fine:
source: https://pastebin.com/mX1f4FUM


I minified using this site, https://mothereff.in/lua-minifier ; it generated a faulty script (first it didn't escape correctly rep function and also with a simple 'or' statement) as it is outdated, and removed the CE encoded function, better just to use pastebin so user could understand and use it freely.

About the second error, don't supply it path to gif, but rather the gif binary string itself (io.open, io.read), the error generated (called from gif decoding function) is because the given string was not a gif itself.

The example in the script fetches image from given url (as a binary string) and supplies it directly.

_________________
HEY Hitler
Do you get lazy when making trainers?
Well no more!
My CETrainer will generate it for you in seconds, so you won't get lazy! Very Happy

http://forum.cheatengine.org/viewtopic.php?t=564919
Back to top
View user's profile Send private message
Corroder
Grandmaster Cheater Supreme
Reputation: 75

Joined: 10 Apr 2015
Posts: 1667

PostPosted: Thu May 23, 2019 11:26 am    Post subject: Reply with quote

Quote:
About the second error, don't supply it the path to gif, but rather the gif binary string itself (io.open, io.read), the error generated (called from gif decoding function) is because the given string was not a gif itself.

The example in the script fetches the image from given URL (as a binary string) and supplies it directly.


Got it clearly and thanks

_________________
Stealing Code From Stolen Code...
And Admit It.. Hmmm....Typically LOL
Back to top
View user's profile Send private message
AylinCE
Grandmaster Cheater Supreme
Reputation: 31

Joined: 16 Feb 2017
Posts: 1234

PostPosted: Fri May 24, 2019 12:23 pm    Post subject: Reply with quote

My master; Thanks for this work.
Form and Image size manually:


Code:
opposite = cheatEngineIs64Bit() and '32bit' or '64bit'
oppositeBinary = cheatEngineIs64Bit() and 'cheatengine-i386.exe'
                                           or 'cheatengine-x86_64.exe'

if cheatEngineIs64Bit() then
function CEncode(encrypt)
decodeFunction(string.reverse(string.gsub(encrypt,'︷','e')))()
end
CEncode('z_%^O@1Zp(?]I_ZaNk:AVx:^nU5jocVn;c+zJrXJY?kl(_CS︷60vRchnC1ouNL:Z0n?]^KzH*0v32Vub)F]^q7xq^t)hp[ol[-;Sb)B$r[hF^/U}xzh4l6/Gm]L_q+p6fi$@9$u%Hyz%W09zoM3%?q{]Z^h.PHt#Cu(2#*SLsEWp#SkAWy$bFCIClw!i,:^+w[BPoBA/Z4Zy,M︷J*MTCJ@A5$P[*S]-Q2t︷OojxR/yD{;SzNb_VT9],d-ihfjic#n%mj192U#Up*MI[ThS?Prhj︷4?RMM{ytHmq8-i}3$d/]q#zKcmWC]A3Q[4m2OPcXVLfnp=*?.cK:t+jdV7=;D+1*Y@V=vYq)DU3yuRz]jhYS{lgJWyzwgv[@vu,3NIJ2Ny:sI}0[]lLBMrWn{26?:;/v^.yYv@Bb6U5Whv︷!5(6#sS06JpIoO6T){60aC0yXNA=XqHqvr8/0H!AOysQoI︷S0Y+uHYq;2[diI9,%JnhrC︷N,4Zk20)lhZp$_=+7DW5k%B7lODBI?yJc0t]0gQNaRdE2d@]*w9w_(]Im*Ua;tj}38_3woZm]hy6jUg2?QM.{k0?X#JHb$3A)VB︷Y=_?{x4YVcSi$zfo@f!,Xq*5B[uyTJVc/Q{JxmG$F,]#j]Y.gf=R*7TPtJzrL;ZK︷!nbG$Sc#x!ww_5s;Kif4#FI︷-3:(zGad8)=vc:qY/[nbB:KEn:b{tXp)Jz+PXwCgxax}ixH@knMlgK$;CKl:@J_^2TEh-t660qkRA2n(8-3N@N!$=v;bD4c?2@G{YwW(z=Amr:2c1k,ytP7$p3rBX︷:_JjJOgOAjw#huW@Q+G.o{c?ClgV;OVu+Bv.U^3)!!4M_P!5Lr-52s]%︷B.,,7z3niV]DBO:3+=rs9V-PLy7L︷D︷.zQD9srEoBA5K3a0ka$-Ym$,,YLoY-MJ[Pr*;sSmqV4_M5CDt]t(;A_1Och@JA;y;$8CkH^%71K#SDBWfRS)NA4(#8um]j*?1zCtgY7?y_(@H6Y;h6r/K4jklj*tZ%%m@kM0Ovk=qRVk@0jCS)v,b[*hH95}^r5[)#sl9{1k!yia*s/{@8vR*(Sn:7slP7/S!Ya)QCg4*KLzZKQLEW}1(A9m#yTo7H+pwuJNrP?m@Vm$?t9n;9[pYqiu[w8QEgQ.QAu+Ei3?hS(?7^aRyAo@@/mOOlv/41i?[Kq9g16v+bLA?X=W{kG#YBLb6g0A:56,9cPNwg#(R,-(PJ6a#$Lf7(K4?yJNt04ry#f(RFvDD{w@NdFm}(]m︷K49.9)ht5)6tw?l#),IZc5tdZh︷ia0axC:xy=b$IPXQxO_;︷5S1RFEZP#Wu)oWqkn?x(iq9G/LXg-5In+$︷-Qk0DzJHSN:Jq7Ru+W+)cMip#r9iB=My):D$1!fN9(qrRJzvr._NOH(JL/M+NB9iZ]S5m_{Rpx5}a;-i=qFqB+Q!dJWsqaL1dLXO9+2DpwP$K6d#hrVyR7nq!5Zi-kqEK)#ax9H-Zm:MtVRzTgX1ZfvmBNOi7^ARrDuuwJA^[X,Of(ru-%/K4T{kWFnC=$n#DVSA2︷(ZW)DDpVWo*z[EHCb.Yv.tNp9(k}8PbrA?=j8QyM+tI︷[r$WFA33m1r1}/;/,2Hto{7tlai[F3HGU8%$vN[P_y3A8JZ8$*C:1JL7NOAszh9$./_3p=#G=8Kp]6%HjvWl-R{GR4F︷@5/MPFYmq3(97TC3NkIhUdux%#jvE}aUAR}3oQE1vtyj$Hh:U;9S)^T#G%GT-om;gwVcWOH{.4+:/bu0qT4(h..x[$zyx59Sm3:-Kt!JD*n7QJxti09=E;I(rG(cC9xmGSXFvFEq^tAgP.z:.Bnx9vD?Ey9?︷3/r7.B-tVH${o2OCX︷:dMn+!NZc};6(yD?gKrb==X/(UPBXfY#/!@-;7b[fI2TDb@3W_MkBgua_*GtnkGM8z!Hk4-2u[v}*yn7+p[LR9BTK(hw[4%(Hpc1Pqt/MtR-#︷SMQ3xPG=!f3HDkHD2/=w:1JW[(K@?zD)UANDR-o_@{bk!YjS︷!!-xa5I(g5c=SU()_EZdGu;g5Moz$9DnDK%1YnW*U[n#=G8bq5Q3lFrY︷?(.vqrjVl*=QQ[85Ogn3yX+R4.Qml_pvQnffjdY?-TmGv8R10iL)a:Rp(T,8m@_8ziq_uTxTpYz2qPEP[d?j(}?v]v︷4K$LC^JS{i58p^3P#Bv3zB.{L2X0b@UI8dTzB]([email protected]_afkyB26BMp4!=CS*M}5s,0hI2︷%V.f?C#WMTO[Vd︷AKy5?hmfkT/Bi]lND7(E5=2$wx1l9F])SOf#/P;)tV6*XXbL_vPgilT[zG2FUiC-(Ws^DnL3u(MF_]q)oQ:DW2;P4]9suV︷*GD8ft/Ju+9w/}NWSw+2[l}PP6]v8E#P0/RW!EutnU@-MGJRmh],C{Ys}Zw[︷#ZXD(w]X8Ac{1?L5hSyrtVnx(WYqlDZJQ4oc]vdTPQoaRq5(7︷;Habd?J[[,3i/]6cgY:wjywT](;y8hffHi_*5Z^q?︷nN}w5N#BW(003_w,MhowilPG(QbykBonX?[abgoV?.}8w^:*BmDwmQFL;GZnH5V@r0O$#)/WW^︷[O3,/AVPKjFY],ET,CmS65dNCpw9WHT%DFTKwvgkZ4w4SzYMVFhGUN/UU$YkQuH[DOVjCpu%g^[(9S:c{fhqG_i?v@nKxxS+.?B.5N!pwFR_{^y50j%wtcEAph#$SdJZDuXb9Q{=7(!_StXR{︷uoCcrmgzc)/]q:Cc6-93=W30s$=hPMqzgh!+pb.7aT7cV5:_+TF︷R80s_-h)f!*$P![P8qJ-74SI7%GW︷o2OYlmI1/rOWMBzcbs_Ea?y3T@MTf@9ii!tk}rv0Tndzx?sJstDmf7nC︷Fm,oa+ymn,iF=??jkxCv@4pNY}R[_{O0AL[15=sla6A3{mD]9w_OQ︷!LyU+l$sIkJx{D_udRyDb(5UxdkYygkRf#DBTPJ^hHMFl8}︷cAoBR+PDdUXW%ysQK=IrWff[Zib$T#%_/Xz;#X)=ZsadPcq]/X+}-}EnD0RL^ZT4HxLU8)sP-63yqQ)/XTj4wR-︷bU3D=V7w︷QVSos/*YIs}E),tRw^CZ︷3,(yD$wSCyYGj}*vb;QUv628cC︷UP#j[B*)}rj-PSB!HoX.OQl7!5N+=M-2m]R4)4Dr(/+#;as{KBrfxnUTfvTv;/P[XBEnE5(O8X5bZ^!︷Q+$o%PR-f8$btI5itT=!%KkS:VEEo^M0EvIkyyf]iTQz_zIL;q,.vp@yE(DP2LgB@Oxo]]b(Tw,?yG$poGk+q[{!9FG9h2ldW_uYRHKO(f+{s(a@_Q_sXb7_xLR︷g,?7Ak9Jl951W/VDJX]6C%,_[1R)XDW4h)THTxX-I:XaO06?gQGHhy0QNdso]#pG#3J6@]Y[cj[sxmcNWHjAt[gu1}PWV7EG,bOl@;1ojDX1f1VFyYo3NmL+Q(5ghaa︷fXWEw:K-Fx[tgB!sbWO{.bz:U6!(Z^/Y,W8{ryIamT0+zVRXad{Ep,D{P8H)8f7o#B!]nDO/L$]!UxT.w/#L]D7d.?p2(DR9f!:w^Ju+sqq=f[!V?zQzhJOO#vp!6jAc3_]SAJot}Gsg]J0?Fx}3R)mwRosmV4urntnUq/1Uw!W!HF2xHF1w69IVxhJH7^:;Ga[TGjOYjTKuFVLEg8uc.?=l3N[?I81VA9%+8y8OF4:U1xW@+=X9F]2n*r(n+;}NolsQjPcYcY)vJq:?Sk+#m#b^lj-=CZRrW50KtP︷l︷kHR?pN4w-h/OGT3Ko_AEb*iNPaP︷X!X9sGl7JsV=k-As-W^Rn/LS^BhuP(/0R3%==*?TZ303ALo!ln/C8:BnDw.w9,_JzMXj:wg@8YE)8,/h2H%.FLNE%h1NUn_jP8Gt81OpVaV;tlR[3IxU$jfiCq$GPcQ@CFR:5PC*yxr$#KLJ?N{*my)WkziO.CV9sGEuUR84ucOBz*n9qUJO}l@E_Na)#3cPdlX+iLN)V@HUj,2u*@fW7RH*n-aUn}91ZG^F=ap(Y32-jDQm=++C[lbAdfA=@)#[9%v^6z75EOs/y+yAQyE,%XEs{.bqgdw;nRVnVKych3D11DQ;#mZa:^9]VJ3*]wp2_︷LC/hUA,RVz?-︷7I/P++y-Rd{HNK.FJ:.X:s9=pK%T1Hk}:r7S$Z=V*I48RAxghWmc(i}RI7l+U+^X5x^[s,T7EmK$t{h?,bB/-)^tO9pN24{l#(Yd!(105J1t1P,J1p%+yBng^vSUo6{1=A*@ShBC[(QL)00ZPzZjA3nvvMV=tsCHyLF][iLdk0g]?]MLd![_!}+9fZ:#cvgjlGKAdBATYl.RrRsaG3I:fU!Tu1/OxIQh4{XV?Xm^bl1LH9lSru9zA{hJRb=I]$?$cW[U(/7[$qJ}wL]B/z)9]KyVn-H)a1D0CZFhFCNgLV=$:KRu$P!RGcvf#wC=Bk:42aTzlv@/t:pd#ha.Mh;wDL!c?:︷%cxYr*!An)V8ME5{?1L/pUk5a#Wcm(tx8ka(P9-=mPu[nH%nl28︷)shVgj_0+6cXhHm-y*#gFi*wsTY?I]%QG*B({ot5m8Hlbwh0D(g73M@7o$,(/qEBk︷-F*!m*2l0*EClIa?@)Zr:︷/BZxJCH(Cg_iZ{9ga9IwPy0pbsf8PNl(PzoDlA8l5=27QSVpFPyY];-wa2BBWD?+*79wt︷#2L4a:/X2ihH,Vpa5︷ySDQJ.sgNuFgRnLU4vaPr@NQGA[aJJdRS7l2fMg@QNmX5g,Pp-F;w(Oo11?IbkSlp09uWgG-Ls+Z{Rl^[]!-r{=:=;p75Rp6N!u0LBD*2tu4RNbv{ss%:1:$C@Q$︷9PfYccBft#v+cngL23/S.dBZh!SVxz*ngnI(aA-dp_SLHQtoYE?SbX1%XlcUiN^]N}NruO-E︷^mj:5j)J%YM8Ev?xs︷LK30[2)wUfQw)Ng^[b6KL.cFl:N=4Wsu#=kgz:a︷=K@}m:1lxc_q2MlLBLA}Hh*.7=XGt2CKGkN!S$9W}A,}IwER_#G7[{H1#7mP@)3YFEl]9__xPn0@Q,AY=;wn3CcdEPPNqr##1(y3gyQJv)]X279IPrU.ov!qy+]2︷Br-b!){h#L(cj@W?CLE[-)︷+O.8u(n@./n#Ri2CUask]G0X:bO^^bLKvELB!K:g3POlsywRDqIAF7U6MV:iX9!Bi}JSQG)5ztJ8]4-cT{3fY(]E!8A]d4KQ^dIl{k+fO+68WVH3in5FP((5uI74PxOTo9BJv0H_)w,P!*Q+.cD_*9SFht*Ef#J^itO@^JD5Co]Sy$Zw}t6]ua#xzADXD(=.ETXuVg*4%0]Gkx_FT]ZJJ6pU3w{[l=#N$C-X-Z*R;gzYvTQ^!I1s]ssFmKq1Pfu+N}(@UBnYKhElHnksIMG)#q0rAoCt[BURcIfrQrPl-C)K9^/UvJfH_01cn!Y7B^iHF5qi9Z6hJ52xXj)m?AvCHI9]OS:U*;iULgcD9=s,CQn-c')
else
function CEncode(encrypt)
decodeFunction(string.reverse(string.gsub(encrypt,'︷','e')))()
end
CEncode('X7D7t95aa7(?$ZSB?c{pny)t(J:vkp_-40*duf5Rs(g2S;yP./8_Xy6E6rhc;T︷1KMJQ(mfM}LmR#:}{0)a;D=JbUGmK%#8I^@2^hzE+UG:]?WmKJ}(=@[-0N_[Y-p(g*+p(s5NYyrhEF/4]kl:3Gdkz]zKr,XDTln︷E[c,+xC9@iO71z=#ouY%_OsjxMg*U-j=KOW}=A#n*d9%pgE/.f;qH;Y^4xkJnBN7[︷q!wrEwq4x8NT4EXq=KgtioXqCYf]J@s7qDr8n2Gw@O*}n6jjx:VA-nAhF!EJ;UlI#Ad(1c1gb:VC6,%HXjI︷?h︷z83!NFh*C1JD_cl)oSplr[y{zLDiOZX!4TjtIddK/3udvh;o4R,yQ1QLz-PMN︷+o%fjL#3Y,uQI4XUvT*V%czTdxQ/2-Y_{HdU3S6uJXs3.︷xYU2GJ6MRv}%*6+CjE=1}E︷cIsDu^sG^).sFSw4EDt.n(ko9!L︷vl[Nb;CmX})aOb5352,7nUd7{cYVUBAy=T%hE(_0UYgumWO4-4_,,5_zVm6PVrC*+GGBS0tY[n?2NxBWnDdpV?r4:O9K}78#C]-;=ON.=6CdJl8M6dlr5BJ8EotW!_(+K*xlTW7UgK?{(XWz-q#Xf/HtpSMXCQ36Wq_%-7OBk%FUJg}z3Z..(WCB-u*Yb?F?@FvVbpwMQ;^Z9YC^*jxZ3KvB]y6k*YogVarrTmfKZf{91Bg=W$KiWrIKuREPnMK-6=X0m=.kuaC56@=yS(%x7xwU)Q$2^!u1F{pg2mI%UB0xMkr6RzFKqix7Xg;cI+w-aU*xt(/*amk2WKBc:qwL%S@#/rMvH=D!KGQ%;z=O%D3q{@a+_jt:Jvf.X(D1:S7Vmoo%iEYC/YkO]};N8K6[{^:zaPZk3ZFB4-M:B52:2p/2g8[UAu)o6i!+xGp4Y7IQ))zX}UZ7]GF$+L4cw3h@qo{i,=Zj,oI3gxq_b$Jq,hK-9iFP@vbw*M!(gn;OH?*IcfUzdkaD3aS2:th+_+ZTT89cQ#O$nY@_@w*RUOo[T:2q7RE%o,*7NoHF*m0p5,)LjDu3dCW6Vps$$TwKpH5@;GtNI︷V(wbysN8A3}1)/YFj︷z8Jo.[d7{?*F(U+n26r7gXUmx+9An)SIzA9;sNAHydL(xbx,@00QKz$%9︷y3b:HMJ{$︷)︷^cf8)1Vrmodf%f0}zxy]%o*g^Uop}a2N1auhJ+-Q,*Xsi9w6SnAiCXvRL@s}}NEg05)uMGAlvt︷8︷wpCH;a$DlTu_D8G/t6i?:R/Jl6S-ZBao3zYjD-;O]GAG$of3X(M)DW:lDlHP64wn,J5zEbsZZYMvc;OSG(/F:aH57DMDFkhj8];p{;sX8;3YKdlOSV@O[]#c}!NWd!vn!#wMhF-cPC*)UCB@ij?t3-E*#F;$PZ50[CN?R,c?S0G$Xj^=NcS+3NO9dN![/WVuWkx/jkSgt(P5qfc1-Yf@Lg@cJLf4N6#(F︷_KiKStr_MLy*1r{5hQk;O0J=(︷#f:PJs/Yh+d8Ou(:b3p%.R:?Qt6u,D4I︷wg/!oS5F]mlyM(HB/!HW5zOKIo5MOYCvG{P!}$Iw/u=-I_P9:^.A9@pS]KLov+%8I.n[pycOIMdC)CHfRh8,sC1Y-j1︷y*hHoSu4;$cI-;.RsSILXKFu!:h5NKf#p︷*21qY$?Pv=96?z#VmK(OSav-@yTJHav5COLyVspwf@CBNQktqr]@0#Wg0^j8n+*PcED︷y[.tYwa3TA(rYMB0S5jGgMhU3.^YdG!-7.WOQ-=@%Io:()qyV{(a8hUx-.T!48g=}cZ︷h8=5;Y/:1EHLDp{Xg@-N/5BQ#d!]L.KcbiTYr7;6rZITNsDgU;2-Qkur[qW%b8J(?KbKmAbPRL9qW!$x2lXv6VRrS:;p!iQi9J[;y3w)W7;g]mI}hWLg6Tjh8du2H:4[?!t(.TI5:GGK(4tf:0fW58?8ZO3f3d9WO$B{T}H.{7r[Pv︷^u+{]y*23$J6(+w2S%DE2A=R32iqE8z?xSA;0j9T{(4XugODc$X}F8SU5vn{gp,@$8GJFp)h(}t/0c!C?i/LT6!︷1=8$EU0?AElmzXkS0gy.UGU[6qDu#v}.UopIt[tEmf(:youp8v7Q{yxxX!GAZA5^)zVZ?P4-.=@/vHwnH,o]?g;y7dd#+pPo35zr)fDh1^5HpU(dVhcmOj(r,U{o?O9VhQMUnA7ZMA?$W+rYfYdZl=#L{Vpo@F*+EMa!6cCbM2Q[%UOBvDw^jz^rf:-#/4$sVP^07%j[1xM.=34MG,0njEPUQ4Qk!Z^Iw_5B{XgL3%Da!wgq;XmYAUkGAuUMwwn]mWmXRF8rwvRO*5!)JH$Xc,xw:wA7paT_-1%_Vv-zipSkcJ2AWF@COOo0;nSg]0jlybzpsv[N,L+EU/SV6I.wCH]4/:]VS;!rIw;dvJ=bZj#TJfBKU:f4pxv]+RTJjP+LCbMcYxf9p7$b}0ryUDZ:?Ht9hyj#o/V+w@YqOs=]cVR={s{+D]YWQX31jbEGQq_Tdh?{UA1kL2.;SO(]F{pN[WNhPmsbQmB$J.f(G︷BZ9Sf(u{g}%;HnDgNR%f-jMC?xS︷︷ptlaYdU:9?tp0C79E%yIUs#dwSiSsgX*m(3!y8[(o1!#zcz[?0-;UnR85_h-9W$XEGPCW6Fi%}otoGC9#jC}g[$z@C={Q7:!ncyfii_Mcyg{wUTW8S;Y[VlWIbAZVyTiJ^n$+IF*%F1︷LxXpM=c{j40m8vmFqSpq︷UoZs=7ISv}cJ(g?pWVivxZ)tHW2U-x:wgS]UDf30jU+Rxo(X7.@^U%XyMNbb@^G:CoGR:dt5/RDMXNRjwBM8E)MIt)Mp7]QwAXOzH]uI30l:sFUfL((M(hCAl9g,6Sgf︷ng{#X)[_Abh)%$,cr51Hk*N7S=D8!X.hnPIc3rVfzT@SnXBF-︷KI^b-x6h!%?a.ah-b9%V{3%@a9!i;(z$s+Tb.lNI,.]b-X[R[QW5W6;=oSMq)1hk#27,3aOFw$PXFq7O%xS2B?NFZI#U8PC;hEf6Cpq43yDbQqjy:-#[8L/X7ro^d779GS%9OSafXP2tuQ3})n︷h1Uxq?,(L0:P).;g-4bX-dus3;Sc.$g%l/FaTlZLMNu}@nR6_%zGTv#ot;4K155]bGJ[t1pQAEV;)P)ht]^}}R8Th?nF3Eb-QH{,UUj^o?︷A{CH3,Zt-gsW0Zhs%g+j/BQA@D%r}+gUnJzrV}}JYhsbyLVxN]Up^gS*0GUV$8Ey47k?=yc^6r6O4!/d)YDLVX1i3RJ9/J.qC}U0=N[[IJ1WWoiz0s}QH}II*ZO^GUEn7N*N4H%m]6*8,RAUaZ.Wd.ook#]:lb{VJ[Cf*!A7_iWX@CdzDnMWowU*s@A6;YX}W$h,mVVCZpQ*tGAOO8fUvMN?Vu9/v!/$tTEf?dc,@GM1u$s_4MlpdR18G[mU{#/783^I38P)f*!3*Jg]pkL+@S^Kup(ozY:bR}SC[5,Szp7Fd.XE]Ckdkv**Z$W/@_!oPxKff;lMZ@%m/Z#t-jRs︷{u$)8d.7?0;uW4G︷_$=y%2oF^MVgX76g?gWXr?jUwg[XtY9MR$Iz0oiVfY]==TB-#%︷]%R7AI=!Kgj$iZs.Jssk43$z+L53Y%H%covoL$tw@$*qtka(M[t︷AWbL_;IcYyp]aOX3ArAR[.B@!R(k^+m:D1}hnzc{*it*N:*5p.nD;}0-a-94[V)R!;Ey*EPOOihC;Er(Aa*}q!QT;uT#nVwq5KJtPf{Dk6_o_uZFy--h_.TiAf^dkCp,VU︷@2_Q8WzTEH]^fd/]5KSh[fYrD,h^AdJ]︷XxQ]Run7f%{u/qtFTh[{LH!6L=!)0)TEPE]0WEM6{/A-BF@Mpf3*EBD4CsHaXROG!uR52:C(J7FYxzCa$sD2t_G,QYAI3WKH/hFqtALVg;I2XV/p;6TX;89lu%+H!wY@MK=!(t[gP-bo1HQ_L/6CZx_mi}ZkKX+x2fM1Rd=BW{(k)rqDm06)BRS1,A0$k#9/.V$VM%$Kv1t1i5iZ*Z=a]+PAm+/0cv6LW.GBb=Bd[+︷gC-D7VlKaQ#x4}.L=v(A/$)mr_@1czaM/F}Hg1Qu_s,C+p8hkCW︷VM,Uu8mICwAhwPP}jkdpr8NJ({$=naEkRSG9^iA%tz^}*YcvU:+Clf6EG$bv7xqk6.FIK)PuvoxRa.9=+iw^2.p+@*xZTky[hRzyfi}:DY,;;;dQhK,n:g^Zw}9^c^/#hQxQ*(hRg2lU^Xm,AILJWZFU3%rYVSYfD2,Wg0luYw]l.OY}[fE#fv︷mt︷sY]4:7wd3!I-!=,]k#=8(w{;/FVpD-:*GaN*$0S!l]@ioK=$1rh@,Q0TGDs?9/]c#+?U!7KDF4^hmYV*9!=+Ln[VwLv_i$hSc)^r8FZw{9D)u%dqu:z#3L-(L]%)5%o$Q)ndG2YbTl;jByUvCd9_3yzM=89a!k1WHzZ:zXV^KiWrjzsD:t4uL+XBPOBV6KM4np,0n-!MR︷1cVKu(/3@B*g*),MS:2#s0CRb@y[N2Y!^}HxTFtny*MtAx8K{COK$Jx=g^]iy3Tb0MkL}xjo^EMU(kM)2nZg;K$iI?L2C[aGM]︷400PN︷9zBpiuh4xRHchwN3H$G)#wGR%PV@Bf$b(Abvp?%]p4sDE/A(!BOY?}/hT-M[fLtr8]h3tDb$oPS#[*K0czDJYVslOXYSW{[va^0DQkD-+Kjja.SX+y#z.^)n:NPr3Ck98#r5p?Q6y62K:ObZPom]9DCZ8wg=TjB?o6m︷y5TUD︷caZ,iQF^E#ZPGsxv7t81G:︷D{.AsBp[HIaU7AQsvkI!tQBbpJOGJ!Q/z5U$;B)qLjRw+EoLt45,p#;.6_6%dd=9REP^Rs)d]WXk+0%?Mx!BU4I*XS[$n#1c-(n4bcuaGA*!I0︷bN)2VlUd#y;/Ab$-.%(4@4p(aRzP{ld)jlz2Gy!+y1lU{qlt%G;kyMq_u5v4r=b3wxVbg0r︷ZR=a7TK=s28u!7z=d+qGz}i$pmnZ!TdN]m]P4GjCmiXs_1wnciXl7A%tScGrRm%25V︷@q?P8YcwAg@Ax839Uf︷LH/1Onf]Dd_G1NP$EJU*Hv6TdDEvT+k9164R?GibB-xRry@I}*c/.OS8KOC8O6U38u-TLxL8x(M48oTmxxbd2-Bu=Tm@FW@P+rWIYktaG8aMfw/kHy7G9(%︷Ya^Sv70i7c^D.TI?M1Qmul-PNas=)v+br(Jxl1+50KbU%(IH$5B8LkcJ-SavR8$rb@1p=XV2DK1,bO[8HfE#︷Sa6lgZv+-xw0F}@,NXhKV$OBfFcFa[mrzX︷FtR/H54Df:;XqI$/︷Amu(bAD^[email protected]^V︷)Xj#,8fu0Cct=A]ylck%RmKI42]^-0Vw[b6mP@i)aM_lGl@J/f)Y],iV#;^(yMP]cf]s5[Ak2RxSsx?DzR%VtpoBNGYX[pKr?SF,{npNj8770/dBA!o︷!2wM5u︷0RQ︷F(T:pOPL?5u(N8Q@qA-*mdENG(%Pn-c')
end

local _internet
function getImageString(url)
   _internet = (_internet or getInternet());
   return _internet.getURL(url);
end

local f = createForm();
f.width,f.height = 220,220
local i = createImage(f);
i.width,i.height = 220,220
local gifString = getImageString('https://media.tenor.com/images/dfb11ec7ee94e551ceeac653ce636d21/tenor.gif')
bitmapStreams,gif = extractGIF(gifString);
-- animate the image!
t = createTimer(f);
t.interval = gif.get_image_parameters().delay_in_ms; -- based on first frame delay
local id = 1;
t.onTimer = function(sender)
   id = (id > #bitmapStreams and 1 or id);
   local stream = bitmapStreams[id];
   stream.position = 0;
   i.Picture.loadFromStream(stream);
   id = id + 1;
end


Such studies; More beautiful with CE and Lua.
I hope more will come.
Again Thanks. (And +1)

And Video is promising to show.
Hopefully a work for the video image begins. Smile

_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
DaSpamer
Grandmaster Cheater Supreme
Reputation: 52

Joined: 13 Sep 2011
Posts: 1578

PostPosted: Fri May 24, 2019 3:08 pm    Post subject: Reply with quote

Using this script able to include sort gif, to animate hacks effects, not recommended to try and display a 'short video', as it decodes each frame and frame into a bitmap object, not memory/performance efficient at all, can get memory usage from several mbs to hundreds of mb for a simple gif!
_________________
HEY Hitler
Do you get lazy when making trainers?
Well no more!
My CETrainer will generate it for you in seconds, so you won't get lazy! Very Happy

http://forum.cheatengine.org/viewtopic.php?t=564919
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Extensions All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites