模拟Photo的直方图,不过只是显示;
有对图像四角的密度和反差进行补偿,这是现在LDD(LCD+LED)数码裁放机上常用的补偿方法!
主要还是对GDI+的应用,大家不妨看看原码!
http://www.nxxn.net/soft/dreign.rar
//图像处理--------------------------------------------------------------------------------------
using System;
using System.Drawing;
using System.Drawing.Imaging;
namespace zft
{
public class BitmapFilter
{
public static bool modu1(Bitmap image,int r,int g,int b)
{
if(r==0) r=1;
if(g==0) g=1;
if(b==0) b=1;
BitmapData bmData = image.LockBits(new Rectangle(0, 0,image.Width , image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
byte * p = (byte *)(void )Scan0;
int nOffset = stride - image.Width3;
int nWidth=image.Width;
int nHeight=image.Height;
int red,green,blue;
int w0=(int)(nWidth/2);
int h0=(int)(nHeight/2);
int r0,t1,t2,kr=r,kg=g,kb=b;
double z,z0;
int k1r=r,k1g=g,k1b=b,
k2r=r,k2g=g,k2b=b,
k3r=r,k3g=g,k3b=b,
k4r=r,k4g=g,k4b=b;
if(w0>h0)
r0=w0;
else
r0=h0;
z0=Math.Sqrt(w0w0+h0h0);
z0=z0/1.5;
for(int y=0;y
1<nheight;++y) )="" ++x="" <="" blue="p[0];" blue+="kb;" double="" else="" for(int="" green="p[1];" green+="kg;" if(red="" if(t1<0)="" if(t2<0)="" if(z<z0)="" kb="(int)(15*b*xx*xx);" kg="(int)(15*g*xx*xx);" kr="(int)(15*r*xx*xx);" nwidth;="" red="p[2];" red+="kr;" t1="0-t1;" t2="0-t2;" x="" xx="(z-z0)/z;" z="z0;" {="" }="">255) red=255;
2if(red<0) red=0;
3if(green>255) green=255;
4if(green<0) green=0;
5if(blue>255) blue=255;
6if(blue<0) blue=0;
7
8p[2]=(byte)red;
9p[1]=(byte)green;
10p[0]=(byte)blue;
11
12p+=3;
13}
14p += nOffset;
15
16}
17}
18image.UnlockBits(bmData);
19return true;
20}
21
22/// <summary>
23/// 反差圆补偿
24/// </summary>
25/// <param name="image"/>图像
26/// <param name="con"/>反差系数
27/// <param name="k"/>圆半径系数
28/// <returns></returns>
29public static bool ccon(Bitmap image,float con,float k)
30{
31BitmapData bmData = image.LockBits(new Rectangle(0, 0,image.Width , image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
32unsafe
33{
34int stride = bmData.Stride;
35System.IntPtr Scan0 = bmData.Scan0;
36byte * p = (byte *)(void *)Scan0;
37int nOffset = stride - image.Width*3;
38
39int nWidth=image.Width;
40int nHeight=image.Height;
41int red,green,blue;
42
43int w0=(int)(nWidth/2);
44int h0=(int)(nHeight/2);
45int r0,t1,t2;
46double z,z0,pixel,contrast;
47
48if(w0>h0)
49r0=w0;
50else
51r0=h0;
52z0=Math.Sqrt(w0*w0+h0*h0);
53z0=z0/k;
54
55for(int y=0;y<nheight;++y) )="" ++x="" <="" blue="p[0];" for(int="" green="p[1];" if(t1<0)="" if(t2<0)="" if(z="" nwidth;="" red="p[2];" t1="0-t1;" t2="0-t2;" x="" z="Math.Sqrt(t1*t1+t2*t2);" {="">z0)
56{
57contrast = (z-z0)/z * con ;
58
59pixel = red-(127-red) * contrast;
60if (pixel < 0) pixel = 0;
61if (pixel > 255) pixel = 255;
62p[2] = (byte) pixel;
63
64pixel = green-(127-green) * contrast;
65if (pixel < 0) pixel = 0;
66if (pixel > 255) pixel = 255;
67p[1] = (byte) pixel;
68
69pixel = blue-(127-blue) * contrast;
70if (pixel < 0) pixel = 0;
71if (pixel > 255) pixel = 255;
72p[0] = (byte) pixel;
73}
74p+=3;
75}
76p += nOffset;
77}
78}
79image.UnlockBits(bmData);
80return true;
81}
82/// <summary>
83/// 基本反差调整
84/// </summary>
85/// <param name="b"/>
86/// <param name="nContrast"/>
87/// <returns></returns>
88public static bool Contrast(Bitmap b, int nContrast)
89{
90if (nContrast < -100) return false;
91if (nContrast > 100) return false;
92
93double pixel = 0, contrast = (100.0+nContrast)/100.0;
94
95contrast *= contrast;
96
97int red, green, blue;
98
99// GDI+ still lies to us - the return format is BGR, NOT RGB.
100BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
101
102int stride = bmData.Stride;
103System.IntPtr Scan0 = bmData.Scan0;
104int h=b.Height,w=b.Width;
105
106unsafe
107{
108byte * p = (byte *)(void *)Scan0;
109
110int nOffset = stride - b.Width*3;
111
112for(int y=0;y<h;++y) (pixel="" )="" *="255;" +="0.5;" ++x="" -="0.5;" 0)="" <="" blue="p[0];" for(int="" green="p[1];" if="" pixel="0;" red="p[2];" w;="" x="" {=""> 255) pixel = 255;
113p[2] = (byte) pixel;
114
115pixel = green/255.0;
116pixel -= 0.5;
117pixel *= contrast;
118pixel += 0.5;
119pixel *= 255;
120if (pixel < 0) pixel = 0;
121if (pixel > 255) pixel = 255;
122p[1] = (byte) pixel;
123
124pixel = blue/255.0;
125pixel -= 0.5;
126pixel *= contrast;
127pixel += 0.5;
128pixel *= 255;
129if (pixel < 0) pixel = 0;
130if (pixel > 255) pixel = 255;
131p[0] = (byte) pixel;
132
133p += 3;
134}
135p += nOffset;
136}
137}
138
139b.UnlockBits(bmData);
140
141return true;
142}
143
144public static bool zft(Bitmap b,out int[] all,out int[] rhow, out int[] ghow,out int[] bhow)
145{
146int [] gray=new int[256];
147int [] rr = new int[256];
148int [] gg = new int[256];
149int [] bb = new int[256];
150int tt=0;
151foreach(int i in gray)
152{
153gray[i]=0;
154}
155foreach(int i in rr)
156{
157rr[i]=0;
158}
159foreach(int i in gg)
160{
161gg[i]=0;
162}
163foreach(int i in bb)
164{
165bb[i]=0;
166}
167
168// GDI+ still lies to us - the return format is BGR, NOT RGB.
169BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
170
171int stride = bmData.Stride;
172System.IntPtr Scan0 = bmData.Scan0;
173
174unsafe
175{
176byte * p = (byte *)(void *)Scan0;
177
178int nOffset = stride - b.Width*3;
179
180byte red, green, blue;
181int nWidth = b.Width;
182int nHeight= b.Height;
183
184for(int y=0;y<nHeight;++y)
185{
186for(int x=0; x < nWidth; ++x )
187{
188blue = p[0];
189green = p[1];
190red = p[2];
191
192tt = (byte)(.299 * red + .587 * green + .114 * blue);
193#region rr
194switch(red)
195{
196case 0:
197rr[0]++;
198break;
199case 1:
200rr[1]++;
201break;
202case 2:
203rr[2]++;
204break;
205case 3:
206rr[3]++;
207break;
208case 4:
209rr[4]++;
210break;
211case 5:
212rr[5]++;
213break;
214case 6:
215rr[6]++;
216break;
217case 7:
218rr[7]++;
219break;
220case 8:
221rr[8]++;
222break;
223case 9:
224rr[9]++;
225break;
226case 10:
227rr[10]++;
228break;
229case 11:
230rr[11]++;
231break;
232case 12:
233rr[12]++;
234break;
235case 13:
236rr[13]++;
237break;
238case 14:
239rr[14]++;
240break;
241case 15:
242rr[15]++;
243break;
244case 16:
245rr[16]++;
246break;
247case 17:
248rr[17]++;
249break;
250case 18:
251rr[18]++;
252break;
253case 19:
254rr[19]++;
255break;
256case 20:
257rr[20]++;
258break;
259case 21:
260rr[21]++;
261break;
262case 22:
263rr[22]++;
264break;
265case 23:
266rr[23]++;
267break;
268case 24:
269rr[24]++;
270break;
271case 25:
272rr[25]++;
273break;
274case 26:
275rr[26]++;
276break;
277case 27:
278rr[27]++;
279break;
280case 28:
281rr[28]++;
282break;
283case 29:
284rr[29]++;
285break;
286case 30:
287rr[30]++;
288break;
289case 31:
290rr[31]++;
291break;
292case 32:
293rr[32]++;
294break;
295case 33:
296rr[33]++;
297break;
298case 34:
299rr[34]++;
300break;
301case 35:
302rr[35]++;
303break;
304case 36:
305rr[36]++;
306break;
307case 37:
308rr[37]++;
309break;
310case 38:
311rr[38]++;
312break;
313case 39:
314rr[39]++;
315break;
316case 40:
317rr[40]++;
318break;
319case 41:
320rr[41]++;
321break;
322case 42:
323rr[42]++;
324break;
325case 43:
326rr[43]++;
327break;
328case 44:
329rr[44]++;
330break;
331case 45:
332rr[45]++;
333break;
334case 46:
335rr[46]++;
336break;
337case 47:
338rr[47]++;
339break;
340case 48:
341rr[48]++;
342break;
343case 49:
344rr[49]++;
345break;
346case 50:
347rr[50]++;
348break;
349case 51:
350rr[51]++;
351break;
352case 52:
353rr[52]++;
354break;
355case 53:
356rr[53]++;
357break;
358case 54:
359rr[54]++;
360break;
361case 55:
362rr[55]++;
363break;
364case 56:
365rr[56]++;
366break;
367case 57:
368rr[57]++;
369break;
370case 58:
371rr[58]++;
372break;
373case 59:
374rr[59]++;
375break;
376case 60:
377rr[60]++;
378break;
379case 61:
380rr[61]++;
381break;
382case 62:
383rr[62]++;
384break;
385case 63:
386rr[63]++;
387break;
388case 64:
389rr[64]++;
390break;
391case 65:
392rr[65]++;
393break;
394case 66:
395rr[66]++;
396break;
397case 67:
398rr[67]++;
399break;
400case 68:
401rr[68]++;
402break;
403case 69:
404rr[69]++;
405break;
406case 70:
407rr[70]++;
408break;
409case 71:
410rr[71]++;
411break;
412case 72:
413rr[72]++;
414break;
415case 73:
416rr[73]++;
417break;
418case 74:
419rr[74]++;
420break;
421case 75:
422rr[75]++;
423break;
424case 76:
425rr[76]++;
426break;
427case 77:
428rr[77]++;
429break;
430case 78:
431rr[78]++;
432break;
433case 79:
434rr[79]++;
435break;
436case 80:
437rr[80]++;
438break;
439case 81:
440rr[81]++;
441break;
442case 82:
443rr[82]++;
444break;
445case 83:
446rr[83]++;
447break;
448case 84:
449rr[84]++;
450break;
451case 85:
452rr[85]++;
453break;
454case 86:
455rr[86]++;
456break;
457case 87:
458rr[87]++;
459break;
460case 88:
461rr[88]++;
462break;
463case 89:
464rr[89]++;
465break;
466case 90:
467rr[90]++;
468break;
469case 91:
470rr[91]++;
471break;
472case 92:
473rr[92]++;
474break;
475case 93:
476rr[93]++;
477break;
478case 94:
479rr[94]++;
480break;
481case 95:
482rr[95]++;
483break;
484case 96:
485rr[96]++;
486break;
487case 97:
488rr[97]++;
489break;
490case 98:
491rr[98]++;
492break;
493case 99:
494rr[99]++;
495break;
496case 100:
497rr[100]++;
498break;
499
500//=-----------------------------------------------------------------------------
501case 101:
502rr[101]++;
503break;
504case 102:
505rr[102]++;
506break;
507case 103:
508rr[103]++;
509break;
510case 104:
511rr[104]++;
512break;
513case 105:
514rr[105]++;
515break;
516case 106:
517rr[106]++;
518break;
519case 107:
520rr[107]++;
521break;
522case 108:
523rr[108]++;
524break;
525case 109:
526rr[109]++;
527break;
528case 110:
529rr[110]++;
530break;
531case 111:
532rr[111]++;
533break;
534case 112:
535rr[112]++;
536break;
537case 113:
538rr[113]++;
539break;
540case 114:
541rr[114]++;
542break;
543case 115:
544rr[115]++;
545break;
546case 116:
547rr[116]++;
548break;
549case 117:
550rr[117]++;
551break;
552case 118:
553rr[118]++;
554break;
555case 119:
556rr[119]++;
557break;
558case 120:
559rr[120]++;
560break;
561case 121:
562rr[121]++;
563break;
564case 122:
565rr[122]++;
566break;
567case 123:
568rr[123]++;
569break;
570case 124:
571rr[124]++;
572break;
573case 125:
574rr[125]++;
575break;
576case 126:
577rr[126]++;
578break;
579case 127:
580rr[127]++;
581break;
582case 128:
583rr[128]++;
584break;
585case 129:
586rr[129]++;
587break;
588case 130:
589rr[130]++;
590break;
591case 131:
592rr[131]++;
593break;
594case 132:
595rr[132]++;
596break;
597case 133:
598rr[133]++;
599break;
600case 134:
601rr[134]++;
602break;
603case 135:
604rr[135]++;
605break;
606case 136:
607rr[136]++;
608break;
609case 137:
610rr[137]++;
611break;
612case 138:
613rr[138]++;
614break;
615case 139:
616rr[139]++;
617break;
618case 140:
619rr[140]++;
620break;
621case 141:
622rr[141]++;
623break;
624case 142:
625rr[142]++;
626break;
627case 143:
628rr[143]++;
629break;
630case 144:
631rr[144]++;
632break;
633case 145:
634rr[145]++;
635break;
636case 146:
637rr[146]++;
638break;
639case 147:
640rr[147]++;
641break;
642case 148:
643rr[148]++;
644break;
645case 149:
646rr[149]++;
647break;
648case 150:
649rr[150]++;
650break;
651case 151:
652rr[151]++;
653break;
654case 152:
655rr[152]++;
656break;
657case 153:
658rr[153]++;
659break;
660case 154:
661rr[154]++;
662break;
663case 155:
664rr[155]++;
665break;
666case 156:
667rr[156]++;
668break;
669case 157:
670rr[157]++;
671break;
672case 158:
673rr[158]++;
674break;
675case 159:
676rr[159]++;
677break;
678case 160:
679rr[160]++;
680break;
681case 161:
682rr[161]++;
683break;
684case 162:
685rr[162]++;
686break;
687case 163:
688rr[163]++;
689break;
690case 164:
691rr[164]++;
692break;
693case 165:
694rr[165]++;
695break;
696case 166:
697rr[166]++;
698break;
699case 167:
700rr[167]++;
701break;
702case 168:
703rr[168]++;
704break;
705case 169:
706rr[169]++;
707break;
708case 170:
709rr[170]++;
710break;
711case 171:
712rr[171]++;
713break;
714case 172:
715rr[172]++;
716break;
717case 173:
718rr[173]++;
719break;
720case 174:
721rr[174]++;
722break;
723case 175:
724rr[175]++;
725break;
726case 176:
727rr[176]++;
728break;
729case 177:
730rr[177]++;
731break;
732case 178:
733rr[178]++;
734break;
735case 179:
736rr[179]++;
737break;
738case 180:
739rr[180]++;
740break;
741case 181:
742rr[181]++;
743break;
744case 182:
745rr[182]++;
746break;
747case 183:
748rr[183]++;
749break;
750case 184:
751rr[184]++;
752break;
753case 185:
754rr[185]++;
755break;
756case 186:
757rr[186]++;
758break;
759case 187:
760rr[187]++;
761break;
762case 188:
763rr[188]++;
764break;
765case 189:
766rr[189]++;
767break;
768case 190:
769rr[190]++;
770break;
771case 191:
772rr[191]++;
773break;
774case 192:
775rr[192]++;
776break;
777case 193:
778rr[193]++;
779break;
780case 194:
781rr[194]++;
782break;
783case 195:
784rr[195]++;
785break;
786case 196:
787rr[196]++;
788break;
789case 197:
790rr[197]++;
791break;
792case 198:
793rr[198]++;
794break;
795case 199:
796rr[199]++;
797break;
798case 200:
799rr[200]++;
800break;
801
802//-----------------------------------------------------------------
803
804case 201:
805rr[201]++;
806break;
807case 202:
808rr[202]++;
809break;
810case 203:
811rr[203]++;
812break;
813case 204:
814rr[204]++;
815break;
816case 205:
817rr[205]++;
818break;
819case 206:
820rr[206]++;
821break;
822case 207:
823rr[207]++;
824break;
825case 208:
826rr[208]++;
827break;
828case 209:
829rr[209]++;
830break;
831case 210:
832rr[210]++;
833break;
834case 211:
835rr[211]++;
836break;
837case 212:
838rr[212]++;
839break;
840case 213:
841rr[213]++;
842break;
843case 214:
844rr[214]++;
845break;
846case 215:
847rr[215]++;
848break;
849case 216:
850rr[216]++;
851break;
852case 217:
853rr[217]++;
854break;
855case 218:
856rr[218]++;
857break;
858case 219:
859rr[219]++;
860break;
861case 220:
862rr[220]++;
863break;
864case 221:
865rr[221]++;
866break;
867case 222:
868rr[222]++;
869break;
870case 223:
871rr[223]++;
872break;
873case 224:
874rr[224]++;
875break;
876case 225:
877rr[225]++;
878break;
879case 226:
880rr[226]++;
881break;
882case 227:
883rr[227]++;
884break;
885case 228:
886rr[228]++;
887break;
888case 229:
889rr[229]++;
890break;
891case 230:
892rr[230]++;
893break;
894case 231:
895rr[231]++;
896break;
897case 232:
898rr[232]++;
899break;
900case 233:
901rr[233]++;
902break;
903case 234:
904rr[234]++;
905break;
906case 235:
907rr[235]++;
908break;
909case 236:
910rr[236]++;
911break;
912case 237:
913rr[237]++;
914break;
915case 238:
916rr[238]++;
917break;
918case 239:
919rr[239]++;
920break;
921case 240:
922rr[240]++;
923break;
924case 241:
925rr[241]++;
926break;
927case 242:
928rr[242]++;
929break;
930case 243:
931rr[243]++;
932break;
933case 244:
934rr[244]++;
935break;
936case 245:
937rr[245]++;
938break;
939case 246:
940rr[246]++;
941break;
942case 247:
943rr[247]++;
944break;
945case 248:
946rr[248]++;
947break;
948case 249:
949rr[249]++;
950break;
951case 250:
952rr[250]++;
953break;
954case 251:
955rr[251]++;
956break;
957case 252:
958rr[252]++;
959break;
960case 253:
961rr[253]++;
962break;
963case 254:
964rr[254]++;
965break;
966case 255:
967rr[255]++;
968break;
969
970}
971#endregion
972
973#region gg
974switch(green)
975{
976case 0:
977gg[0]++;
978break;
979case 1:
980gg[1]++;
981break;
982case 2:
983gg[2]++;
984break;
985case 3:
986gg[3]++;
987break;
988case 4:
989gg[4]++;
990break;
991case 5:
992gg[5]++;
993break;
994case 6:
995gg[6]++;
996break;
997case 7:
998gg[7]++;
999break;
1000case 8:
1001gg[8]++;
1002break;
1003case 9:
1004gg[9]++;
1005break;
1006case 10:
1007gg[10]++;
1008break;
1009case 11:
1010gg[11]++;
1011break;
1012case 12:
1013gg[12]++;
1014break;
1015case 13:
1016gg[13]++;
1017break;
1018case 14:
1019gg[14]++;
1020break;
1021case 15:
1022gg[15]++;
1023break;
1024case 16:
1025gg[16]++;
1026break;
1027case 17:
1028gg[17]++;
1029break;
1030case 18:
1031gg[18]++;
1032break;
1033case 19:
1034gg[19]++;
1035break;
1036case 20:
1037gg[20]++;
1038break;
1039case 21:
1040gg[21]++;
1041break;
1042case 22:
1043gg[22]++;
1044break;
1045case 23:
1046gg[23]++;
1047break;
1048case 24:
1049gg[24]++;
1050break;
1051case 25:
1052gg[25]++;
1053break;
1054case 26:
1055gg[26]++;
1056break;
1057case 27:
1058gg[27]++;
1059break;
1060case 28:
1061gg[28]++;
1062break;
1063case 29:
1064gg[29]++;
1065break;
1066case 30:
1067gg[30]++;
1068break;
1069case 31:
1070gg[31]++;
1071break;
1072case 32:
1073gg[32]++;
1074break;
1075case 33:
1076gg[33]++;
1077break;
1078case 34:
1079n</h;++y)></nheight;++y)></nheight;++y)>