From 5584ca82ada5a45affa5cdc8ce73a10a525511d7 Mon Sep 17 00:00:00 2001 From: matsuo Date: Sun, 19 Dec 2021 21:10:47 +0900 Subject: [PATCH] =?UTF-8?q?aRGB4=E3=83=81=E3=83=A3=E3=83=B3=E3=83=8D?= =?UTF-8?q?=E3=83=AB=E4=BF=9D=E5=AD=98=E3=81=8B=E3=82=89RGB3=E3=83=81?= =?UTF-8?q?=E3=83=A3=E3=83=B3=E3=83=8D=E3=83=AB=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CSRender/CSRender.cs | 42 +++++++++++++++++++++++++--- CSRender/Properties/AssemblyInfo.cs | 8 ++++-- CSRender_ReadMe.txt | 1 + bin/Release/CSRender.exe | Bin 75776 -> 75776 bytes 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/CSRender/CSRender.cs b/CSRender/CSRender.cs index 25f739e..ec64814 100644 --- a/CSRender/CSRender.cs +++ b/CSRender/CSRender.cs @@ -170,6 +170,41 @@ namespace CSRender { return pageCount;// ページ数を返却します } /// + /// imageをRGB3チェンネルbitmapにRenderingする + /// + /// + public static System.Drawing.Bitmap RenderRgbBitMap( + PdfiumViewer.PdfDocument docG, + int index, + double dpiX, + double dpiY, + PdfRenderFlags flg + ){ + var bitmap = docG.Render(index, (float)dpiX, (float)dpiY, flg) as System.Drawing.Bitmap; + if (bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb) + return bitmap; + // + var cloneRect = new System.Drawing.RectangleF(0, 0, bitmap.Size.Width, bitmap.Size.Height); + var format = System.Drawing.Imaging.PixelFormat.Format24bppRgb; + var clonebitmap = bitmap.Clone(cloneRect, format); + // + //bitmap.Dispose(); + return clonebitmap; + /* + 保存時にBitmapのクローンを作成し、その際のBitmapの形式に24bitRGB(PixelFormat.Format24bppRgb)を + 指定し3版RGBTiffを出力します。 + System.Drawing.Imaging.PixelFormat format = PixelFormat.Format24bppRgb; + clonebitmap = bitmap1.Clone(cloneRect, format); + ref: + https://maywork.net/computer/csharp_convert_to_format32bppargb/ + https://www.webdevqa.jp.net/ja/c%23/c%EF%BC%83%E3%81%A7%E3%81%AE%E3%83%93%E3%83%83%E3%83%88%E3%83%9E%E3%83%83%E3%83%97pixelformats%E3%81%AE%E5%A4%89%E6%8F%9B/968763414/ + https://gist.github.com/nissuk/888601/ee0943dd0d35dc9c6b47358b9e1a89af8cc9898b + https://stackoverflow.com/questions/28448474/render-pdf-page-to-bitmap-using-pdfium + https://qiita.com/Nuits/items/4a2fbc0f4e8583bd5531 + PixelFormat dump https://maywork.net/computer/csharp_convert_to_format32bppargb/ + */ + } + /// /// pdfのページを画像に出力する /// /// PdfDocument @@ -193,9 +228,8 @@ namespace CSRender { using (var memStrm = new MemoryStream()) { PdfRenderFlags flg = (PdfRenderFlags.ForPrinting | PdfRenderFlags.CorrectFromDpi); - using(var img = docG.Render(index, (float)pm.Dpi, (float)pm.Dpi, flg)){ + using(var img = RenderRgbBitMap(docG, index, (float)pm.Dpi, (float)pm.Dpi, flg) ){ img.Save(memStrm, System.Drawing.Imaging.ImageFormat.Bmp); - //img.Save(memStrm, System.Drawing.Imaging.ImageFormat.Jpeg); /* // ImageFormatJPEGの時 dpi = 350,TIFF @@ -225,7 +259,7 @@ namespace CSRender { img.Dispose(); } var bmp = new System.Drawing.Bitmap(memStrm); - if (bDump) { + if (bDump) { echo($"bmp=w:{bmp.Size.Width},h:{bmp.Size.Height}"); } //Console.WriteLine($"OrgReso({bmp.HorizontalResolution},{bmp.VerticalResolution})"); @@ -461,7 +495,7 @@ namespace CSRender { if (pm == null) pm = new RenderConditionParams(); PdfRenderFlags flg = (PdfRenderFlags.ForPrinting | PdfRenderFlags.CorrectFromDpi); - System.Drawing.Image img = docG.Render(index, (float)pm.Dpi, (float)pm.Dpi, flg); + System.Drawing.Image img =RenderRgbBitMap(docG, index, (float)pm.Dpi, (float)pm.Dpi, flg); img.Save(memStrm, System.Drawing.Imaging.ImageFormat.Bmp); //img.Save(memStrm, System.Drawing.Imaging.ImageFormat.Jpeg); // [注意] PDFuim用にFlush()必要 diff --git a/CSRender/Properties/AssemblyInfo.cs b/CSRender/Properties/AssemblyInfo.cs index fe94bcf..6e3a7da 100644 --- a/CSRender/Properties/AssemblyInfo.cs +++ b/CSRender/Properties/AssemblyInfo.cs @@ -33,11 +33,13 @@ using System.Runtime.InteropServices; // すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます // 既定値にすることができます: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.3.1.0")] -[assembly: AssemblyFileVersion("1.3.1.0")] +[assembly: AssemblyVersion("1.3.2.0")] +[assembly: AssemblyFileVersion("1.3.2.0")] [assembly: NeutralResourcesLanguage("ja")] -// rev:1.3.1.x:2021/10/05 :不要コード削除(Windows.Data.pdf) + +// rev:1.3.2.0:2021/12/20 :aRGB4チャンネル保存からRGB3チャンネルに変更 +// rev:1.3.1.0:2021/10/05 :不要コード削除(Windows.Data.pdf) // rev:1.3.0.5:2021/09/14 :/Paraで並行プロセス最大値の設定追加 // rev:1.3.0.4:2021/04/29 :Helpの記述抜け "/Result"の対応 // rev:1.3.0.3:2020/11/22 :/Result <比較結果> を実装。diff画像を出力 diff --git a/CSRender_ReadMe.txt b/CSRender_ReadMe.txt index 59aea8c..867f155 100644 --- a/CSRender_ReadMe.txt +++ b/CSRender_ReadMe.txt @@ -1,3 +1,4 @@ +V1.3.2.0:2021/12/20 :aRGB4`lۑRGB3`lɕύX V1.3.1.0:2021/10/04 :UWPpAData.pdf̍폜A * UWPpR[h폜Bʏ̃t@CANZXMemoryStreamɕύX * Widnows RT Windows.Data.pdf̎gp폜.PDFium݂̂Ƃ diff --git a/bin/Release/CSRender.exe b/bin/Release/CSRender.exe index 006e3d54e5871083a3d43097fe0df579a38e99a7..f919e8b19a4d836cfc8d6140ec2e6bcd24fc0389 100644 GIT binary patch delta 12940 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 VIusMralLC^TnqyHU|dWO{5NFL!4Cic delta 12595 zcmb7r349gR+4pm1pSkoE3vd9jB1PKD-f`AYg!sf!}g#;BE;pQfa#UdJ} zVgainC?F_cYytPUW3@m9-xv3&SeHV<)&*PrzW+J*2C(1PcgfHE=h@D)oik_7Ot9&I z(sV$%>zB&fmi7-?S8iAD?agT5J=GyL)LFtJ(z&*?n%x-wbOup;J`p3Lu0)#q0MT93 zood#@87&QFlbjZ57`x1QK{^-st#mQFyls?x9%ECT+m$*t+4)k*2~NSdh7m+oTqP>2 zsLr`#k`q-Me06XuHEKjk)=%=vI%l0)$ELUapoST{+zIISv&-6c=}RO8DYM41sckn} zF$U%?R|W7{*D&CZu2H~|ZjQflF9E8aI^fj;U-odh+j}ms%3B7UC+G(R9^#VKzUJU% z$Rl3B^BV{V^@t$9yM6OuF8R9yd-%D7se)eaUk|!#pcimLU^vhTRH52K0d8a1uy5;S z_hrMlQ>}3Tifgn1E6?JCoqT*=XV9`6GPe29MedmDJQzH{u5%i)W*OJRQNDlW_0ES` z1K2Dl5_zrIlVE9}v|=iT^Y{->bZ3f_cisxSn+r*Jdt=?w3B0JOj8 z3gEn=7;t$}QIt0&;7+un4fBey!icKwth!?5+_v_jD;aFk9{LtP0}o#p|G+MCj+I3I z?I@>9_akh!^KJLOXkA%+3!CE{idVAUj$Jx5?_yqa?Z6TgKzs0VZ-ejljB{Qx8J05G5@HsJDsJD`_CpXdSRJ)_}4T!M;LJ_7mimLS24 z3TQzPA8HugH4=kfxGt%{idjzZ=RNa?I!UV&Xy5P6g8DAdEYeSoAFPEBb^Ufn|9_(;Bg*D2*smF%#RI$15t>BhE(^Sryx$Us?-s z{WXQOKx>=~vRsaov2f=8#9yUrQXGh<)WX>SDd^aw+YsDC?`7R0gQunNSOoSreZ)9KfDa;12)M^XQ0@I zU5Mk7u%(D~<$T!l+$$d!iDCJ*ff$7KL7<-i9ZCESnD{*)z8erU!a*}&*c8X)X@j0V zV;MbTX`Asquq_Fg+|IeaS4na&_wponV3pYcEAbR3U3$QkfD2e!iDz)FIQqf3fQ9?O zO0N?$pe25mT6x94%gY^bXOb#6b!;GMw`yccPz|U7C)m5RtIeDI9KuN9IpM_fJZ`a+ zXvft`yZ~%?(V5yisx_l6iI<$4d-r8QXIJmI=Vj=6T-Jb%TZ_NqeAc@h&%t#H$dOWoKlG*LbLX0GF)jiPu4ddr%Oo{CqU? zf8jIv-#X>9e*#WJJkg4>{8{<48vcNIev-mr!My=4A|>9$CGkgqTQU;+agF1dZpBBS z1WVEq2f6xB9Nq%B!k)6meDe- zFqhvZ_M0yCHwt+!m%q&&{|8s%hQel)SHF%c?+IE^mT4S%#D=jfH3|spjFvHZUJ+1O}$>?cmYe*N)KoClob zZ0xt9I?8h&DVkXSDQePWMfEC)8b}h@p0)bVArzYe_pDJ0o?{qOU&&|zD*e=%-@kkc z_Fm1U$FVFetLz*pz7WL9>(MHH1i&R;&od1P-(EG&%`uH>d#`p$x#HEd@ml->$kSVb zLb&rO+d0|4BzhEM8$RQ%rC21^@MlmiO;3F8^c+xGnuA;pU~7`%XUyVXz(h)X$;W+l zmUWS{XF#;73$OTIh%HSRMk4hCi%{cVxaGgN(xt>Ph=rY&I1V!LSI0lFisd@v2M!*< z8?+RUQ$>z8U=jaMJvuK8oG~d6X~+#H#i+#BxVR+oXwVanfT>s@HTH(%$kOh7JH%eD z6>EvVL9_H62tfZGw8xg?-*6e$ic+jJeCsS3)W`k~l7SwEo@5+ubDkL#iSeh*&3v#J zl6EE>IL8JRPT<4QtV@SE?n1a^(wE`eJN z_n-6d;F4S%9W#9pU9gl$ZKe}i;t}VI!8vT3qYmkD5l>JI*44!Kpd);t@cZOKTnqjy zCorzi#Cq+K&P2o0cj=I#JihFg@-9mar(m?S4=4G(YxOv%VWRWwkZe}y92t@`@CS&r zL^&}1Ku(|tEAbD&nX_<#A2SvIr?C7{;7{a~4=w5Wf57m2M<(3c{B0!AumFKAO|t>ZzEpSa3kW zY27KPY^aprDd@J{^+TbF%bZi{t3U@7aVQ9?^`pVbq87-wo1k_;6*rM{pfW#8!I&N* zvBWB_G-7zSkcah;sN9)#`aIgio$`siWLS5cdlwH&0>2+tp-o4D4VqIny!-HLIB8;B zaTEHjEW^&C6jww_mQ{oJNxPP-EurR`xQ%zMpigQX1}5NZa67HTV-h;KefSlAtZ7T! z9pRrCW@x4psVcU(ut!%Pi+i0>RhP1E&f2P;coExIHI$v>Xw_Bh66gHt-mKVJQXS{7 zAbg+d<7}-i?S4KOPv%go#V4ZB_oT*J#H|QQcupsv=4VppRCSMhZW~m7ZXEX^v^eH| zyqSBsc{;wcOJrueK2V1 z=@YeEYMca3Bkp;nVG!aLX9U`y%Z=i#CO)WLY#jc02?*yF00P z>3zF@)JyID{?RMwFF_vCXYnMywcC9fZI(DThd7p)?LM16jy~_T>2v?{UPuC5@_>s= z_5#CnyQ|qBrb?hqK#L z>>x|@pdj3ee7i(B-s0+Vt3de=vQJyf}5u6&(r~!e)G&NX>v|bDF0#tOaD14c@=eNih>A(RPjI38#0*sLdQ2qurI)vTwanA%k;SotamnY5(-YJvy1UFijudzKIbLt_ zzJ3%;dcs}lKHEWK2l%c8*o^urJytAC@5iPFESeTQgzEo1;tHG$S;4V^n_-pV@B~NgheVi+# z0!lGI{m%QE&ADW;VE4+LEuu1{`{HF!=B65Me0l&1!J$VkC$ z&^dPw-mG{sH45i?(-@Kq{qzgeSwrX21d`#CzYx^G<7C1Uo}Pg2w={rilhh35Okp~J zt`er$PhmO$hiE=w%0UZ42-v z_cq}1=ng}pw|#BExyo*%kXC!QfIeV81?>x-KIqY*@N=M-DK9|Y-`j^Y-2ZM|=;`xlZCUgagi#dj)qw95PkB+o{< z{7_^!aJWRKM%`q^h3gyjkMdUoHTSlY7Euxpz3QNTir9=D5uL92DKvMS1V} zd6c((BVhTNmgKdj+gOG<%ghSBD35}AxO4$9O=kwUx%^r8#lTlYa(e`Q+|9@OeLUFj zJrkf6v-|%Ee3$o1Xy4K}#*IExX>Z$06P?MXCj{3@TRgRRaPzOv zd%pc6Y^p|mIZidfeRna*9LW&B5ddxbHUb-l)TjnmX@U*yC z=tTHYR3tcu-lFc-C>ogIcCwz<`BW#kHHI7=Y>i3MHG)kqp)qv5;L=r$p<7Pt{CI9` zNppspJxLx*J2PA;d$={0o=$VL#~5i{KqD{V$t4!> zODXyNcy5}acSAF+33Sn=Y3|3sY;f}g*Gk6&3#^H>ePFzX|#AEce;k^ z)J@j4^!E&RlV_849ZkWD6wxcR+!JTB=|2UxoYuJ4n6qg+-W_-{kLZtBb7gqXpMOG5KSwk$!miGev&J6$q|{vY5}+ zOy8fSYatv{c>EUX4rL47JA=Dvp^K#~*DbU=!~IQge-d0e;4Sn{Mt2fv-$H)8wq2<6 zH@KD9NEzJ}^7|!vT=)BB>SO!;3Vjvv`&C-5aBXFbGer_yBH@T9 z@>(n~J)l4GlIRaXUcuWwo?IcqtF%t@DGS@%v45!0)%{lnD8v+!;Wo zsYpek8L(G{pEF~5Lj9qYC|QP!Og@BEM95B49#R(}4H3-5Bb|pi?)Lj#BBc9YLUyLh za3bRcyoD|@IwI1#K~$U&)h|ZUm;#*B8T~4WndoH3+dQMIk&2vAOPGQ)59MSjP8P*kqsLO2S~2vHj1!OVT1MG*$QqX3nN7sslo`a zv~Z-0W-=Nk-1QPOdbOZ;iG~~a(!eN9KOW$I=8NjjNEq=^67e2%F2f-)tbaxi3B?Jq zK(@oFBqWS_MtQAqQ6FD268#mGG5Qa&^wQO*F)c}By5cn65YutkFe#M9a6;$DpBT`h zQlKC2BB89LAFnQ)sTMd!;CO+x0;dB*cu(Lq3k5C_m=f3y#D@>Y(G(aE7!z11@SwnI zDU_9sXJ;?90O*Z`XdlLwB*83J%V{mtesXgWZIE_EhSFAPgufOzH8P*}O6O-c2znW9 zg-tf_*~qQ5i}bA9X)m$ZozyNo?4?CfhxSQ3d~4~5^c;?Jt+XzDAMm)c5uX1MeGE9& zeijm*bh4FHdp~tZujzguML14yhk%#FLNIzMdMEI^2zT^d09-DbQ4dLZ7MR|pqt zfqo=6Jo`i7%dt;sE&ZT=3A$h81Z;B5pQwXcvSgM8OJ3d^u>k9!93#%QCSg?0c$Iw^ zllk$J536LR%$)9Z=K6o?m zr$`H1L2HdQY%SXv+W@RGHnVE^IXw=X=zo-bAtg=g9fTa=k4W9%0FM5Ur1Y} zlaW=x;_SPDQzPr8>2g`*Lz*qHR(?HcZo%N!%}1f=7kXS;BKtjirP;C)dR`ieU?rIQ zsBgbCQY6=nW~pBa*C&wf(a?O*d!j#r*0T(G9Ok~BjT5V3HX9y`$+P7-(R_J@%v;?m zAJt3bR=L%vWV7XOV)^n`sdskrZmCs1-&-P2mwUy^~eL9e1!cLJ-bpAGmHC7(pLFZj{^l?s~sZb5%#+MsytqrX}=|(Vy*5Yaw{|Ob>x(= zISHFjAm8EsQfAT|??!xZ{wT7M4$7m|6Y@d%8?5t_?2^E@7{z_g6O%GeOv*^~sYF?X zJ`GlGrbX_Hl;k4OuIX}DRDX-eYc1{fv?xd9RpC3SP#PA#UFnc_`0i4^kQce*>>wuV z9_1kB`(9;()LY-Etc24x<=3M5w_t+iODAQ1LvE06ioK+q61{9?PkG;0Oy#KOD9}N- zdgFElCZ(Z~W6Bu8#FQ5GM}=4HQER2U<)}Iy@;sGGid9~BrCO-qj(}uR93T6LlHE8hZjx->4dk)}&WjhjFpw3n*Y$~xHad#6R+gjalI zQLW@=Z-6?K^)N(yiER?=U?C)oHiiB6rZO`bX*# z*nh63fXCI@%GHs7stc7FvR7NEoQE)caG-rBgf>XxCtZGvGR){Kbu!lc9^Wstd1A`2ts<2U>FY2iNSJFMa9``w6)9=+6El$+o`p)jq0C)%RR|s+Fr4GTj@q^BW>qv5;J$D>C!i# zMP2nLgyiXr{6K7y&O=k{aNJ}D>{;W%Q+;9vDjL{dmLAmsm z?xhMk0mP%n@Zu}ei6odYg5h7~ZMvKKL$Q{I0Dns(3<;n0xTA;Q!p5%OACgCfyInNd zu<2zX*(Yq?gd88tg`W=L=cw@Wh46DscsL2UP2Y%7ryxlh^rLWOG9K8&t~5*vusYDi zY!*xhL2grxz%c?Z6qaAG`Nlcqq7v6Rc-QX<%%O{bMKl>$MppyR6*xrTc|v{x&4qk| zkX*qriN8X$Ks1*g1vb!=z(#t(wUK^Be)o&C9@s$}fuGPeTInX%0-7-{kr~&v2uTZj zir)2LULko=$UkBZh1?xN@`;d;G^m%ei63leL%oIi`LAMBcgP=DG zx?RvO3c5qkp9q>^xAVJ4Ds8|fg@@T7kf|G~#9as+;I0Oac25V^x>LY8?hU|3cRMgy z;_kp@fSY0Uk9HRVOWf7K0q!P^yL&)jmCosD0^1F4(*eXNQ;Y)E;!EO8+DzYJ#oWYx z$?jz9SR1=ao+ZzdACvznPf)H@4l3U$_}4n>3iUDdb#=dbSe27nfi_N?rrn^Ww3XU@ z+HUP$eWQ+P#%CxAD_M``y7133vb(w@d>@t}8;l!_;ghdQ6}}>0KODQJu{^0%8Y#Uh zeJt5>Z@EccDd#GElu^pf%A?9N$`8tK)E~8h`Y7GeiCsWr@F|Vhh185cAmjXbG4%=~ z6dO;AAyAt55mUx*=g(_6|KiYk`sWROpL$@s^J zH}qy4pZWO~2l~v<2l`^1a?dgZeHedh_*dB*`V5?j(?2}rHym?DjoBiC%%v=6@{Hb* zIrNCUlszJULtkq?>1!>3--xu>xqrrUtiN+$Mppj7x?VJN{`9$5Uo!pLt1q2?{k2yQ zySA=wc7q^q9_Xx|`7A8Q&&p;4+vd&s2XpGLnb5ZX8p&)soam#rMQ*T+wt}TMclY1F z`me8b|7Ls5#+svl`0KZa-*vWc`VIa;Y|TSM82JEFMooe;!qZC$;&KildI*j#Sz^=bu7vQy7E^EQ_-)p0gg zmb7~nVqUL`zZ`hICLA4<47=(5ASr>Smkp5ZT;_bcxo`5A*A=px9%T@8Fhj%TC^N%; zCc`phk4FM&>!YA#i;N)8V-y*G~1elc|0NP8?7ehF+im4TFzq4te=1=oe@X z1e#-DMblu+%NQhF5_ceMb9q(Gg}CXxxm~=vET)iqPYp7RPDasS!ZX0dvUC}vD-7FA zRp2d@)6SibWG5@_RJC2Dqn?F<=3Y?ANM}m3PcJ@K}DByFX^wvow-& zO)pN!n6{>qj=H0?=P9q(D3D?KqZj9GzK~Dx?xzN!G3cU~uLVByrBL#&UbSPbgrVQ> zSkHR5{d#AU)MmG>nI7Kri-WiFEs1a7{3F*P{GSYmg7-X|#k%@)-A}of{>fYOo8y0f z1-MR -- 2.22.0