原文:Win8 Metro(C#)数字图像处理--2.61哈哈镜效果



[函数名称]

哈哈镜效果函数  WriteableBitmap DistortingMirrorProcess(WriteableBitmap src, int x, int y)

[算法说明]

哈哈镜效果图像实际上是一种图像形变特效而已,对于这个特效,我们可以通过三角变换来实现。

1,对于哈哈镜效果变换,首先它有两个参数,原点坐标和特效影响因子。

对于图像中的像素点P(x,y),假设原点坐标为X,Y,那么,根据三角函数变换可以得到:

当前像素P的相对坐标cX,cY:

  1. /// <summary>
  2. /// Distorting mirror process.
  3. /// </summary>
  4. /// <param name="src">The source image.</param>
  5. /// <param name="x">Origin of coordinates in x direction.</param>
  6. /// <param name="y">Origin of coordinates in y direction.</param>
  7. /// <returns></returns>
  8. public static WriteableBitmap DistortingMirrorProcess(WriteableBitmap src, int x, int y)////哈哈镜特效
  9. {
  10. if (src != null)
  11. {
  12. int w = src.PixelWidth;
  13. int h = src.PixelHeight;
  14. WriteableBitmap srcImage = new WriteableBitmap(w, h);
  15. byte[] temp = src.PixelBuffer.ToArray();
  16. byte[] tempMask = (byte[])temp.Clone();
  17. int radius = 0;
  18. double theta = 0;
  19. int tX = 0;
  20. int tY = 0;
  21. int mapX = 0;
  22. int mapY = 0;
  23. int mapR=0;
  24. for (int j = 0; j < h; j++)
  25. {
  26. for (int i = 0; i < w; i++)
  27. {
  28. tX = i - x;
  29. tY = j - y;
  30. theta = Math.Atan2((double)tY, (double)tX);
  31. radius = (int)Math.Sqrt((double)(tX * tX + tY * tY));
  32. mapR = (int)(Math.Sqrt((double)radius * 100));
  33. mapX = x + (int)(mapR * Math.Cos(theta));
  34. mapY = y + (int)(mapR * Math.Sin(theta));
  35. temp[i * 4 + j * w * 4] = tempMask[mapX * 4 + mapY * w * 4];
  36. temp[i * 4 + 1 + j * w * 4] = tempMask[mapX * 4 + 1 + mapY * w * 4];
  37. temp[i * 4 + 2 + j * w * 4] = tempMask[mapX * 4 + 2 + mapY * w * 4];
  38. }
  39. }
  40. Stream sTemp = srcImage.PixelBuffer.AsStream();
  41. sTemp.Seek(0, SeekOrigin.Begin);
  42. sTemp.Write(temp, 0, w * 4 * h);
  43. return srcImage;
  44. }
  45. else
  46. {
  47. return null;
  48. }
  49. }

[图像效果]

Win8 Metro(C#)数字图像处理--2.61哈哈镜效果的更多相关文章

  1. Win8 Metro(C#)数字图像处理--2.75灰度图像的形态学算法

    原文:Win8 Metro(C#)数字图像处理--2.75灰度图像的形态学算法 前面章节中介绍了二值图像的形态学算法,这里讲一下灰度图的形态学算法,主要是公式,代码略. 1,膨胀算法 2,腐蚀算法 3 ...

  2. Win8 Metro(C#)数字图像处理--4图像颜色空间描述

    原文:Win8 Metro(C#)数字图像处理--4图像颜色空间描述  图像颜色空间是图像颜色集合的数学表示,本小节将针对几种常见颜色空间做个简单介绍. /// <summary> / ...

  3. Win8 Metro(C#)数字图像处理--3.2图像方差计算

    原文:Win8 Metro(C#)数字图像处理--3.2图像方差计算 /// <summary> /// /// </summary>Variance computing. / ...

  4. Win8 Metro(C#)数字图像处理--3.3图像直方图计算

    原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...

  5. Win8 Metro(C#)数字图像处理--3.4图像信息熵计算

    原文:Win8 Metro(C#)数字图像处理--3.4图像信息熵计算 [函数代码] /// <summary> /// Entropy of one image. /// </su ...

  6. Win8 Metro(C#)数字图像处理--3.5图像形心计算

    原文:Win8 Metro(C#)数字图像处理--3.5图像形心计算 /// <summary> /// Get the center of the object in an image. ...

  7. Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效

    原文:Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效 /// <summary> /// Image merge process. /// </summar ...

  8. Win8 Metro(C#)数字图像处理--3.1图像均值计算

    原文:Win8 Metro(C#)数字图像处理--3.1图像均值计算 /// <summary> /// Mean value computing. /// </summary> ...

  9. Win8 Metro(C#)数字图像处理--2.74图像凸包计算

    原文:Win8 Metro(C#)数字图像处理--2.74图像凸包计算 /// <summary> /// Convex Hull compute. /// </summary> ...

随机推荐

  1. wait()、notify()、notifyAll()与线程通信方式总结

    1.通过wait().notify().notifyAll()进行线程通信 线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号.例如,线程B可以等待线程A的一个信 ...

  2. js进阶 10-8 伪类选择器有哪几类(自己不用,永远不是自己的)

    js进阶 10-8 伪类选择器有哪几类(自己不用,永远不是自己的) 一.总结 一句话总结:自己不用,永远不是自己的. 0.学而不用,却是为何? 自己不用,永远不是自己的,有需求的时候要想到它,然后操作 ...

  3. 怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨

    从最初学习使用log4j的时候,网上和书本上主要都是使用"log4j.properties"这种属性格式,配置日志.多年以来,一直使用这种格式,总的来说,简单.够用.    而有十 ...

  4. Erlang 命令行监控工具

    http://www.cnblogs.com/me-sa/archive/2012/11/22/erlang_vm_monitor_text_mode.html 之前介绍过一个Erlang的Web监控 ...

  5. 一起学Python:多线程-共享全局变量

    多线程-共享全局变量 from threading import Thread import time g_num = 100 def work1(): global g_num for i in r ...

  6. 【b604】2K进制数

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 设r是个2K进制数,并满足以下条件: (1)r至少是个2位的2K进制数. (2)作为2K进制数,除最后一 ...

  7. C 删除字符串1字符串2

    #include<stdio.h> #include<string.h> void main() { char s1[1000],s2[100],b[100]; int i,j ...

  8. 经典图形的绘制(matlab)

    1. radial sinusoïdal signal:径向正弦信号 [xx, yy] = meshgrid(-50:50); I = sin(sqrt(xx.^2+yy.^2)); imshow(I ...

  9. Apache2.4.25 VirtualHost rewrite_module

    LoadModule rewrite_module libexec/apache2/mod_rewrite.so Include /private/etc/apache2/extra/httpd-vh ...

  10. C#将string转换为十六进制

    /// <summary>         /// 将string格公式为十六进制数据         /// </summary>         /// <param ...