ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: aman1516

[讨论] 图个有趣,VBA也玩PS图片特效

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-4-12 21:30 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2025-4-13 12:35 | 显示全部楼层
这个值的去学习。

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-15 21:55 | 显示全部楼层
本帖最后由 aman1516 于 2025-4-15 22:04 编辑

继续 VBA学PS  扭曲系列之  极点图


Polp1-0.jpg
Polp1-1.jpg
Polp1-2.jpg
Polp2-0.jpg
Polp2-1.jpg
Polp2-2.jpg
Polp3-0.jpg
Polp3-1.jpg
Polp3-2.jpg
Polp4-0.jpg
Polp4-1.jpg
Polp5-0.jpg
Polp5-1.jpg
以图片上边或下边的中心点为极点,直角坐标转极轴图坐标即可
纯作测试,要美观,将原图两边或极点图接合线的地方作过渡处理一下



TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-15 21:58 | 显示全部楼层
核心代码:
  1. '直角坐标转极轴坐标
  2. Function ConvertCartesianToPolar(x As Double, y As Double, ByRef r As Double, ByRef theta As Double)
  3.     ' 计算极径r
  4.     r = Sqr(x ^ 2 + y ^ 2)
  5.    
  6.     ' 计算极角θ(弧度)
  7.     If x > 0 Then
  8.         theta = Atn(y / x)
  9.     ElseIf x < 0 Then
  10.         theta = Atn(y / x) + Sgn(y) * 3.14159265358979
  11.     ElseIf y > 0 Then
  12.         theta = 3.14159265358979 / 2
  13.     ElseIf y < 0 Then
  14.         theta = -3.14159265358979 / 2
  15.     Else
  16.         theta = 0  ' 原点情况
  17.     End If
  18.    
  19.     ' 转换为角度(可选)
  20.     ' theta = theta * 180 / 3.14159265358979
  21. End Function

  22. '极轴坐标转直角坐标
  23. Function ConvertPolarToCartesian(r As Double, theta As Double, ByRef x As Double, ByRef y As Double)
  24.     ' 将角度转换为弧度(如果输入是角度)
  25.     ' theta = theta * 3.14159265358979 / 180
  26.    
  27.     ' 计算直角坐标
  28.     x = r * Cos(theta)
  29.     y = r * Sin(theta)
  30. End Function

  31. '使用示例:
  32. Sub TestCoordinateConversion()
  33.     Dim x As Double, y As Double
  34.     Dim r As Double, theta As Double
  35.    
  36.     ' 直角坐标转极坐标示例
  37.     x = 3
  38.     y = 4
  39.     ConvertCartesianToPolar x, y, r, theta
  40.     Debug.Print "直角坐标 (" & x & ", " & y & ") 转换为极坐标: r = " & r & ", θ = " & theta & " 弧度"
  41.    
  42.     ' 极坐标转直角坐标示例
  43.     ConvertPolarToCartesian r, theta, x, y
  44.     Debug.Print "极坐标 (r=" & r & ", θ=" & theta & ") 转换为直角坐标: (" & x & ", " & y & ")"
  45. End Sub
复制代码


这个比较简单,往模板里套就行了
PS未完待续......

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-17 16:30 | 显示全部楼层
继续 VBA学PS  扭曲系列之  扇形图:

Secp-01.jpg
Secp-04.jpg
Secp-03.jpg
其实就是极点图的变体,加一个内半径

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-17 16:38 | 显示全部楼层
由于极点坐标是圆形扩散,越外围越会出现投射不到的“空白点”,
查资料,一般采取双列插值方法进行填充,没学会,想了个先放大再缩小的笨方法,勉强处理一下

