C#µÄBitmapDataʹÓü¼ÇÉ
×÷ÕߣºØýÃûÀ´Ô´£ºÂ̲èÈí¼þÔ°2011-08-07 12:46:52
×î½üҪת¿ª·¢Æ½Ì¨£¬ÕýÑо¿C#¡£C#ºÃÊǺ㬲»¹ý´¦ÀíͼƬʱһ¸öÏñËØÒ»¸öÏñËصIJÙ×÷ÏñËز»ÊÇÒ»°ãµÄÂý¡£ÆäʵDelphiÒ²Ò»Ñù£¬µ«ºÃÔÚDelphiµÄBitmapÀàÌṩÁËScanLines£¬¿ÉÒÔÒ»ÐÐÒ»ÐеĶÁͼ£¬Ð§ÂʱȽϸߡ£C#Ó¦¸ÃÒ²ÓÐÀàËƵĶ«¶«¡£¾¹ýÒ»·¬ËÑË÷£¬ÖÕÓÚ·¢ÏÖÁËBitmapDataÀà¡£
ÏÈ¿´¸öÀý×Ó£¬ÕâÊǶÔÒ»ÕÅλͼµÄÿ¸öÏñËØ°´FFÈ¡²¹£¬È»ºóÊä³öµ½Ò»¸öÐÂͼ£¨´úÂëÓеã??£?»¹?¦¸Ã¿ÉÒÔ˵Ã÷ÎÊÌâÁË£?
int h = m_Bmp.Height;
int w = m_Bmp.Width;
Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);
BitmapData dataIn = m_Bmp.LockBits(new Rectangle(0,0,w,h),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
byte * pOut = (byte*)(dataOut.Scan0.ToPointer());
for (int y = 0; y < dataIn.Height; y++)
{
for (int x = 0; x < dataIn.Width; x++)
{
pOut[0] = (byte)(255 - pIn[0]);
pOut[1] = (byte)(255 - pIn[1]);
pOut[2] = (byte)(255 - pIn[2]);
pIn += 3;
pOut += 3;
}
pIn += dataIn.Stride - dataIn.Width * 3;
pOut += dataOut.Stride - dataOut.Width * 3;
}
}
bmpOut.UnlockBits(dataOut);
m_Bmp.UnlockBits(dataIn);
òËƱÈDelphi¸´Ôӵö࣬ÄѵÀÎÒÕæµÄÌìÉú¶ÔÖ¸Õë¹ýÃô£¿»¹ÊÇDelphiµÄ±È½ÏºÃÀí½â£¬¾ÍÊÇɨÃèÿһÐУ¬È»ºó¶Ôµ±Ç°ÏñËصãµÄÈý¸ö·ÖÁ¿×ö´¦Àí£¬·Ç³£·½±ã¡£¶øÇÒC#´úÂëÖеÄStrideÊǸöʲô¶«¶«£¿
²éÕÒÁ˲»ÉÙ×ÊÁÏ£¬ÏÖÔÚÎÒÊÇÕâôÀí½âµÄ£º
¼ÙÉèÓÐÒ»ÕÅͼƬ¿í¶ÈΪ6£¬ÒòΪÊÇFormat24bppRgb¸ñʽ(ÿÏñËØ3×Ö½Ú¡£ÔÚÒÔϵÄÌÖÂÛÖУ¬³ý·ÇÌرð˵Ã÷£¬·ñÔòBitmap¶¼±»ÈÏΪÊÇ24λRGB)µÄ£¬ÏÔÈ»£¬Ã¿Ò»ÐÐÐèÒª6*3=18¸ö×Ö½Ú´æ´¢¡£¶ÔÓÚBitmap¾ÍÊÇÈç´Ë¡£µ«¶ÔÓÚBitmapData£¬ËäÈ»BitmapData.Width»¹ÊǵÈÓÚBitmap.Width£¬µ«´ó¸ÅÊdzöÓÚÏÔʾÐÔÄܵĿ¼ÂÇ£¬Ã¿ÐеÄʵ¼ÊµÄ×Ö½ÚÊý½«±ä³É´óÓÚµÈÓÚËüµÄÄǸöÀëËü×î½üµÄ4µÄÕû±¶Êý£¬´ËʱµÄʵ¼Ê×Ö½ÚÊý¾ÍÊÇStride¡£¾Í´ËÀý¶øÑÔ£¬18²»ÊÇ4µÄÕû±¶Êý£¬¶ø±È18´óµÄÀë18×î½üµÄ4µÄ±¶ÊýÊÇ20£¬ËùÒÔÕâ¸öBitmapData.Stride = 20¡£ÏÔÈ»£¬µ±¿í¶È±¾Éí¾ÍÊÇ4µÄ±¶Êýʱ£¬BitmapData.Stride = Bitmap.Width * 3¡£
»¸öͼ¿ÉÄܸüºÃÀí½â¡£R¡¢G¡¢B ·Ö±ð´ú±í3¸öÔÉ«·ÖÁ¿×Ö½Ú£¬BGR¾Í±íʾһ¸öÏñËØ¡£ÎªÁË¿´ÆðÀ´·½±ãÎÒÔÚÿ¸öÏñËØÖ®¼ä²åÁ˸ö¿Õ¸ñ£¬Êµ¼ÊÉÏÊÇûÓеġ£X±íʾ²¹×ã4µÄ±¶Êý¶ø×Ô¶¯²åÈëµÄ×Ö½Ú¡£ÎªÁË·ûºÏÈËÀàµÄÔĶÁÏ°¹ßÎÒ·ÖÐÐÁË£¬ÆäʵÔÚ¼ÆËã»úÄÚ´æÖÐÓ¦¸Ã¿´³ÉÁ¬ÐøµÄÒ»´ó¶Î¡£
Scan0
¡¡---------Stride-----------------¡¡
¡¡---------Width-------------¡¡ ¡¡ ×¢£ºWidthÊÇͼƬ£¨BGR×÷Ϊһ¸öµ¥Î»£©¿í¶È
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
.
.
.
ÏÖÔÚÓ¦¸ÃºÜºÃÀí½âÁË¡£Ê×ÏÈÓà BitmapData.Scan0ÕÒµ½µÚ0¸öÏñËصĵÚ0¸ö·ÖÁ¿µÄµØÖ·¡£Õâ¸öµØÖ·Ö¸ÏòµÄÊǸöbyteÀàÐÍ£¬ËùÒÔµ±Ê±¶¨ÒåΪbyte* pIn¡£
ÐÐɨÃèʱ£¬ÔÚµ±Ç°Ö¸ÕëλÖ㨲»·Á¿´³Éµ±Ç°ÏñËصĵÚ0¸öÑÕÉ«·ÖÁ¿£©Á¬ÐøÈ¡³öÈý¸öÖµ£¨3¸öÔÉ«·ÖÁ¿¡£×¢Ò⣬0 1 2´ú±íµÄ´ÎÐòÊÇB G R¡£ÔÚÈ¡Ö¸ÕëÖ¸ÏòµÄֵʱ£¬Ã²ËÆp[n]ºÍp += nÔÙÈ¡p[0]Êǵȼ۵ģ©£¬È»ºóÏÂÒÆ3¸öλÖã¨pIn += 3£¬¿´³ÉÖ¸µ½ÏÂÒ»¸öÏñËصĵÚ0¸öÑÕÉ«·ÖÁ¿£©¡£×ö¹ýBitmap.Width´Î²Ù×÷ºó£¬¾Íµ½´ïÁËBitmap.Width * 3µÄλÖã¬Ó¦¸ÃÒªÌø¹ýͼÖбê¼ÇΪXµÄ×Ö½ÚÁË£¨¹²ÓÐStride - Width * 3¸ö×Ö½Ú£©£¬´úÂëÖоÍÊÇ pIn += dataIn.Stride - dataIn.Width * 3;
Ìø¹ýÒÔºóÖ¸Õë¾Íµ½´ïÏÂÐеĵÚ0¸öÏñËØÁË¡£°´ÕÕ´ËËã·¨,Ò»¹²ÐèÒª×öBitmap.Height´ÎÐÐɨÃ裨´úÂë¾ÍÊÇ for (int y = 0; y < dataIn.Height; y++)£©¡£
ÁíÍ⣬ÒòΪʹÓÃÁËunsafe£¬ËùÒÔ±àÒëµÄʱºòÐèÒªÉèÖá°ÔÊÐí²»°²È«µÄ´úÂ롱¡£
¹Ø¼ü´Ê£º
- ÉÏһƪ£ºC#ʵÏÖ´°¿Ú×îС»¯µ½ÏµÍ³ÍÐÅÌ
- ÏÂһƪ£ºÊ¹ÓÃVCʵÏÖJPGͼƬ¼ÓÔØ
ÍƼöÓ¦ÓÃ
»»Ò»»»
- ±¾ÀàÍƼö
- ±¾ÀàÅÅÐÐ
- 1visual studio2015ÏÂÔØ°²×°Ê¹Óý̳ÌͼÎÄÏê½â
- 2mysql±àÂëÉèÖÃ½Ì³Ì mysql±àÂëÔõôÉèÖò½Öè
- 3swiftÓïÑÔ¿ª·¢»·¾³´î½¨½Ì³Ì swiftÓïÑÔ±à³Ì»·¾³´î½¨Á÷³Ì
- 4swiftÓïÑÔѧϰ½Ì³Ì Æ»¹ûswift±à³ÌÓïÑÔ»ù´¡½Ì³Ì
- 5VirtualBox´î½¨RAC²âÊÔ»·¾³¹²Ïí´æ´¢Éè¼Æ½Ì³Ì
- 6C#ÖÐcontinueÓï¾äµÄÓ÷¨
- 7iOS ÎļþÔõô´´½¨£¿ÔõôʹÓñ¾µØ»¯ÓïÑÔÖÐÎÄ£¿
- 8C#³£ÓõÄÕýÔò±í´ïʽ 30¸öC#ÕýÔò±í´ïʽ
- 9Cocos2d-x windowsÓëvs2010 °²×°ÅäÖÃͼÎĽ̳Ì
- 10WindowsÏ°²×°Æ»¹ûiPhone¿ª·¢»·¾³xcodeͼÎĽ̳Ì
- ÈÈÃÅÈí¼þ
- ÈÈÃűêÇ©