From 38246bea179d24d4c4e9c3afde816b8ccb5a72fd Mon Sep 17 00:00:00 2001 From: ema Date: Thu, 30 Apr 2026 10:41:08 +0800 Subject: [PATCH] Use the LibAPNG NuGet package instead of a hint path reference --- .../AnimatedImage/Providers/APngProvider.cs | 18 ++ .../QuickLook.Plugin.ImageViewer/LibAPNG.dll | Bin 20480 -> 0 bytes .../QuickLook.Plugin.ImageViewer/LibAPNG.xml | 176 ------------------ .../QuickLook.Plugin.ImageViewer.csproj | 6 +- 4 files changed, 21 insertions(+), 179 deletions(-) delete mode 100644 QuickLook.Plugin/QuickLook.Plugin.ImageViewer/LibAPNG.dll delete mode 100644 QuickLook.Plugin/QuickLook.Plugin.ImageViewer/LibAPNG.xml diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs index 8b57652..9445838 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs @@ -258,3 +258,21 @@ internal class APngProvider : AnimationProvider } } } + +file static class FrameExtension +{ + public static BitmapSource GetBitmapSource(this Frame frame) + { + using MemoryStream stream = frame.GetStream(); + + var bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); + bitmapImage.CacheOption = BitmapCacheOption.OnLoad; + bitmapImage.StreamSource = stream; + bitmapImage.EndInit(); + bitmapImage.StreamSource = null; + bitmapImage.Freeze(); + + return bitmapImage; + } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/LibAPNG.dll b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/LibAPNG.dll deleted file mode 100644 index 94e0fa7794466219b72fe74cc5c0adb83ae710e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeHv33yahw(dIT)Lf}b2oSDW+Kd(5ePC9K#(@6B$ZH5sR~sI5CjY&C^jO9 zIJF=+HTHlaqKJw}+fJ=5;)o)H?X0b~L*I7f{cD|5l?s7=_ult??|a{Sudx2JroHys zYfopNoO06KjieEg3E$JFiT2^jp8~;u4=qr;d+&GCL-v>Y>{BMb)TexYAnIv|gzF-{ zdQY`46bd(bs{EcvQ^*qtc}k|t@YIKE{FyG7qo3h=YAMk~MI%q{$~m#xPSSZEr;$49T;OeZfyOxZ+sT^z@K zzF6wxqO%g`shW2&x+8;$B{5KRr zNiQS>ydWpKK#1Gg6mp3d)!U3~w>jQfxOkJ<5mEOn6WxneAeatOj1h;^+U>e-;QJp& z7EIm_5P2(LYgN5&E+=$2mBl6C9mgHkK^AMcBLv69L6R+Aku)IyE8E$9!ZPmDX0%w$ z(-wp~!J#b*w-(oNhi#C>rdMG{%nAmfiqW1ulpNdvDvhHVx9K!8ft=}?5CQ_s3tb=t z1W2MT5CQ^>Qe7Yf1n7EQAOr-cNEZkJfior$f;wiYgdUa;a*ugz@vdb+tlWdGf?gsB zcjgSHF?h}toOh<6-9^1O#1T0wEws zj|qf;pleJZ1Oyl`x(^{B=pGXYfvj+THtOl2He)kWnvyW&v(6OcoGHjVQ;@FzZPil@buUAW;1WwuJHvVJw(1#Y zILCNREIsoK=Y3d>{x%T|d0*|I$%5igEooX933F(f&Ipp%5bXo*`!a1=pEo4 zS`^b6TgXZ@204+A654w$)PtQ73~Qs?RcjOz$+7|+0~b+{;mZLLjMWA&wjReIXJk&? zx|7Qi#k_Q^z+zxZ>u9pdw6caVH66Lm$YXIsYm_(KB%3(vXzpOv9io_Ha5=aS*u8Mm zzcD*;<3?PMo`yhE4C4`B=>k_=&=CW8*fKz*3uO98R=r`=jku?^ifmEL0Luyt z9n-LRFju{e;0IgPE-Nq$(eg!LjrLzBBnxa&EZ3Is&44Z)O~d+1L3TbO9i)9wx;=a& z8{~4coRK~8`Z|~f<=6)$sh4vn*~3^V9nw?%6RPNMi=u}uVKma>8ulz&rbm$=9=2Pg zQsccK?SpLg@CMkUGP4?MuiX}PLdGkf9_zprXVk4bZjE(NhgeluSuNpB06o<35JcM1 zGB7pO;>Bu?oj+~>$xv?Q2giG-T7F5xrruq@6|h{+gTWRpVpmx49eSrnq?0ZLKjMv_ zPoFkI;NS;!)hkOgWW!;De!#+E(iN6pEZboh#ctsUj|60plEQPoO6|Q$bt4gky^Z^g z_gXH;R}WuvjCPFTQV{krl-%(d+w?i2rg@ifi&u_@k#{+hoxCgglICr}1=CH|&F#3N znaCAph%u+IEG6ub;>J4$T8qBkg)fS`#As@UGnsq3_r#K1k3}YrMJ5lH;tS&)s+SC@ z-W9Og5Lf_Zb*oYr%M1@+#o_WAUyWG#W3({w-nBJItzD2>yC4%ww!pjEt~$Ag7%#Q8 z))$txN>!T7c|EUMn46$CUkhKs^x2)FtFQ~{H!ng!fL%Zr2mt}M09_yi1X$a3fe@UB zDMnm!3yj$&VO`Dj1_1q~uT(FuaNz>(stT6sO^neJWxR;oVrO9eHPdYP=J8;{z~yFX zytEd=i&W;YoYgsofuw*d!nTykm6m{(JREme24NWBCed*$HpaWqkcs*|wCq;0V_b;> z84J`6f%IQtS=-S%7QC2r4mD$fD*Kps4eZjqJt1R}6xBr@L&Te*VI`Y7tYpX1t$MQ+ zkA01haz4j)K%LlpGu5<=G{-=H;Akz+R^dgn$5xp)L?2U-jOA5Hwj)GQjadtA&g85GBSJ5u+6`Mt4BvP`&GMiFN}x zRj;fwnO5`^Q(-Ja`ne{&8kDu0As&^x#tv+&`8(cSJGQ9R0&( zj9tPL_+klPEV7A$xa)K{6Ni#DHkPb}E!+Wjv{=>mZBDitos1GIIL-QUk#Sis&6rT6@a;N2N%$_#%goBm&C1Ol&Jr^P`O=lBFV^B9t}V%+XEa6vp}HumKF8qt zT!n1r40;O;mbD2KaVY$2ZaW&;mSIb@nsq%o%+>6F1y!dp?QMO3*Kh?XHrKR z??P_qknKsQg)Xu)dITR3TrRjp@Tl1Avf1Hhz2LXDe20Y=+1PW9^Gel1H#ir;!*AS- z=?dclkzY$z?NU09#5$eU@QSC!3T{i+}X}1Fp z2#z=10XpA&7m&=qh5a7!Tx+@%U9&-2ai6wSO`~iZw}>qj>Tdo$@B`ERz!b|K;J4<- z)Li9D`V(-Y@+{Da7Uff(`U1)-^jD0xPVPNGkNZt^st2j0wdtQEsiIpMg7M=x$U8k&|99ba$$%;-puF)9Xv3pL9#=;`~Z=wW;0J zrgnFm+LPN@rnIr_(8e;gjb+C+mYv#IcBU86vBex-`blTAU%le(#m8|D+4XbPx+iooODZ;I_y<+)J z?MCT_?jy@?>PCGG-Otc&Q;wm#54s*S!q7c|a+vSJ>DlesrtQ7jw7qwm zwtMI~!zcGt`Ypi2y0eo`v98sYSuWwgoJz&1G>)Fx+x^$n8r za+!oi;d2xDZ0XvCG)Op}w+hzCJmEH_f0@)v%c7}<KEs>X|rg$!F{3pR+~drac&px7Zw@Zi}bK|8Lf(QPiU32(cq%WpS5b* z9_L=v{B*y;J*~W^&8H{h+&kI=`m4d+Nq^Jo>3E#`R14GJ4X#Z2T8q%naqfGqk&#Xpk4;IA3MTI8enkGVMka=7aH7o+DGaYG}PcSw9mj57~F>_*Fv}J z9KE4-Gqq3(rXX?#u8--;*lbjIAG?Zri*7UB>^$GJhDOA>Ow(GL6z6hHS5sx28)mwO z`0*kUmm6(bN7o2<6BRm(OxL!V)9Y!U=+@deyX)zo!Tscz0PcB%JK~sXx{h8kxRZ{V z;NCX4osLUQ8|XcQd)QG4?lXh?)>Uh|p1v_SlRFIVCxd&#)oj{GCY)Ayulm4sB{-MP z(O~C#((j&>llKn|7MEw9(x}FB-aWwBFRpRnrY7K8GlD*v05^GmdmJDvnmv z<^MgK_NDIsw{<1f+n)ZB+5GYL&Y& zhI7%eR_NK#qfMmsHYQ3E>HqV!yK!_@Xrqj-_M=X3OMCPrasPg;O3xQ??t@|-RrOu-?elAnsJxPbRVFDvVkcyT(D5E zOmLdu96_I80N9xp3EeEX3aHRJ!J|}^+z<5hD%U920N+ur2R@4XfUZiVvK8KP zwEL)!!ZF`RU)gs97up_%_F2~f!KVdZ5IijShTt)}K-uqlk2=L;R+VgJVX_T>^ygOG zM~fX{%2p~M=|}G5d{_?EdMKUfouu=WLG*(=2RJx+DC~84ujG+Rp0ubF&2>zG<@Ds4 z@Y$SvsZyvcRjYwh9Rc98t}t3PH@OKo#nuA<>|vCY?IC4LgzhJF8Cs`MnevsJ@muFk zrA+B{j_$g2exQZpn`y31TBo_&HXf~y3#3+@m+DEO4% zNx@Tsio#L#5iAt+3APBX##u6?ZWsEX;7P&0xJwDC#ezP;YQa^4s|9xmJ|%ccP|>6= z!9u}GL7!lY;C8`-f=>ya6g(wJCib8RdIb9j76=v!RtowATLf1LZWr7kcu?>u!IOey z7SDox1PcXyf~y3#3mz0aDM%JBQnO9#g7f(Hdp3R0^07c3C06l@XPE~v;u*Uoq*unK>q z&u;BlFI{+k=%(&?zURSC(CFG_!n+}E#(R<&?^PcJHaH#uo^ms8bvy=i*cd;vFs51= zpAuRx)!^W=r^L^Lf-eZJb3O_A!-C~We*!%s={aCfeF=Dx##m*21-QiZ29TV`fX_Kj z0oRDnFRUMeJ|~0-Ep9fU2-gN}s52#Xqc_KRi zsNxxD7s$Op6;D9Bg3bi0bRlZs6MlEl*{DImGti!(b5VnWHMckDA*cb*1A!_HMGXp8 z;l7}UqXvaW096`^8WgO{=Yt+i7l0lER4I(L7k~0XohtUz3xN^Tqhf8%1vbLBO3m=9 z&@!Nkb#plA3ow|O!72}tl zRVs03gHDWp_9{O>(pGjr@$jD>&ams$PIf>UDY8`bYDe^DCye>d=)G*J<>Ex6#tg5h z$gaquQN_MsbyLvS=pR#MNXArGRFnjw4MAUXanKiy=CD~iVJ=I@`5W;U7{9Nc3xm(B zZVX2Zx{WTI%1T2`_5O&jD(J7wro!sRKsW?qVj$XxOI35DKbxleeKj-7LXEjOG&>S# z^c(b4zki`YmWK_3O%p72k_~mLJgi^YZw}=S%`M6so;NlpJF7T1#x{kjD|4x$Vn(B{F;HC?iTIk!LV?Ee<_7X;=eGz@i0s)l5EQU36uSwn^m9a}Us zucWvrcX(cI(eUAg#kphiv$BT_FDlK+DJ&|@=OII*CWUL7g8nfyYHB2~7=xy)z9HzZ z_lG!L;ZTXc(H96t$DmiM3a3sUM|J+jin8d809(cQ!WqS7Wi+EX+UT#(ESo}$eZeMw zMTOXo#oO5a5?`Z_qA1zQP4z{hx|}^0&uuU-&meu>}{AJO? zP@o>EsG(5_O&znaqN2!Gy%2w$92@Wlp^Uety(%8^SyYkg_QJE*-`);A?T-X~)&5ET z#`)oz_6Eh_`i6)<8b#lo%VcaI2q)*#CPs1=_uNrDcg~^;2g8xGt7Zpk8t1n!G0`8Y zJDa>H&{*PcIGd)dbaIKLw!Jf7b@{||sA|uxDjQ!i{T!uA{8%n0H`TYVN;D<@PyOq($HSPt8X~!KbvZXe^HY^RP9GqRsKl(qL9l#i?&yll@yjs^k>mcX`JtmoJ$Fx zQ_;G!6uV?fZ7pU<`?}_wOEKObsGHxu0IwGDR`a~6i-em(`fNL66w8!6Qzpy8nS)uM zyzQiHn>ecVwI*Shi$LGkW`vs})qdjejNURNnc=f&pgVz~Z5!x*ggaxFWH$H0J z1F1}Ju87A*{QhM^O>YV{2I~E?WQ_NPYETBD`l%K$8EYd+=Sn>BbWIM2{4|SKQJzow z$`zY~}#)@1Vj`(RR7KPZNE`k|>x{$B2398wFP)&GAw8$6rlMwKgKG$xwH#SvePzup&F*y^R+7eVtSe@nuNiqfTx{tz#Lt+p{Y z#ohmJVS&< zbi6;<;Exa@H!=k#VQHR%GMn<5eHZd7etMTXlANCeA5QOv^FY@|uy#s10s z8%Sf?l{3xG0=^*5gmOs4(xG2@@uqM?g{%x%jF~PA;ie6?;7aQofOwCwltNU4rz;V> z_vNE%nvZJ@o(@p%SPI}>M?Z8?P<62L;VDLwSb87{!8#0%OIAaJGWIeWk7w1>iF`52 zBR-p8y%3)2Q9cS=4?KsVVUJv&hpKR`6@Of#5BANthN0((BA_`o-A|P3x}XftJtm{J zM2!cwOYsawkH~0=o!eDT6D7V9JVhx7RU4PpqJCW#^GL&|p#Gplz-`A8Xk?ONHQ7y9KLq?fy^*8W{rUub9;`^U2T~>u&;4#9P z;IZbDUTIr*YwMW`!ajg8p!Z)GdGg>%AJHWb9IE(n!sdyaoP*taq8V#R^N?clD2mMt z=+K!-H-l=on(V2i_?LobluGKN4oxNx^)$22fkHMDDQ26sbLuqBZnm2}s?sApJw?@e zDV;Ec(T!UmW_ys$cB-#fgi_s`NBlJsR8D zxPE3Jvf0dpi$zeU@$MVj3fcvog6>qSHFY8yGc2`0b$9OYD(W;~Ns z-ELjv)h{Wm=}0yYu|59Cq!&XLI&#)j3)*b!NJv4;R`_wiTF8!MMxyXQ*5XFwsikH- zr*7E+XKqyEL0$Okr5Ope;XjTVBvNC;uZ2^mrluS2yv8+!#igk}3%qw|xsO9iooRby z*}Pd@^G>d_Wj{G=)*tgH4{6zsXTW4?Aw2fP3(Wke68!WTh1vXcl3(zB{-WDAotmGS z|KzPd7617=b>q50nO7b8v-P1_V_N3C{Odm`i_#p~AFbS(>KU+koYFM-|-r*ApM_qJF*1$LO;oSDru^2vA|*=v0ecL-(r|n`$v@mJU7e z^{5uS)ZEiqb#g*52dHOi0h8$rHYCR_!<$DeMmY*$++y;hp*->Jc7VkK zu%a3j!OPHA^y2-@JWBhqr%pn4;yJ{V&1;87r(&X%xJc$(s#i*+aN$x09|Ex35e8fq zXkK)q7po8m8@_zCLV&IVc);Pu!rUI%pgkbd8Q9d#L_da3Hm?y)j7Y(s^yLXXmMTn@ zay4ys#Mgk6eEc4~e0~JSYz1~Ik7G(!$RYQ-`i(W_GfVMzYinV>zdq3H!>`^H>KZ>h zdJf&^F*Kf>tZb~r7vQfp!>fnXd(YG}^js$tbb2GyJa%ne*Jm6{Kd8L=AA6@HJM7&adc4<9-ReJh#*ses?n5t5nfkKg zbWQq`<>1U^KkS$o-Fv~PxpzHtcOPF_`GA8REZZ_?~o`)0u!p3mJJkC6~Zl3XEdtSI|!8{!A z{df!#lVvv4!0rDvpIh)ZtJvp3radvP?KSrQ<S-ama=VI2L z?hhaQvmCl9%erKc&;7;zY4%&YK3#9U{@Vo&L++{m+j6dX$9?y{W6ixjdHv)y zM~~b*aN@)ECzkJCX&t=pqfI@Z+*p(HNYAf54=fnJ=+SSE7aq83#cOYO`|SO9>!h65yeQngZ*Gw1xyvB88;aeePns=h~ zW!D?W=8S&j_kYMbI$#7HpVl(%&F9j5ho9X0?L&R~KD}qwty}iLoP5s{`?l>-`g7`|%RrgOmO`ZSROidi<{UvL1V_@SYPB-rVxm==!H$x%2M$G!gP{Y#E)?L6Qe)9SQi(Nt&k->w>2bK{r=^{$zZ|jzel@%5KmJnZZ&{Qd?D~;q zVQ6vp*M2!U@YQv5m%W|x;)HkW!Y3a6{`)TvY$!hPNSD_)JW%=ZU2nXxa`P)Yo<8)} zu<2i)nDURh$6l$M{rJ7_TJ~OaasGqj-yZ0CYhriD{r{Yxfx2NAcl>PGIy}#aebWqP-$1i>0P|a@!d|mzd?RPC`a%`?w@3Yu%zbN1R z*_t|Qq~mNdUpe8)EuEI_dvDjk-IovR{&3Q7HXOOZb>Q_69{KXv@;)ctalUrs)wMe2y^{`1t52f|CnJ(B+6T-!Ab3zAR2Fw#;xQcz0H4p zU{}?@UOm0gSNd`=ZRvZC?Oz;my;;86H2KgTZMbhh-EaRRt@7}sae=aTmW0MkSn$fO zV{_j)TI)Pf@YTq-hR)da_sfh|J98H!x=*lI3L=vA?Z)uPnhRk_oX^` z9hOp;qnm>tP4HUq-}~^dvI*Xj`#^ZZQ3sEg@vtplGEf3@@nn4x7 zQkC0dE#+LVxkGFQ}8oOR(IO5w)mL-0$#h}D2IYY(H z^<_A-@rj#1{fJAI%lQh=?QnMDb6Nn}km!jXFg*jO3Sw%6m3}5}@99pl$wIsJe|b39 zBL{dRhVxMjfAw-=4Z(~2SQ5G{+HbX_^LwGdhMBbF2K(SxM%rYl!+))CnY!=4QLZbUWYSu zBW&8sJa~uEb4CvMJe!4gDEL%M#J@01^sDz`4eH@GNATPwmT95_iG7MuC-)-99?J!D zde+a?hJ4BWRFn^+T}{Y)V?xWhug;$HBFTB%a%X1#f0p;L;-e6)iAvk55IH|1`mg$t Xr2VfzrT)9%r}>Au|Nry - - - LibAPNG - - - - - Sequence number of the animation chunk, starting from 0 - - - - - Width of the following frame - - - - - Height of the following frame - - - - - X position at which to render the following frame - - - - - Y position at which to render the following frame - - - - - Frame delay fraction numerator - - - - - Frame delay fraction denominator - - - - - Type of frame area disposal to be done after rendering this frame - - - - - Type of frame area rendering for this frame - - - - - Indicate whether the file is a simple PNG. - - - - - Indicate whether the default image is part of the animation - - - - - Gets the base image. - If IsSimplePNG = True, returns the only image; - if False, returns the default image - - - - - Gets the frame array. - If IsSimplePNG = True, returns empty - - - - - Gets the IHDR Chunk - - - - - Gets the acTL Chunk - - - - - Get raw data of the chunk - - - - - Modify the ChunkData part. - - - - - Modify the ChunkData part. - - - - - Convert big-endian to little-endian or reserve - - - - - Convert big-endian to little-endian or reserve - - - - - Convert big-endian to little-endian or reserve - - - - - Convert big-endian to little-endian or reserve - - - - - Convert big-endian to little-endian or reserve - - - - - Compare two byte array - - - - - Describe a single frame. - - - - - Gets or Sets the acTL chunk - - - - - Gets or Sets the fcTL chunk - - - - - Gets or Sets the IEND chunk - - - - - Gets or Sets the other chunks - - - - - Gets or Sets the IDAT chunks - - - - - Add an Chunk to end end of existing list. - - - - - Add an IDAT Chunk to end end of existing list. - - - - - Gets the frame as PNG FileStream. - - - - diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/QuickLook.Plugin.ImageViewer.csproj b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/QuickLook.Plugin.ImageViewer.csproj index 7866081..a55870a 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/QuickLook.Plugin.ImageViewer.csproj +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/QuickLook.Plugin.ImageViewer.csproj @@ -100,6 +100,9 @@ all + + all + @@ -109,9 +112,6 @@ - - .\LibAPNG.dll -