QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码
查看: 775|回复: 0

图像滤镜---球面(凹凸)化

[复制链接]

classn_11

1

主题

1

帖子

34

积分

新手上路

Rank: 1

积分
34
发表于 2017-1-25 19:18:43 | 显示全部楼层 |阅读模式
temp1.png
原图
temp2.png
凸面化处理结果
temp3.png
凹面化处理结果

C#源码:
  1. /// <summary>
  2.         /// 图像滤镜---球面(凹凸)化
  3.         /// </summary>
  4.         /// <param name="bitmap">待处理图片</param>
  5.         /// <param name="originPoint">球面化的处理原点</param>
  6.         /// <param name="radius">球面化半径</param>
  7.         /// <param name="raised">是否凸面化</param>
  8.         /// <returns></returns>
  9.         private Bitmap GetHandledImage(Bitmap bitmap, Point originPoint, int radius, bool raised)
  10.         {
  11.             var bmp = (Bitmap)bitmap.Clone();
  12.             if (radius <= 0) return bmp;
  13.             try
  14.             {
  15.                 var originX = (int)Math.Ceiling(originPoint.X) - 1;
  16.                 var originY = (int)Math.Ceiling(originPoint.Y) - 1;
  17.                 var width = bmp.Width;
  18.                 var height = bmp.Height;
  19.                 const int pixelSize = 4;
  20.                
  21.                 var bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
  22.                 var byColorInfo = new byte[height * bmpData.Stride];
  23.                 Marshal.Copy(bmpData.Scan0, byColorInfo, 0, byColorInfo.Length);

  24.                 #region Safe

  25.                 //var clone = (byte[])byColorInfo.Clone();
  26.                 //for (var x = 0; x < width; x++)
  27.                 //{
  28.                 //    for (var y = 0; y < height; y++)
  29.                 //    {
  30.                 //        var dx = x - originX;
  31.                 //        var dy = y - originY;
  32.                 //        var distance = Math.Sqrt(dx * dx + dy * dy);
  33.                 //        if (distance <= radius)
  34.                 //        {
  35.                 //            var theta = Math.Atan2(dy, dx);
  36.                 //            var mapR = raised ? (2 * radius / Math.PI) * Math.Asin(distance / radius) : Math.Sin(Math.PI * distance / (2 * radius)) * radius;

  37.                 //            dx = originX + (int)(mapR * Math.Cos(theta));
  38.                 //            dy = originY + (int)(mapR * Math.Sin(theta));

  39.                 //            if (dx < 0 || dx >= width || dy < 0 || dy >= height)
  40.                 //            {
  41.                 //                byColorInfo[y * bmpData.Stride + x * pixelSize] =
  42.                 //                    byColorInfo[y * bmpData.Stride + x * pixelSize + 1] =
  43.                 //                        byColorInfo[y * bmpData.Stride + x * pixelSize + 2] =
  44.                 //                            byColorInfo[y * bmpData.Stride + x * pixelSize + 3] = 0;
  45.                 //            }
  46.                 //            else
  47.                 //            {
  48.                 //                byColorInfo[y * bmpData.Stride + x * pixelSize] = clone[dy * bmpData.Stride + dx * 4];
  49.                 //                byColorInfo[y * bmpData.Stride + x * pixelSize + 1] = clone[dy * bmpData.Stride + dx * 4 + 1];
  50.                 //                byColorInfo[y * bmpData.Stride + x * pixelSize + 2] = clone[dy * bmpData.Stride + dx * 4 + 2];
  51.                 //                byColorInfo[y * bmpData.Stride + x * pixelSize + 3] = clone[dy * bmpData.Stride + dx * 4 + 3];
  52.                 //            }
  53.                 //        }

  54.                 //    }
  55.                 //}
  56.                 //Marshal.Copy(byColorInfo, 0, bmpData.Scan0, byColorInfo.Length);

  57.                 #endregion

  58.                 #region Unsafe

  59.                 unsafe
  60.                 {
  61.                     fixed (byte* source = byColorInfo)
  62.                     {

  63.                         var ptr = (byte*)(bmpData.Scan0);
  64.                         for (var y = 0; y < height; y++)
  65.                         {
  66.                             for (var x = 0; x < width; x++)
  67.                             {
  68.                                 var dx = x - originX;
  69.                                 var dy = y - originY;
  70.                                 var distance = Math.Sqrt(dx * dx + dy * dy);
  71.                                 if (distance <= radius)
  72.                                 {
  73.                                     var theta = Math.Atan2(dy, dx);
  74.                                     var mapR = raised ? (2 * radius / Math.PI) * Math.Asin(distance / radius): Math.Sin(Math.PI * distance / (2 * radius)) * radius;

  75.                                     dx = originX + (int)(mapR * Math.Cos(theta));
  76.                                     dy = originY + (int)(mapR * Math.Sin(theta));

  77.                                     if (dx < 0 || dx >= width || dy < 0 || dy >= height)
  78.                                     {
  79.                                         ptr[0] = ptr[1] = ptr[2] = ptr[3] = 0;
  80.                                     }
  81.                                     else
  82.                                     {
  83.                                         ptr[0] = source[dy * bmpData.Stride + dx * pixelSize];
  84.                                         ptr[1] = source[dy * bmpData.Stride + dx * pixelSize + 1];
  85.                                         ptr[2] = source[dy * bmpData.Stride + dx * pixelSize + 2];
  86.                                         ptr[3] = source[dy * bmpData.Stride + dx * pixelSize + 3];

  87.                                     }
  88.                                 }

  89.                                 ptr += pixelSize;
  90.                             }
  91.                         }
  92.                     }
  93.                 }

  94.                 #endregion

  95.                 bmp.UnlockBits(bmpData);
  96.                 return bmp;
  97.             }
  98.             catch (Exception e)
  99.             {
  100.                 return (Bitmap)bitmap.Clone();
  101.             }
  102.             
  103.         }
复制代码


回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

    联系我们
  • QQ:3243218172
  • 邮箱:3243218172@qq.com
  • QQ交流群:567648913
    手机扫描二维码