C# 指针操作图像

读取图片时,请参考bolg文章:C#图片的像素格式问题研究 (http://www.cnblogs.com/lixunwu/articles/6691962.html)

private unsafe void ProcessFilter(Bitmap imageT)
        {
                PixelFormat pixelFormat = imageT.PixelFormat;
                // get image dimension
                int width = imageT.Width;
                int height = imageT.Height;
                Rectangle rect = new Rectangle(0, 0, width, height);
                BitmapData image = new BitmapData();
                image = imageT.LockBits(rect, ImageLockMode.ReadWrite, pixelFormat);
                // pixel value

                if (
                    (pixelFormat == PixelFormat.Format8bppIndexed) ||
                    (pixelFormat == PixelFormat.Format24bppRgb) ||
                    (pixelFormat == PixelFormat.Format32bppRgb) ||
                    (pixelFormat == PixelFormat.Format32bppArgb))
                {
                    // initialize other variables
                    int pixelSize = (pixelFormat == PixelFormat.Format8bppIndexed) ? 1 :
                        (pixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4;
                    int lineSize = width * pixelSize;
                    int srcOffset = image.Stride - lineSize;

                    // do the job
                    byte* ptr = (byte*)image.Scan0.ToPointer();
                    // for each line
                    for (int y = 0; y < height; y++)
                    {
                        // for each pixel
                        for (int x = 0; x < lineSize; x++, ptr += pixelSize)
                        {
                            //ptr[0] ptr[1] ptr[2]
//
int temp = *ptr; //countPixel[temp]++; //if (countPixel[temp] > maxPixel) //{ // maxPixel = countPixel[temp]; //} } ptr += srcOffset; } imageT.UnlockBits(image); ptr = null; imageT = null; image = null; }
// else 部分的代码未修正         
else { // initialize other variables int pixelSize = ( pixelFormat == PixelFormat.Format16bppGrayScale ) ? 1 : ( pixelFormat == PixelFormat.Format48bppRgb ) ? 3 : 4; int lineSize = width * pixelSize; int srcStride = image.Stride; int ovrStride = overlay.Stride; // do the job byte* basePtr = (byte*) image.ImageData.ToPointer( ); byte* baseOvr = (byte*) overlay.ImageData.ToPointer( ); // for each line for ( int y = 0; y < height; y++ ) { ushort * ptr = (ushort*) ( basePtr + y * srcStride ); ushort * ovr = (ushort*) ( baseOvr + y * ovrStride ); // for each pixel for ( int x = 0; x < lineSize; x++, ptr++, ovr++ ) { // abs(sub) v = (int) *ptr - (int) *ovr; *ptr = ( v < 0 ) ? (ushort) -v : (ushort) v; } } }

 

转载于:https://www.cnblogs.com/lixunwu/articles/6692007.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值