扇形图片完整代码如下(未优化):

  1. Sub SecImg()    '扇形效果图
  2.     Dim Img, Img1 'As ImageFile
  3.     Dim IP 'As ImageProcess
  4.     Dim v, v1 'As Vector
  5.     Dim f, f1, w As Long, h As Long, w1 As Long, w2 As Long, h1 As Long, h2 As Long, z, t, ps As Integer
  6.     Dim i As Long, j As Long, k As Long, k1 As Long, ii As Long, jj As Long, r As Long, a As Double, jd As Double
  7.     Const pi = 3.1415926
  8.     ''1弧度=57.3度, 1度=0.0174533弧度
  9.     On Error Resume Next
  10.     Set Img = CreateObject("WIA.ImageFile")
  11.     Set Img1 = CreateObject("WIA.ImageFile")
  12.     Set IP = CreateObject("WIA.ImageProcess")
  13.    
  14.     f1 = ThisWorkbook.Path & "\186.bmp"
  15.     Img1.LoadFile f1
  16.     w1 = Img1.width
  17.     h1 = Img1.height
  18.     w = w1 * 1.5
  19.     h = h1 * 1.33
  20.     x = 2.5     '缩放系数: 0 < x < 1 为缩小,大于 1 为放大
  21.     IP.Filters.Add IP.FilterInfos("Scale").FilterID
  22.     IP.Filters(1).Properties("MaximumWidth") = w1 * x
  23.     IP.Filters(1).Properties("MaximumHeight") = h1 * x
  24.     Set Img1 = IP.Apply(Img1)
  25.     Set v1 = Img1.ARGBData
  26.     w1 = Img1.width
  27.     h1 = Img1.height
  28.     Set v = CreateObject("WIA.Vector")
  29.     For z = 1 To w * h
  30.         v.Add &HFFFFFFFF
  31.         'v.Add 16777215
  32.     Next
  33.     r1 = 250
  34.     cj = w / 2
  35.     ci = h / 2
  36.     jd = 0.62 * pi    '旋转角度
  37.     For i = 1 To h1
  38.         For j = 1 To w1
  39.             k1 = (i - 1) * w1 + j
  40.             'A = 2 * pi * j / w1
  41.             a = -0.75 * pi * j / w1 - jd
  42.             jj = w / 2 + (h1 - i + r1) / x * Sin(a)
  43.             ii = h / 2 + (h1 - i + r1) / x * Cos(a) + r1 - 50
  44.             k = (ii - 1) * w + jj
  45.             v(k) = v1(k1)
  46.             'For t = k - 2 To k
  47.             '    If v(t) = &HFFFFFFFF Then v(t) = v1(k1)
  48.             'Next
  49.        Next
  50.     Next
  51.     Set Img = v.ImageFile(w, h)
  52.     f = ThisWorkbook.Path & "\Secp.bmp"
  53.     If Dir(f) <> "" Then Kill f
  54.     Img.SaveFile f   '"Blue." & Img.FileExtension
  55.     MsgBox "ok!"
  56. End Sub
复制代码




TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-17 16:43 | 显示全部楼层
详见测试附件:

PS扭曲系列之扇形图.rar (677.54 KB, 下载次数: 21)

PS未完待续,下一节,PS扭曲变形之球形效果......


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-17 17:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
aman1516 发表于 2025-4-17 16:38
由于极点坐标是圆形扩散,越外围越会出现投射不到的“空白点”,
查资料,一般采取双列插值方法进行填充, ...

期待球面变换

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-17 17:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
先 “知其然,而知其所以然” ——
图像球面化算法-学习笔记
https://blog.csdn.net/sinat_29018995/article/details/113886068

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-18 16:52 | 显示全部楼层

依葫芦画瓢,原坐标替换新的newX ,newY坐标
int newX = center.x + (int)(pow(rou, 2) / max(center.x, center.y) * cos(theta))
int newY = center.y + (int)(pow(rou, 2) / max(center.x, center.y) * sin(theta))
球面图片大致是下效果:
Spsp0.jpg
Spsp3.jpg
Spsp4.jpg
曲面影射图片会“露点”仍是个问题,算法得优化......



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-12-15 03:23 , Processed in 1.065167 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表