Â̲èÈí¼þÔ°
×ÊѶÊ×Ò³> Èí¼þ½Ì³Ì> ±à³Ì¿ª·¢> C#µÄBitmapDataʹÓü¼ÇÉ

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£¬ËùÒÔ±àÒëµÄʱºòÐèÒªÉèÖá°ÔÊÐí²»°²È«µÄ´úÂ롱¡£

¹Ø¼ü´Ê£º
  • ÈÈÃÅÈí¼þ
  • ÈÈÃűêÇ©
·µ»Ø¶¥²¿