图像滤镜艺术---Swirl滤镜

简介: 原文:图像滤镜艺术---Swirl滤镜Swirl Filter Swirl 滤镜是实现图像围绕中心点(cenX,cenY)扭曲旋转的效果,效果图如下: 原图 效果图 代码如下:         //         ///     ...
原文: 图像滤镜艺术---Swirl滤镜

Swirl Filter

Swirl 滤镜是实现图像围绕中心点(cenX,cenY)扭曲旋转的效果,效果图如下:

原图

效果图

代码如下:

        //

        ///

        /// Swirl Filter

        ///

        /// Source image.

        /// The X position of Swirl.

        /// The Y position of Swirl.

        /// The degree of swirl,0-360.

        /// The result image.

        private Bitmap SwirlFilterProcess(Bitmap srcBitmap, int cenX, int cenY, int swilDegree)

        {

            Bitmap a = new Bitmap(srcBitmap);

            int w = a.Width;

            int h = a.Height;

            int radius = 0;

            swilDegree = Math.Max(0, Math.Min(360, swilDegree));

            double k = swilDegree / 3600.0;

            Bitmap dst = new Bitmap(w, h);

            System.Drawing.Imaging.BitmapData srcData = a.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            System.Drawing.Imaging.BitmapData dstData = dst.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            unsafe

            {

                byte* pIn = (byte*)srcData.Scan0.ToPointer();

                byte* pOut = (byte*)dstData.Scan0.ToPointer();

                byte* p = null;

                int stride = srcData.Stride - w * 4;

                int offsetX = 0, offsetY = 0;

                int newX = 0, newY = 0;

                double radian = 0;

                for (int y = 0; y < h; y++)

                {

                    for (int x = 0; x < w; x++)

                    {

                        offsetX = x - cenX;

                        offsetY = y - cenY;

                        radian = Math.Atan2(offsetY, offsetX);

                        radius = (int)(Math.Sqrt(offsetX * offsetX + offsetY * offsetY));

                        newX = (int)(radius * Math.Cos(radian + k * radius)) + cenX;

                        newY = (int)(radius * Math.Sin(radian + k * radius)) + cenY;

                        newX = Math.Min(w - 1, Math.Max(0, newX));

                        newY = Math.Min(h - 1, Math.Max(0, newY));

                        p = pIn + newY * srcData.Stride + newX * 4;

                        pOut[0] = (byte)p[0];

                        pOut[1] = (byte)p[1];

                        pOut[2] = (byte)p[2];

                        pOut[3] = (byte)255;                     

                        pOut += 4;

                    }

                    pOut += stride;

                }

                a.UnlockBits(srcData);

                dst.UnlockBits(dstData);

            }

            return dst;


        }

最后放上一个完整的C#程序Demo下载地址:http://www.zealpixel.com/thread-58-1-1.html,另外,推荐一个网址www.zealpixel.com,有很多不错的图像处理开源代码!

目录
相关文章
|
计算机视觉
使用计算机视觉实战项目精通 OpenCV:1~5
使用计算机视觉实战项目精通 OpenCV:1~5
442 0
|
4月前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods 技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
存储 Java 编译器
String能存储多少个字符?
这篇内容讨论了Java中String的长度限制。编译时,如果字符串长度大于等于65535,编译器将报错。这是由于`CONSTANT_Utf8`常量池项的长度字段是16位无符号整数,最大值为65535。而在运行时,虽然理论上String的最大长度是2^31-1,但实际长度受限于JVM内存,最大可能占用约2GB内存,超过可能导致OutOfMemoryError。JDK9以后,对于LATIN1字符的字符串,存储优化使用byte数组,节省内存。
711 1
String能存储多少个字符?
|
7月前
|
JSON API 开发者
1688 快递费用 API 接口的技术剖析与应用
1688快递费用API接口为企业和开发者提供自动化、高效化的快递费用查询服务,打破人工查询的繁琐局面。通过输入寄件与收件地址、商品重量、体积及选择快递公司等信息,接口精准计算费用并返回结果,支持中通、圆通等主流快递。输出内容包括快递费用、预估时效及附加费说明,助力电商精细化运营。Python示例代码展示了如何使用requests库发起POST请求并解析响应数据,实现费用查询自动化。
377 10
|
安全 Java Android开发
探索安卓应用开发的新趋势:Kotlin和Jetpack Compose
在安卓应用开发领域,随着技术的不断进步,新的编程语言和框架层出不穷。Kotlin作为一种现代的编程语言,因其简洁性和高效性正逐渐取代Java成为安卓开发的首选语言。同时,Jetpack Compose作为一个新的UI工具包,提供了一种声明式的UI设计方法,使得界面编写更加直观和灵活。本文将深入探讨Kotlin和Jetpack Compose的特点、优势以及如何结合使用它们来构建现代化的安卓应用。
370 11
|
数据挖掘 Python
pandas中的groupby函数应用
pandas中的groupby函数应用
137 0
pandas中的groupby函数应用
|
弹性计算 自然语言处理 API
速成RAG+Agent框架大模型应用搭建
本文侧重于能力总结和实操搭建部分,从大模型应用的多个原子能力实现出发,到最终串联搭建一个RAG+Agent架构的大模型应用。
|
存储 弹性计算 运维
阿里云容器服务Kubernetes版(ACK)部署与管理体验评测
阿里云容器服务Kubernetes版(ACK)是一个功能全面的托管Kubernetes服务,它为企业提供了快速、灵活的云上应用管理能力。
380 2
|
SQL 关系型数据库 MySQL
OBCP实践 - 迁移 MySQL 数据到 OceanBase 集群
OBCP实践 - 迁移MySQL数据到OceanBase集群,这是一个涉及到将现有MySQL数据库的数据和表结构迁移到OceanBase分布式数据库集群的实际操作过程。OceanBase是一款高度兼容MySQL协议的分布式数据库产品,支持在线平滑迁移,以便企业用户可以从传统的MySQL数据库平滑迁移到OceanBase,以实现更高的可用性、扩展性和性能。
359 0
|
人工智能 自然语言处理 前端开发
探索AI时代的应用工程化架构演进,一人公司时代还有多远?
当代AI来势汹汹,本文从AI的特点、对研发的挑战、AI的应用工程和场景分化等剖析了AI时代的应用工程化架构演进之路。
21343 6