From cac3990ad40c666aa1c7e209f8e04a03f4f4df33 Mon Sep 17 00:00:00 2001 From: ZNC27-20252136 <3090507286@qq.com> Date: Wed, 16 Sep 2026 16:06:51 +0800 Subject: [PATCH] Initial commit --- .gitignore | 1 + image_proc.c | 99 +++++++++++++++++++++++ image_proc.h | 28 +++++++ img_files/0.bmp | Bin 0 -> 23638 bytes img_files/1.bmp | Bin 0 -> 23638 bytes img_files/2.bmp | Bin 0 -> 23638 bytes main.c | 205 ++++++++++++++++++++++++++++++++++++++++++++++++ user_proc.c | 27 +++++++ user_proc.h | 10 +++ 9 files changed, 370 insertions(+) create mode 100644 .gitignore create mode 100644 image_proc.c create mode 100644 image_proc.h create mode 100644 img_files/0.bmp create mode 100644 img_files/1.bmp create mode 100644 img_files/2.bmp create mode 100644 main.c create mode 100644 user_proc.c create mode 100644 user_proc.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adb36c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe \ No newline at end of file diff --git a/image_proc.c b/image_proc.c new file mode 100644 index 0000000..1b767c3 --- /dev/null +++ b/image_proc.c @@ -0,0 +1,99 @@ +#include "image_proc.h" +#include +#include +#include + +int ExtractGray(const uint8_t *srcPixels, int w, int h, int bpp, GrayImage *outImg){ + if(!srcPixels || w<=0 || h<=0) return 0; + int srcBytesPerPixel = bpp / 8; + int srcStride = ((w * srcBytesPerPixel + 3) / 4) * 4; + outImg->width = w; + outImg->height = h; + outImg->stride = w; + size_t total = (size_t)w * h; + outImg->data = (uint8_t*)malloc(total); + if(!outImg->data) return 0; + outImg->rows = (uint8_t**)malloc(sizeof(uint8_t*) * h); + if(!outImg->rows){ + free(outImg->data); + outImg->data = NULL; + return 0; + } + for(int y=0; yrows[y] = outImg->data + (size_t)y * w; + } + + for(int y=0; yrows[y]; + if(bpp == 8){ + memcpy(dstLine, srcLine, (size_t)w); + } else if(bpp == 24 || bpp == 32){ + for(int x=0; x> 8); + dstLine[x] = Y; + } + } else { + free(outImg->rows); free(outImg->data); + memset(outImg,0,sizeof(*outImg)); + return 0; + } + } + return 1; +} + +void FreeGray(GrayImage *img){ + if(!img) return; + free(img->rows); + free(img->data); + memset(img,0,sizeof(*img)); +} + +int Build8BitDIB(const GrayImage *img, BITMAPINFO **outBMI, uint8_t **outPixels){ + if(!img || !img->data) return 0; + int w = img->width; + int h = img->height; + int bpp = 8; + int dstStride = ((w * (bpp/8) + 3)/4)*4; + size_t pixelBytes = (size_t)dstStride * h; + + size_t bmiSize = sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD); + BITMAPINFO *bmi = (BITMAPINFO*)calloc(1, bmiSize); + if(!bmi) return 0; + + bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi->bmiHeader.biWidth = w; + bmi->bmiHeader.biHeight = h; + bmi->bmiHeader.biPlanes = 1; + bmi->bmiHeader.biBitCount = 8; + bmi->bmiHeader.biCompression = BI_RGB; + bmi->bmiHeader.biSizeImage = (DWORD)pixelBytes; + bmi->bmiHeader.biClrUsed = 256; + + for(int i=0;i<256;i++){ + bmi->bmiColors[i].rgbBlue = (BYTE)i; + bmi->bmiColors[i].rgbGreen = (BYTE)i; + bmi->bmiColors[i].rgbRed = (BYTE)i; + bmi->bmiColors[i].rgbReserved = 0; + } + + uint8_t *pixels = (uint8_t*)malloc(pixelBytes); + if(!pixels){ + free(bmi); + return 0; + } + for(int y=0; yrows[y]; + memcpy(dstLine, srcLine, (size_t)w); + if(dstStride > w){ + memset(dstLine + w, 0, dstStride - w); + } + } + + *outBMI = bmi; + *outPixels = pixels; + return 1; +} \ No newline at end of file diff --git a/image_proc.h b/image_proc.h new file mode 100644 index 0000000..3346c54 --- /dev/null +++ b/image_proc.h @@ -0,0 +1,28 @@ +#ifndef IMAGE_PROC_H +#define IMAGE_PROC_H +#include +#include + +typedef struct { + int width; + int height; + int stride; // 连续灰度数据每行字节数 (无 4 字节对齐,= width) + uint8_t *data; // 连续内存 (height * width) + uint8_t **rows; // 行指针 (rows[0] 顶行) +} GrayImage; + +// 从已加载的 BMP 像素提取灰度 (支持 8/24/32 bpp),源为 bottom-up DIB,输出 top-down +// srcPixels: 原始像素 (bottom-up) +// bpp: 8 / 24 / 32 +// 返回 1 成功 0 失败 +int ExtractGray(const uint8_t *srcPixels, int w, int h, int bpp, GrayImage *outImg); + + +// 释放 +void FreeGray(GrayImage *img); + +// 把灰度图转换成可直接 StretchDIBits 的 8 位 DIB (bottom-up + 调色板) +// 返回 1 成功 +int Build8BitDIB(const GrayImage *img, BITMAPINFO **outBMI, uint8_t **outPixels); + +#endif \ No newline at end of file diff --git a/img_files/0.bmp b/img_files/0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8fac5a600e5555740cedfbef49ea48c6dfd7d818 GIT binary patch literal 23638 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 literal 0 HcmV?d00001 diff --git a/img_files/1.bmp b/img_files/1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..53bca277e18c5e647f574ec23af3f4bfbdb91511 GIT binary patch literal 23638 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 literal 0 HcmV?d00001 diff --git a/img_files/2.bmp b/img_files/2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c2fe0a744bc5ef1d4a00ba447a440626c7e0e7c8 GIT binary patch literal 23638 zcmX|}1z;SQQbM zv|5_#>iX;dyQgOtkG}lI9=lDn?%7l1(TBO+;?}gM(>|}ekMuh?p41E4OjA>nX>M*d zEiEmkwYAl>wY8b{_IA_J(P26}J55(tm+9{AHa$H(rnk4(^!4?b{{DV5Ffd>S2M3MI z3Lot-svb8}{X ze%|cgzuzn@ESSZ`MYFWDWR{ng&C1G(SzTQXHg!@T+Co93;z-ZF2${kA!N{J44Nop;QM6DQ2clPAroQ>V=7 z)2GduGiS`%vuDk@bLY(Y^XJWl3m44Aix$%a_fSD_6|bt5?mnYuC*6>(|Zt z`nuWJ*f5)$n`Uck%iOqe!`!@i)7-js%iO+w+uXTx$K1Vp*W9~z&unjRoBQ|gn+Fdb zn4O&+^YGzA^XSnd^Z4;&^W@1B^X|Lvnx{{nn)lv&&%FQs`{tuQ>Z8m@fAmM2kNKF7 zF(3P}A8S7D<37%O{KtR1`GimS1oMfX_=)C|KIxOpCx7xMn@{Z{CG zfAv?Julbs%Pu>{nvlJ`G#-!2J?;I_>Jb9zUiCHH-Gatn{WA+Z!zEc zt>0?C?c2W1eEYY5yZMgq_zv@(-}#;9yT0qY%y)nHcbo6|p6@Xq{_uy*_kQp9n(zC* z?=#>3{oikX;0J!d{NNA%p!uO6`XTefKm5byBOm#Q`H>&_5%Z%z`lIH@e(cB0kN^0O zo1gfJpD;i9lRs&G>Zg9n{Pa)%wE3Bz`5E)GKl`)h=YHJE%zxkWLX@2Xse#`v!Z~wOW zo!|K#^Si(MyXNaYIF{Pkb|wfURB`5W`MfBU!Q@BZ%Z%-{e0-cc+{^_6o$^7#_|Fij*fB6^lumAe5=HLG9-^{=N`@ft2_>ccE|M{Q)Y5wcK z{>%LLfB(1npa1zE^S}T5zed}j$LIA1h}`1yZ=E=K^7P45r_Y={d*R}x%a<=*y>$8N zgFyn6ZamCKhd zU%Ghl5;yMopXYeW-s$0$OIJ|vha+SuH>v32Vfn!UMsG!n)?{JwyXtH4+wr_P+$t}b1=a{2OAeYueH?GADQ-`LvR z0PxmLuv_>yZm20l&gSO&hM-)#dg;ogt5^628gLohmo8rsQu{AY@ucpqUE%w$tzQTF z=GNAYo40NfX?*MYWGoa2hXcVtz!wPk{oVj5{cgX{?*+bF@V&l(->2sIdBy9C9eDHj ziPPsVT)4=EooQcyhey8t8nL~xu`YZdgmGAha{jWfThPD7vwEF2s;OWFI{RX*f^MU#B>8l)%eAHG~FMa9+YG{|X&)g%2$Kk{W8TQ_gtmS{F+}8P$&`#1^i)u(B}z+(S6A0@rDBE zBjERhXo1J)ce`9J-vBLwdw=-3^B3U#3Yw7|i6*!cjoJmQOVze}xr6Fm(6+0g?6z$H z_&2xKH`ir58|zY#Vnr>`AH>IZVMl0XLvoQ`6!tfv{PrEo`ztXDk|4YbYS0@B`F-do z24L zR9};X@9`6zj<4qzH|5X?VDRmiC8!a;h}IC z>H~owHC8wz*AZ}!bc6K-yl!}xUE-8H;r0)m0lSQuNCLO*TFX4FuVaqv7W^Vz7bzXo zU}wL#?{cFNdRC&c?L=QRSs!*xRH_s74QY#uqJ|C4-M&Tnap%shTi0swXe1m!G~uu> z81kcgZoy~(+X)B!$ivMu0qos32!8jjefoXj#S6r#kSk2B-O)M@&cjO6bc1tq3 zwS`*l+`R*Fy4|{~ey3rwPNAX=8#kOTvu(GH=bQ9phy@<3t>049?*jeS$yAiWm0C6u zwp7yrp(ut!2LuBiq=aq)G$j&n_4f@74!B)zugga`dn345-`e174F@&L>Sy@P!N{ey%3h{oe`%W|@BSznhyqjpH=rd~%e60sFL zf)KjfbhMa)vpaY1-Mw>f8}#(M4LJfq!K(%+6x9F=+;*Ksue4?xZ#4({yLa#1zPmY; zj)>JzI2wfcpmZ+TARI}D#`uGzB_E>i?;mub8QccwL_#Q3J3~DH@rqKc-I_asrH>_c zn6ngGsf#d>D^BTf;NP>*?-6qLh1>X^(9={wmlr}cB&aELjN~HBikLfm`W|0%HXDmY zV-O!i@F5|Np!A3z?T7s!CVDX%%7TC&!FUHf!5}39$qFS!Vlx*(u0&{EO%`c`%gLt# zAkMXW_6@~EDA4cS*}ik{-nPKg2*B{15GheAe(@xb+c>anZ-JclftwA`ckXdd-`#yK z6-&h85u7Fx4~6COQAI5#iEJVgeMD7`uKn)5e((=qHnat+^arAcDP`~&$|TUE7VBj; zx};I1RPiQE7P%FSgPGl1^gsd*Qj+x`9SO@ikZ{ui9@~}?pKRM|t~5u#-Iz=y;<0cf z8i|HNKn@46$1v*m;gUFhz)y1G3DT9nf50;^=ynZ~XT7R7eSxq)^(vVOu?x9#!OrB5 zRPFyzBP5e)U1Dq>v6C-b3*2u)m2prRM+?35e|QDW5IZK8ME z?{X5cciSSrcke#zKe&G%@b_uLz3uJ$P7f#=!OO-U^^zrA)&yXBi6{|t_1vvF6cdS) zop2da6wo6P{tNMJG#C$3*3$#v_EX*ux&~dCq*tn;$OJzbEf`(8WFz(e3ty$AUF>Rs z^bYGcfns}I2;`B1&AqVSyAN_Pua^)%j}(%460NXAt7pVEn~hV%bLUz)9*ssK2tF8% z#~?qP%*Mh&n!>|SK&?R+3QKP^NM@2pdc5Ku`^Vx@O(5}{N=TsZCM4N9TqE_Z8&2A^ zp(^aRQNSG-7q|!8JNIG!f#??|(QnBWV&IE&n!=_B_H_b9igP;Q-W$nSESv~KJ#>d- zVJRmRiG&c6s!C*I(E~IT4!Q;jRX^z69)EyP^(qw*&dE2W8mWbw-9Rs+mgnIy7CQMK z@D|ct2nR68nFY}w*as7Lccm$TmTGQE;|@;VK+_Z)0V}wv&;JB(Bod6ct+@~S+%C|&sC5GV5NQC($5yW(c0sol7>Y;ksK&ZGz;So5 za|6+BktgW)MLO`s{{vLy2m-QEj>1)aU@4Yh^dTp-c}g$bSp)q%6+0fI{HQw2 zGH;0&j{8vlaOWX&eh+u}NAR`*DAs{Z$-*XGZz~Q&JO6G!fO;wlLEosSlgU_|dD|r9 z0)c8c5=kJQSS&&xgw-YfR&siVK@W0^>!2^?9z>}iC0J8yiYBl0~Eo$B&E<^9y*U`-P^fTJRVObGV!={ zgE}Hn2nQ;EV^NCw2=xMg`G=Mep?(k5m|xX^ss&r+V@7mVqI8;AmE4t#zz=SV9^@qY z-D-w?B4aCFDdpkLqlXW{4)OQlmvG&UPLP9MaPJDYAUl6{a{}(Zno7iD3RW}^)o~J1 z904T=;8-|CiN<4I;SSj(VuN@)lE>f`r;>~kEPfQA&m!X&o$RE+hGkwZ<7i#ET@K^W zZiz?i4<6w$%n?8258%}z=|u11#@I-*wof4?fu_0qAsHZ~t$I2w$p~~5!u2qLh^)qG zO9J)SNJcLjTai&If(Kn*hK6vCZWx<0qyoM&!rYbXDu8z-Be|>O<_^ISs9=Fj@W3%d zLOX(g_(*yuW~~&on8=St4pY-u@W9`&ig#2)VXI=s>Rp0Y zWJ2K%gaiALyheftn=Hgu#5O))U(bko8zLfHJ*0OoW@2g7k&FU15kWNwgd7FRST-rN zu~?cvsU+CBOS%W#gUm8{t;Ks8r68C9Cg~#qBbspL6%}O67m`*t(7VQPK-Lu|6{%?5 zatDA1C}ro-Be3tly%eudMKiWiRDY4r^mYlJEBz$YG@SQtZw+OWsbo46Psb2^GMUPx z;wf+gGgHbY)4Y`7a8a7WM%ipSl}z-zHP3;!1D^t3<)!99h+IY~s4AR0!ARAqA|-ao zW|u(g?Wze-0qDU2@4!GbL@VNfc)-g+x#`_p(LPPFQG9=gHz*?bte8Jp05^I;8X!w$ zlBrw_n8_SriPzva+4|J{^4h`YUVcln)t6lZ11`+n?PGG12^%{Dh*tug98AR@i&W2E zCp}q0VYcQyp zz%ZiWt0phoIaDV#X?QH=L8F_-5r}{cqwdEbaTyLnJ$j`7c}C@}%n^aXIt`X)1Q@VX zn|ut~_0|UuZqx|WC^L;de|+S?8y7Zi@ENO1iH*KiX0b(yrh7E$Oq>q72bg5?60mlr zfYC>YnPSQUYKKT9lt?U6l%aPvJKe&l4cNkO0SP-BNEM(v_c3^E2E&n*c~Jl;2za*z zBb$-j@7dO>eJXzt+lhE#eC7FfF0J3TDM1y3f<-=N{T1*wGg6jN8OlL)_(O`9wV)NI zKYYwMdHhtHK?aMA*yEA(QDzD(cIjP1ey4sE>3p|BQEmbFhcJ)L;5D>E@h5-W7J3M@ zb*Ix%+G?|~a8o+Vly+=`xKooK;GoufX{n7Cnogk0Cq%xI4Z6V{naE~N&qt(Uj((>4 zLJ|IIMhDd}N}=d{m6qBMkWmr*F5^l#Vg*&ek{sPawy6nJJAi;X@vQghPAydctD)LR z0b*U6fq9j17CGHwn?Mtll=Vr=}dFP?(`tG&yvE=%&3iT(c7j zQVU5+R)s6cuxp!AAIl~idf1rCZ$jfiFxXpqj(W7>4|qsi}a3ROQcc^ zD3qKmc(H18sES9Y0M^^=P0S0rq(&B&+;}@5(5reV8R=`~p-lRSBRLzoLGTWCjj*BK zNAb(-28Rz23_}kFb(gx0Lr!n(>5WlglGibXIr@Ys3u*b0E$s=5G@kqIvX zUaqdUSz>`HYUQff5-rf1Dc?xOJG_UM$^7}wd$14p@*8GIG`bghSDJ%MN|NxqxC?Q8=8x*tDcfyCoSPGO+k z3#STsnt`p{Tj$MsQu5KqXr-LhDus7ymIQx=dA+X8Y$G0{A;hSnFRflTmb9+HnD?(HaT+U{4T;+_{3^b^wT!q@-kF z6_+1u;{QIGjFR6SEF5DKlG=U^^2c3#lIDZ23JQSfKotsTY;@N@&Hf z0dzG?y=hg$z7(u-Nfibpd9214q8ji)xCVM*9c7SaP)q`)Q1>TbJswLG#t*)EVUzA+ z<4Xvf4>l;*e-3&f!Q&ww%}YGUK^>xYi8@J#CuF6106;##o76-L+1d`@;;7z!mM(KP zOBvV^yh^gIOGLKlMm=^$V8jP%qx0Pf2ZieTsQW0sI9SRac} zXS2Go&Eq|mWXEFYAQG`QwTPRhNobTBz@3ws*oiHSY+;~k48d=%GvAJ>#FE2HFCIU` zvKbwz(P{<8s494f2}`-|h;k|9w#>>pmIGWKVDSs1COE9Uzx(*n6IEBD-R5=)9@!&o z+M}?L=rxxkQ{@r=%W?Dudq;*+J7n-w$to>WuUg)LF1>Gr6Qc)TJH_CSbwnH!=BTPY zJjUqS9_+BJtMKGQmT-8m4=i|0Kya*{fykBpqZH*PsYaE`E`O4`UbT*>0!9y{bw$N) zc9Qb-w7_%atDUPuK77&LR_+iF_|3EDv{H#BR)E(*VUCem+8LJEW2y9xs%8Qey=w#q z%a(V#0L6UZVHUMxZ75i=irfXwVpppyB1^VN7D$Fz@=|7_WQz2~BQ?)?D^H1c8h~23 z+1-NOW+o1Wqvg$w^I9&WHCF$BAYP(DF?QJol0h>%fNh=CQ8?{a)Doo{b2$4DHgU>T zB9OZ)u}bgOt?gf4hGbgh*w8Ii0pOh#YUi|2>5^TSr=!`@j0LZuxMFpecZvbZ zXADN3xP9NMMvO4`Y|A}K!s?lQBlw3;a2mo@IOQ9v(QLPfWxcL{c-qo#%K`oo`)v9q zHb-n$Ew&;6y8KOE4R%aqYYVxsE)T`*E+UZ6fL_zTIOHbBBcUCYX-0-n2fS4v;CX~A zI{rux+bT=DmSdxtcd<$F3YWX2+9s&(k_Dm@wT#ylu@7i4A4Ki+hSLV+R(Xu}2U`j* zdmI`hs)6O*=k3Zoc(;pYv<6Mswf2DtRC%NhG1<9CX-1R%FcWywU1G?ZlMGSulDv>TU7J#_6$%*C7Pw*S5L*k%4pyH8) zf^Jl?=}u2bSCSL=`W7hHd*w5ZPm;Q!O8$rhl$)$*&f$@E8LHMQY3-l0gzmcL@#q#d zDPAITVwJ9A5Ft9izdP1bK9SKd)Rxg{@bToakUzmmz$dc@6aUc;$Z&4x+oGW$hDU93R8aKUBufZg)&JSs`5w~yp;^dC3n8i z$-TDH3IR-a%_>HR3xs&Jsm}RM7X`$4$uo$b2N}XkaR@7 z$|jh%l9A8ACxT|3JlN%sQjMc`XIY&UJn)snct5dfSBrq2+Cn_rq+taltw^itbnSUZ zVh8)XPo4_D)jpshUgjzAj&OK8ou#;?vm_b$(PJlGc%-jXF~&Yr4#*#DT6K``Vpn>C zcdolGsa4mOd7FGGAC#IHq$4_rw?XQVuTX-Vd$y}F3PmJ&9*2DVuJ+nxf)T z$aPf{6})0r?cHs$(FaAC@{=q^S_HfOc3Y}g$?gCVc#j`HefOzYfAX%>PjlEF@<`};BOg~Q zcS*PHV5S4<^KJ!#|*1NBy0 zK}$I7O=8#X9j75sZT)^ude_o=E&^{CEU5<8abc}&v@WU7NbqthWmcIyyfb;k1Cb-t zsKDV;9{DatBk)hv3OYbN03h13t9ByWN=Ay7=64-Ph27|!OA@Rs6T@m4d4O95nM|H0$|G$RtTNacoT?w`Oax042qwj<PKe^B$MoE_kvV1X7Ds&Q)DT+pSI7U{&F-@TLhee)X-L3m0-(yX+C{%)rAt(77TT z$81#5*qTP^XXC3zz71BYG|5U>dAoyOGaf1oocL9^Gv-xDtFqZRk+G+R0vD;7Cb%VBq!zq`4*YHOj5|TOG#d4O&zAD@JJYd zDdZ>x+SLfW5-frxW_e(d+F1lzPQyijuIdsyNvR5f1i+r~HgN|Euv?4K;As8S>COK!F0J70iR$!rLHqSXfI4u>SI?bzLlcH&jC;Oa~KfF?9 zjcNl+yqztO!t4?V3`)Zf)xqQ@O>Jm@P_2J=|Kl0(C^vyq0n1hK3Uaxm98&HrMccwl zqQFW-0~d857rb9_YZWD8sKYb`>|iIQYKa5OlFpnx1NgJ&s0xTxI|R|d&z^FCW^A-7 zI#iFTFp%WMyQWL5$D^EwJDP^DT`uv^8lXuqvUYAfkb<6)VRaF7awpQ!yP01l94ycDrw6Hxm9hW6^cyBPSEv5&c~IVlvn8@8$7}; zlT@riAhc`Dq;uF#gZu*JfsNn?o~z3YPJnT@nU5!0~u$YG9Mi7N?5=;0p1 zMZJh;vrDdO#LNxrVq$krFaPLnKhkuFwfl+A{B?r0uTus1iZU%hwVDT;u}h zCzmRfV)4{Tm_L0E>My`O#f_YXhu*~Vu_WB-?_PY<-+N=Up}(3FgrCdHZeL<9~l`L z9lAuyqITl534+P5yugFop=Cv7Vc}RN#JdaNb@R2 zRUJt4axl7G*zE{Sg|P5biUVEsh%Vf;cB^Fsn<&ud8t?~=Zc&le&Xb5p+6($rFv?cb8`91 zoHVErpwN?EB{PAS+t}nv+-nRepR`pZGc1Z&Rq+o9ww)c6t`G(JyHDS@r6m7zk#1D2 zJldYE)`uGPT5YJ>sBmA0-p1Ha1^D&G2=`;vk+Gp#wO+4{R3W@xsnn5+r5(}ai-i-X zEb&+++-uT+?IM1ONiuCfNi5ohUes$rfeJHg^mrxAqkF7UHVogYNu*dcLxNWYk79uS z{`>R*%sXnA2R^(oRH^`)?k_bOwFV8L0Z5|(*jjBE{B>HPCn}{%wOXrGD}{WnSS^;a z#d0N=&u34bJb8+9g{chAoCiAvB@;FjmltsxrB*v%V~t+uSv6#{)Xh7JT4f6ye{18~ zrL*+@vxiPg@b~TUCh?1=t*I+e6|)izPHC<4;e+RZRukprGRPpmQL7Arn??+wpwaPB zw#IOyp%<%_a;;D=6t%OMVBR#7j`B_UNc5H!{rH6{Se5shpW$1xi?)W?WQUC#a z>cq(tr|E#^~;|U(5bJV?n1>H9H0p&~xl*WA8Y5*nN%j7DHZZ%t^hA)tA#Axx&MyJ1k#PT#RgRs z2s|$HRLIpLZgkDFwNj;29c`4+d9_%i4+`{RrB*Lj8`V;+guv_YPES;;z^~MDrChF* z&E^Z4e6Em6XR@gTh&dn`XTgBh#^Pf2DgAYbi5vR!6gZF_p}v zc|-?fQC+T(&F0WxIfoc)^y=DeB`lm?CNB7lmK^0sK~fERp;zwCjsR;&5=R&flu|Di zb7-iDHp&FSFuJEhq@m$@1yS(|k|}0Oq$b*tVRdapr@873D3%g%){~p_w^<>{dMg(D zhvJz?ILLu{F3AWhK~sn)mrZ7JxnwR|$QMdkysAjDfU_FDTdGx`SGJ`fR?fF+2<|mS zqd}_bF9`=(j9hRO zk5k%lpANMG9Sx~5+##7$wn&l5mdmIBB@^gnx{m-xE9eGGmvQ1dLyZ#UK)nt{Kxb#k zY%Z6Hrh8WpADW+>m>!F{^3@az#k8842jRih-|P*qMSHS zXHic{enUSHti>V%Xq0P16IUq|G@O#vqY-PCkNHod4BfVGAD)?-e0iQoCEJ&)#$RO2P0oK#`T#8emvfkRl>Y*bC7bd4?#^e4%Ef-;F z8wlPWkRBoXm?wVWv) z2YNi8Pv*!J#4U!Ct?=DBrI<=%VtnKf>j>dofK}YsaUl2hf@Zc~9UaC?hIsoh1vwE& z*pfZTLgb5V4Xd}dq6CEtDHJ5H0v-(S$yhir*x%dQ&nXfCf3#4YSzKOQn3K1Hs}=hIn@WeRz6BDU8U8XX^h(H`y+^O(G>QS_@1^ykLR7(VLRlT)9g!B8w2Ztd(z)aMshR+eVw z7e+Y&H^;g5n7-E5@XI4^etX2N<+p)IA;mIVs)TqnO>vOQQ{P}XK&Q5;V7JxE@Yu+> zWAjwTpx3ba(eBYx+Vb$^u98y&TP@|ORVu|SRgu0$wnfy-g7C!>*`tt0Rmh!x z*n+)X&HQ#&Q&ZIMarq;h=hV{G&yu%Le0Xv7!0PrX38DVjazE!pySHQQ#wE!{Z2s%g9Ir zjbJgPxvV}9zDil*E7?4%+)4}hS~`RVmhy!{F68gn)7;k7777e{qOn-8wXI!eY`gjg z0-4FhwZm%*3v;uX=;Cmm6{`3q4$sfNu)-;%Go*BS9gkuuES^&{()oNgUo9}4ESELX z0n*6WSd0kzU?fSogHe)TQyD~GC__G_HpP5{vBSi~vTnzMN+mCsazK*^WT!pw1_XB|~j(Jp=tZ zEwSIj`6@1VzrS9ct0bontSs-J&4;Kcv%%uj)YwFw)vB>1r}6Av7#|xO&!w}8994CB zxRRx}$@22-IwPL(vAz4Q*n>)vij7ozJm%5P{TC+2@koZ&BTAdtW3fVfA{dezNw!d~ zLq9c65!iaVQN%sV3THw2Tw7jUnLPZ?MMk%rWPJV2e7RA} zSIgiUnHUJFTEBXSzDBXPtc z&68_IKmV0hEBQcEd%+*#M4`c^mafjuzFgeX*V!@P?(6RNmZ~%9fqs54uPre@;`M|o z(-qggY%G``9i5q)-n)N(etvdl^|iC-&uNvJbBv1lzw1}et>zdStE3zopI)V!m*Abb z1ZF{Wfa==x_}Jtq1r2UG44WGB!T*t@}AQdBnR0J*wA#!d2uV4wq+124v z%VA%L6aBhdI(m8r8>3_6!?j8-!l}gRp^>Tf=JuwR?%uxcwmr@6TqBtqN%Z&h<|g*C z&F){C+c&?sxUg7^Qk2c}>nTi&TsisTv&R@QXi{Z#WO8bD-{IRF*CA%*^P1*WeelNA z-ifKPVPbWJ%&LL5tVSbl?3KqDiacMAPajlVcM+pMn z_KvRJeg?fmL!+eX(UcFh?@hI}wKVVP9O!M`)7IS9(U;6FP7iwmnZeN5zKPkng?+P2 z`{$=;`C*<|ER&l%w7^dTQY#cnIijqA;>X4(_boij`X(I+XD&y_shE&c8(XFFT=@Y{)P9nDQG?VX6HrK>kzn;OZMNB1Vi`c*S&OvT#y^K-{$_D<2qlcSTPR4_~r z0F@CGQ+JH-s>5SblhX@JD+i9f`1lWy5 z?ex}$hw3DYk@|Sm?~c^UdyBvYd~55To|fjOrac{Gf zEHxS@wdCd|XQ#%}**JqShVNOdx!M>RpF%hD%dcEb-EKTSb^6phuN|CX2BA=(a~bTX6TN-zzLvI@mi~BAZd)C$ z1>K(XaBaFrtb@LlKP_EN&ED>g4tHTZkgnvS>B{8n>hj_+V=n3;7x_3`Ca;&uc{gWz z4Z1w8U@Dz2Hby2V_wJpVo0*+iSbpKuRsBj3#B=OTM_o3rZE{}Q6@HkCgBBMrX-?>( zg|6cPIvOKsyz|zFo>`h4W(=ay4I?xL_M9o2$yRcS6mPfSiuP43-Cpe(N)ICAXhk;6w0tsYpJpPSh`J2OcSjgFDAhN(i8 zS1Hlz^2TC?YCVS!F*lRd^bnI1l|qgoYayM0+7`=iQ%hTGXIF1mM|WSOUYKVxc9(g* zx~HjQpxYad)#CA5sgRqd_=t_{n;GcqN>RR7CbNTmt*tGs9bH&$TYGD3Z#vr9ImiH# zQDQP3XMB}on42v!%TUZ^llcs1d**Yho|!Y@q}nW}A*Koi`ii(E!xoE`bgo2&!|yQQ_My|tsc!^imz6h)Z=g(&u(XBd{vrD#@y=aT7M zI)meI25Wer#cBaiZR|(IBoEn|R8_XLws&`XO6h%x)&XlXybx^P)7;uh-u0z|*-);W z@ysNnBdP4fT&}y*`S3t*Zx2?~#22=74=|?jrSmPVgYi-(9b>UHC-FqniCiW{^}y&H zR+&yK0F7yfAU!pR0#HLr<1fZ@=?s&ONHdqt(*qcLHp$tZJ$MIu>kjm_LAjXPBlOy^ z5;dg_dVJZ^M5j8z0oF#NTBz>3d<-|(K_px2j738E$$hT&zJ7Oqb8CAKln!>wi3S6l z+0MD7`Le&;!!%T>GBQC9TUcCKo*`xll*L0Idi4#aJYP6=aBX>EX)V>!(Scy16v3ff zWvmj;GGMh65$SY1lZ*xWn6BV#8drw{w8fPQH}7fHf0d}GuMOb1VN+{!3)s6Osi}w3Sx0ws!XRQ#uBjl5w@Cvi!(heSCk3SvAVaKscTZyAzF4WA6}=MoKJH^M$}* zYlMoNVoAYHMrn_0(pT##aw4 zXF`EYp*|b-&&*9PEFM^j`clL5!x}JWG7}@qi)+W8J9cz!X<_NW%g0Y1fA!ev0v)iQ zGIT!`-T27Z%w%_aTU%#q8y4ppZ+Asq5vJ!-zK+&z#Msf&+}#!Na8fWQly^C*>7JXN zN_RJP_71A*9q?wRR}ZWmfc~YW{d3dPQ?(SW?d`<&TAEv%JK8$BI(ppRSX29SN3$#3 z(%#neHmf1FAz)TaT(cx z;x#)nJC*F~?(XYE>jWkDt%K?6=)}zah3UDOeTCZORD)@#TzPnWYOI>@>G$8IzpXXX@{-OrEDE+2aF`6FwK#OH|< z$6tBo;0mCZR#sM55$V$MfwkqunbAOdM@P?Ke?L~*y|=Zc#ns#$>=55%yV zOfKc_aelJ8d17&4BHhJ?*6h2`HjU~HfjRmrm+SoYN<;W1zD{}`9z5K$V)s>@f zoOtKemyaG;TO+cL9y@aM@Zp084;?sofM8o*9O{7azFtpjM@vViw=I +#include +#include +#include +#include +#include "image_proc.h" +#include "user_proc.h" + +#pragma pack(push,1) +typedef struct { + uint16_t bfType; + uint32_t bfSize; + uint16_t bfReserved1; + uint16_t bfReserved2; + uint32_t bfOffBits; +} BMPFILEHEADER; +#pragma pack(pop) + +static uint8_t* g_pixels = NULL; +static BITMAPINFO* g_bmi = NULL; +static int g_w=0, g_h=0, g_bpp=0; +static const char* g_title = "BMP Viewer"; + +static void FreeImage() { + free(g_pixels); g_pixels = NULL; + free(g_bmi); g_bmi = NULL; + g_w = g_h = g_bpp = 0; +} + +static int LoadBMP(const char* path) { + FreeImage(); + FILE* fp = fopen(path, "rb"); + if(!fp){ fprintf(stderr,"无法打开: %s\n", path); return 0; } + + BMPFILEHEADER fh; + BITMAPINFOHEADER ih; + if(fread(&fh,sizeof(fh),1,fp)!=1){ fclose(fp); return 0; } + if(fh.bfType != 0x4D42){ fclose(fp); fprintf(stderr,"非BMP\n"); return 0; } + if(fread(&ih,sizeof(ih),1,fp)!=1){ fclose(fp); return 0; } + if(ih.biCompression != BI_RGB){ fclose(fp); fprintf(stderr,"仅支持未压缩 BI_RGB\n"); return 0; } + if(!(ih.biBitCount==8 || ih.biBitCount==24 || ih.biBitCount==32)){ + fclose(fp); fprintf(stderr,"不支持位数: %u\n", ih.biBitCount); return 0; + } + + g_w = ih.biWidth; + g_h = ih.biHeight; + g_bpp = ih.biBitCount; + + int bytesPerPixel = g_bpp / 8; + int stride = ((g_w * bytesPerPixel + 3) / 4) * 4; + size_t imgSize = (size_t)stride * g_h; + + uint32_t colors = 0; + if(g_bpp == 8){ + colors = ih.biClrUsed ? ih.biClrUsed : 256; + if(colors > 256) colors = 256; + } + size_t bmiSize = sizeof(BITMAPINFOHEADER) + colors * sizeof(RGBQUAD); + g_bmi = (BITMAPINFO*)calloc(1, bmiSize); + if(!g_bmi){ fclose(fp); return 0; } + g_bmi->bmiHeader = ih; + + if(g_bpp == 8){ + if(colors){ + size_t readPaletteBytes = colors * sizeof(RGBQUAD); + if(fread(g_bmi->bmiColors, 1, readPaletteBytes, fp) != readPaletteBytes){ + for(uint32_t i=0;ibmiColors[i].rgbRed = + g_bmi->bmiColors[i].rgbGreen = + g_bmi->bmiColors[i].rgbBlue = (BYTE)i; + } + } + } else { + } + } + + g_pixels = (uint8_t*)malloc(imgSize); + if(!g_pixels){ fclose(fp); FreeImage(); return 0; } + + if(fseek(fp, (long)fh.bfOffBits, SEEK_SET)!=0){ + fclose(fp); FreeImage(); return 0; + } + if(fread(g_pixels,1,imgSize,fp)!=imgSize){ + fclose(fp); FreeImage(); fprintf(stderr,"像素读取失败\n"); return 0; + } + fclose(fp); + + if(g_bpp == 8){ + int isGray = 1; + for(uint32_t i=0;ibmiColors[i].rgbRed; + BYTE g=g_bmi->bmiColors[i].rgbGreen; + BYTE b=g_bmi->bmiColors[i].rgbBlue; + if(!(r==g && g==b)){ isGray=0; break; } + } + if(!isGray){ + for(uint32_t i=0;ibmiColors[i].rgbRed = + g_bmi->bmiColors[i].rgbGreen = + g_bmi->bmiColors[i].rgbBlue = (BYTE)i; + } + } + } + + return 1; +} + +static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ + switch(msg){ + case WM_ERASEBKGND: + return 1; + case WM_PAINT:{ + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hWnd,&ps); + if(g_pixels && g_bmi){ + int dstW = g_w * IMAGE_SCALE; + int dstH = g_h * IMAGE_SCALE; + SetStretchBltMode(hdc, COLORONCOLOR); + StretchDIBits( + hdc, + 0,0,dstW,dstH, + 0,0,g_w,g_h, + g_pixels, + g_bmi, + DIB_RGB_COLORS, + SRCCOPY + ); + } else { + TextOutA(hdc,10,10,"未加载BMP",12); + } + EndPaint(hWnd,&ps); + } break; + case WM_DESTROY: + FreeImage(); + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd,msg,wParam,lParam); + } + return 0; +} + +int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int nShow){ + (void)hPrev; (void)lpCmdLine; + if(!LoadBMP(BMP_PATH)){ + char msg[256]; + snprintf(msg,sizeof(msg),"加载失败: %s", BMP_PATH); + MessageBoxA(NULL,msg,"错误",MB_OK|MB_ICONERROR); + } else { + g_title = BMP_PATH; + + GrayImage gray = {0}; + if(ExtractGray(g_pixels, g_w, g_h, g_bpp, &gray)){ + + img_proc(&gray);//这里调用了图像处理函数 + + BITMAPINFO *newBMI = NULL; + uint8_t *newPixels = NULL; + if(Build8BitDIB(&gray, &newBMI, &newPixels)){ + free(g_pixels); + free(g_bmi); + g_pixels = newPixels; + g_bmi = newBMI; + g_bpp = 8; + } + } + FreeGray(&gray); + } + + const char* cls = "BMP_VIEWER_CLASS"; + WNDCLASSA wc = (WNDCLASSA){0}; + wc.lpfnWndProc = WndProc; + wc.hInstance = hInst; + wc.lpszClassName = cls; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + if(!RegisterClassA(&wc)) return 0; + + int winW = g_w ? g_w * IMAGE_SCALE : 640; + int winH = g_h ? g_h * IMAGE_SCALE : 480; + + RECT rc = {0,0, winW, winH}; + DWORD style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; + AdjustWindowRect(&rc, style, FALSE); + + HWND hWnd = CreateWindowExA( + 0, cls, g_title, + style, + CW_USEDEFAULT, CW_USEDEFAULT, + rc.right - rc.left, + rc.bottom - rc.top, + NULL,NULL,hInst,NULL); + if(!hWnd) return 0; + + ShowWindow(hWnd,nShow); + UpdateWindow(hWnd); + + MSG msg; + while(GetMessage(&msg,NULL,0,0)>0){ + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return (int)msg.wParam; +} \ No newline at end of file diff --git a/user_proc.c b/user_proc.c new file mode 100644 index 0000000..99788ae --- /dev/null +++ b/user_proc.c @@ -0,0 +1,27 @@ +#include +#include "user_proc.h" +//绘制十字交叉线 +void draw_cross(GrayImage *img, int x, int y, int size, uint8_t color){ + if(!img || !img->data) return; + //获取图像宽度和高度 + int w = img->width; + int h = img->height; + if(x<0 || x>=w || y<0 || y>=h) return; + //定义一个二维数组指针方便访问像素 + uint8_t **image = img->rows; + for(int dx=-size;dx<=size;dx++){ + int nx = x + dx; + if(nx>=0 && nx=0 && nywidth/2, img->height/2, 20, 0); +} \ No newline at end of file diff --git a/user_proc.h b/user_proc.h new file mode 100644 index 0000000..d79f2e7 --- /dev/null +++ b/user_proc.h @@ -0,0 +1,10 @@ +#ifndef USER_PROC_H +#define USER_PROC_H + +#include "image_proc.h" + +#define BMP_PATH ".\\img_files\\0.bmp" // 更改这里即可切换要加载的 BMP +#define IMAGE_SCALE 3 // 放大倍数,可改成 1 / 2 / 3 等 + +void img_proc(GrayImage *img); +#endif \ No newline at end of file