• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[郭立员] 「安卓按键」脚本实现图片旋转 [复制链接]

1#

大家好,我是公众号3分钟学堂的郭立员,今天继续学习安卓按键。


上期文章讲到怎么实现图片旋转,但是有一个问题,自带的命令只能实现90度及其倍数的角度旋转。


如果我想要旋转20°,35°,41°等任意角度,自带命令就无法实现。那怎么办呢?


于是我翻出了珍藏20年的初中数学课本,找到角度的正弦、余弦、正切这节课,重新温习了一遍,顿时豁然开朗了,才思泉涌,想到了解决思路。然后……


好吧,编不下去了,直接进入主题吧。


我们以图片中心点为旋转中心,进行旋转。



在图的左上角区域有一个红点,大家稍微留意一下,下面我们开始顺时针旋转45°。



旋转后红点发生了变化,我们隐去图片看一下。




这两个点有啥关系:


①相距中心点的距离相同



②角度相差45°



有了这两个关系,我们运用正弦、余弦、正切就可以根据第一点坐标,计算出旋转45度以后的坐标,因为第一点是任意的点,所以我们可以通过遍历所有点,然后在算出每个点旋转后的坐标,把颜色值直接赋值过去,就得到新的图片。


当然我知道,大家基本上数学都忘得差不多了,我也是回忆了半天才想起来的,做了一下笔记,计算出4个象限的计算公式。





按照公式套用命令代码:

  1. Dim Path = "/sdcard/pictures/b.png"
  2. Dim NewPath = "/sdcard/pictures/3k.jpg"
  3. dim PicSize = Image.Size(Path)
  4. Dim x=PicSize[1]
  5. Dim y=PicSize[2]
  6. Dim PixelData =Image.GetPicData(Path)
  7. Dim NewPixelData= Image.GetScreenData(1,1,x,y)
  8. For i = 1 To x
  9. For j = 1 To y
  10. For k = 1 To 3
  11. NewPixelData[i][j][k]=255
  12. Next
  13. Next
  14. Next
  15. Dim x0=int(x/2)
  16. Dim y0=int(y/2)
  17. Dim n=120
  18. Dim xf,yf
  19. PixelData[1][1][1] = 255
  20. PixelData[1][1][2] = 255
  21. PixelData[1][1][3]=255
  22. For i = 1 To x
  23. For j = 1 To y
  24. For k = 1 To 3
  25. xf = getx(x0, y0, i, j, n)
  26. yf = gety(x0, y0, i, j, n)
  27. // TracePrint xf,yf,k,"|",i,j,k
  28. If xf < 1 or yf < 1 or cstr(xf)="-nan" or cstr(yf)="-nan" Then
  29. xf = 1
  30. yf=1
  31. End If
  32. NewPixelData[i][j][k] = PixelData[xf][yf][k]
  33. Next
  34. Next
  35. Next
  36. Image.SavePixelData NewPixelData, NewPath


  37. Function getx(x0,y0,x1,y1,n)
  38. Dim r=Sqr((x0-x1)^2+(y0-y1)^2)
  39. Dim pi=3.14
  40. Dim t1,t2,x2,y2
  41. If x0 >= x1 and y0 >= y1 Then
  42. t1=atn((y0-y1)/(x0-x1))
  43. t2=t1+n*pi/180
  44. x2 = x0 - Cos(t2) * r
  45. If x2 > x0 * 2 Then
  46. getx = 0
  47. Else
  48. getx=round(x2)
  49. End If
  50. ElseIf x0 <= x1 and y0 >= y1 Then
  51. t1 = Atn((x1 - x0) / (y0 - y1))
  52. t2 = t1 + n * pi / 180
  53. x2 = x0 + Sin(t2) * r
  54. If x2 > x0 * 2 Then
  55. getx = 0
  56. Else
  57. getx=round(x2)
  58. End If
  59. ElseIf x1 <= x0 and y1 >= y0 Then
  60. t1 = Atn((x0 - x1) / (y1 - y0))
  61. t2 = t1 + n * pi / 180
  62. x2 = x0 - Sin(t2) * r
  63. If x2 > x0 * 2 Then
  64. getx = 0
  65. Else
  66. getx=round(x2)
  67. End If
  68. ElseIf x1 >= x0 and y1 >= y0 Then
  69. t1 = Atn((y1 - y0) / (x1 - x0))
  70. t2 = t1 + n * pi / 180
  71. x2 = x0 + Cos(t2) * r
  72. If x2 > x0 * 2 Then
  73. getx =0
  74. Else
  75. getx=round(x2)
  76. End If
  77. End If
  78. End Function


  79. Function gety(x0, y0, x1, y1, n)
  80. Dim r=Sqr((x0-x1)^2+(y0-y1)^2)
  81. Dim pi=3.14
  82. Dim t1,t2,x2,y2
  83. If x0 >= x1 and y0 >= y1 Then
  84. t1=atn((y0-y1)/(x0-x1))
  85. t2=t1+n*pi/180
  86. y2 = y0 - sin(t2) * r
  87. If y2 > y0 * 2 Then
  88. gety = 0
  89. Else
  90. gety=round(y2)
  91. End If
  92. ElseIf x0 <= x1 and y0 >= y1 Then
  93. t1 = Atn((x1 - x0) / (y0 - y1))
  94. t2 = t1 + n * pi / 180
  95. y2 = y0-cos(t2) * r
  96. If y2 > y0 * 2 Then
  97. gety = 0
  98. Else
  99. gety=round(y2)
  100. End If
  101. ElseIf x1 <= x0 and y1 >= y0 Then
  102. t1 = Atn((x0 - x1) / (y1 - y0))
  103. t2 = t1 + n * pi / 180
  104. y2 = y0 + Cos(t2) * r
  105. If y2 > y0 * 2 Then
  106. gety = 0
  107. Else
  108. gety=round(y2)
  109. End If
  110. ElseIf x1 >= x0 and y1 >= y0 Then
  111. t1 = Atn((y1 - y0) / (x1 - x0))
  112. t2 = t1 + n * pi / 180
  113. y2 = y0 + Sin(t2) * r
  114. If y2 > y0 * 2 Then
  115. gety = 0
  116. Else
  117. gety=round(y2)
  118. End If
  119. End If
  120. End Function
复制代码

旋转后的效果:



图片只能是方形的,所有超出部分被省略了,缺失部分我用白色补上了。


对于我写的这个代码可以直接用,只需要修改3处,原始图片路径,旋转后的图片路径,旋转角度变量n,n的值是正数就是逆时针,n的值是负数就是顺时针,其他就不用动了。


代码中的路径不能写错,否则会报错。


好了本期就这些内容,觉得还行,点个赞,留个言。


扫码免费获取我的基础教程【视频教程】
扫码下方二维码关注我的公众号:3分钟学堂

QQ交流群:936858410
2#

看是看不懂了 还是点个赞吧

承接各类游戏脚本制作,post,手游,端游,办公,自动化

有偿解决任何按键基础问题(可远程讲解、教会为止)

如果我的回答能帮助了你,大家可以加个好友互相了解
QQ : 262832680
3#

没注释一脸懵逼

4#

代码报错:当前脚本第19行:发生运行时错误!错误代码:2,错误行号:19,错误信息: attempt to index global 'id504958454c44415441' (a null value)

5#

,

旋转之后超出的部分被遮挡了 要是能不被遮挡就好了

6#

我用电脑版做了一下,感觉更简单一些。
//Ðýתһ¶¨½Ç¶ÈÉú³ÉÐÂͼƬ£¬Í¼Æ¬´óСÓëԭͼƬÏàͬ

Call Plugin.TURING.Pixel_FromPicture("C:\Users\Administrator\Desktop\tupian\yuantu.bmp")
//Call Plugin.TURING.Pixel_Preview() //¿´Ò»ÏÂʲôÑù×Ó
imageInfo = Split(Plugin.TURING.GetImageData(), "|")//Êý×é·ÖÀë
imageWidth = imageInfo(0) // ×¢ÒâÊý×é´Ó0¿ªÊ¼,91
imageHigh = imageInfo(1)// ×¢ÒâÊý×é´Ó0¿ªÊ¼,91
cenCirX = (imageWidth - 1) / 2 //Êý×é´Ó0¿ªÊ¼
cenCirY = (imageHigh - 1) / 2 //Êý×é´Ó0¿ªÊ¼
imageColor = Split(imageInfo(2), ",")//ÑÕÉ«Êý×é·ÖÀë
newImageColor = imageColor //³õʼ»¯ÐýתºóÐγɵÄÐÂͼɫÊý×é,¹²4*91*91¸öÊý


//¿ªÊ¼Ðýת
pi = 3.1415926
For cirNum = 1 to 360
    rotaAngle = cirNum * pi / 180 //Ðýת½Ç¶È£¬»»³É»¡¶È
    For i = 0 To imageWidth - 1
        For j = 0 To imageHigh - 1
            //³õʼ»¯Ã¿¸öµã²»Ðýת
            r = sqr((i - cenCirX) * (i - cenCirX) + (j - cenCirY) * (j - cenCirY))
            sourceI = i
            sourceJ = j
            //ԲȦ·¶Î§ÄÚµÄÊý¾ÝÐèÒªÐýת
            If r <= cenCirX Then
                theta = atn((cenCirY - j) / (i - cenCirX + 0.0001))//µÃµ½½Ç¶È
                If (i - cenCirX) < 0 Then
                    theta = theta + pi
                End If
                theta = theta - rotaAngle//תÏàÓ¦½Ç¶È£¬×¢Òâ¼Ó¼õ
                sourceI = round(r * cos(theta) + cenCirX)//´ÓÄĸöIת¹ýÀ´µÄ
                sourcej = round(cenCirY - r * sin(theta))//´ÓÄĸöYת¹ýÀ´µÄ
            End If
            newImageColor(4 * i * imageHigh + 4 * j) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ)
            newImageColor(4 * i * imageHigh + 4 * j+1) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+1)
            newImageColor(4 * i * imageHigh + 4 * j+2) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+2)
            newImageColor(4 * i * imageHigh + 4 * j+3) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+3)
            
        Next
    Next
    
    //Éú³ÉÐýתºóµÄbmpͼƬ
    
    rotaImageData = imageWidth & "|" & imageHigh & "|" & Join(newImageColor, ",") //ÐýתºóµÄÊý¾Ý×Ö·û´®
    Call Plugin.TURING.LoadImageData(rotaImageData)
    Call Plugin.TURING.SaveImageData("C:\Users\Administrator\Desktop\tupian\" & cirNum & ".bmp")
    //Call Plugin.TURING.Pixel_Preview()
next



/*colorLength=0
For i = 0 To imageWidth
For j = 0 To imageHigh
//TracePrint imageColor(colorLength) //B·ÖÁ¿Öµ
//TracePrint imageColor(colorLength + 1) //G·ÖÁ¿Öµ
//TracePrint imageColor(colorLength + 2) //R·ÖÁ¿Öµ
colorLength = colorLength + 4
Next
Next
TracePrint colorLength*/

7#

我用电脑版做了一下,感觉更简单一些。

Call Plugin.TURING.Pixel_FromPicture("C:\Users\Administrator\Desktop\tupian\yuantu.bmp")
//Call Plugin.TURING.Pixel_Preview() //¿´Ò»ÏÂʲôÑù×Ó
imageInfo = Split(Plugin.TURING.GetImageData(), "|")//Êý×é·ÖÀë
imageWidth = imageInfo(0) // ×¢ÒâÊý×é´Ó0¿ªÊ¼,91
imageHigh = imageInfo(1)// ×¢ÒâÊý×é´Ó0¿ªÊ¼,91
cenCirX = (imageWidth - 1) / 2 //Êý×é´Ó0¿ªÊ¼
cenCirY = (imageHigh - 1) / 2 //Êý×é´Ó0¿ªÊ¼
imageColor = Split(imageInfo(2), ",")//ÑÕÉ«Êý×é·ÖÀë
newImageColor = imageColor //³õʼ»¯ÐýתºóÐγɵÄÐÂͼɫÊý×é,¹²4*91*91¸öÊý


//¿ªÊ¼Ðýת
pi = 3.1415926
For cirNum = 1 to 360
    rotaAngle = cirNum * pi / 180 //Ðýת½Ç¶È£¬»»³É»¡¶È
    For i = 0 To imageWidth - 1
        For j = 0 To imageHigh - 1
            //³õʼ»¯Ã¿¸öµã²»Ðýת
            r = sqr((i - cenCirX) * (i - cenCirX) + (j - cenCirY) * (j - cenCirY))
            sourceI = i
            sourceJ = j
            //ԲȦ·¶Î§ÄÚµÄÊý¾ÝÐèÒªÐýת
            If r <= cenCirX Then
                theta = atn((cenCirY - j) / (i - cenCirX + 0.0001))//µÃµ½½Ç¶È
                If (i - cenCirX) < 0 Then
                    theta = theta + pi
                End If
                theta = theta - rotaAngle//תÏàÓ¦½Ç¶È£¬×¢Òâ¼Ó¼õ
                sourceI = round(r * cos(theta) + cenCirX)//´ÓÄĸöIת¹ýÀ´µÄ
                sourcej = round(cenCirY - r * sin(theta))//´ÓÄĸöYת¹ýÀ´µÄ
            End If
            newImageColor(4 * i * imageHigh + 4 * j) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ)
            newImageColor(4 * i * imageHigh + 4 * j+1) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+1)
            newImageColor(4 * i * imageHigh + 4 * j+2) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+2)
            newImageColor(4 * i * imageHigh + 4 * j+3) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+3)
            
        Next
    Next
    
    //Éú³ÉÐýתºóµÄbmpͼƬ
    
    rotaImageData = imageWidth & "|" & imageHigh & "|" & Join(newImageColor, ",") //ÐýתºóµÄÊý¾Ý×Ö·û´®
    Call Plugin.TURING.LoadImageData(rotaImageData)
    Call Plugin.TURING.SaveImageData("C:\Users\Administrator\Desktop\tupian\" & cirNum & ".bmp")
    //Call Plugin.TURING.Pixel_Preview()
next



/*colorLength=0
For i = 0 To imageWidth
For j = 0 To imageHigh
//TracePrint imageColor(colorLength) //B·ÖÁ¿Öµ
//TracePrint imageColor(colorLength + 1) //G·ÖÁ¿Öµ
//TracePrint imageColor(colorLength + 2) //R·ÖÁ¿Öµ
colorLength = colorLength + 4
Next
Next
TracePrint colorLength*/

8#

我的写法

我也写了一段,感觉比你的简单一些,电脑版。
//旋转一定角度生成新图片,图片大小与原图片相同

Call Plugin.TURING.Pixel_FromPicture("C:\Users\Administrator\Desktop\tupian\yuantu.bmp")
//Call Plugin.TURING.Pixel_Preview() //看一下什么样子
imageInfo = Split(Plugin.TURING.GetImageData(), "|")//数组分离
imageWidth = imageInfo(0) // 注意数组从0开始
imageHigh = imageInfo(1)// 注意数组从0开始
cenCirX = (imageWidth - 1) / 2 //数组从0开始
cenCirY = (imageHigh - 1) / 2 //数组从0开始
imageColor = Split(imageInfo(2), ",")//颜色数组分离
newImageColor = imageColor //初始化旋转后形成的新图色数组


//开始旋转
pi = 3.1415926
For cirNum = 1 to 360
    rotaAngle = cirNum * pi / 180 //旋转角度,换成弧度
    For i = 0 To imageWidth - 1
        For j = 0 To imageHigh - 1
            //初始化每个点不旋转
            r = sqr((i - cenCirX) * (i - cenCirX) + (j - cenCirY) * (j - cenCirY))
            sourceI = i
            sourceJ = j
            //圆圈范围内的数据需要旋转
            If r <= cenCirX Then
                theta = atn((cenCirY - j) / (i - cenCirX + 0.0001))//得到角度
                If (i - cenCirX) < 0 Then
                    theta = theta + pi
                End If
                theta = theta - rotaAngle//转相应角度,注意加减
                sourceI = round(r * cos(theta) + cenCirX)//从哪个I转过来的
                sourcej = round(cenCirY - r * sin(theta))//从哪个Y转过来的
            End If
            newImageColor(4 * i * imageHigh + 4 * j) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ)
            newImageColor(4 * i * imageHigh + 4 * j+1) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+1)
            newImageColor(4 * i * imageHigh + 4 * j+2) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+2)
            newImageColor(4 * i * imageHigh + 4 * j+3) = imageColor(4 * sourceI * imageHigh + 4 * sourceJ+3)
            
        Next
    Next
    
    //生成旋转后的bmp图片
    
    rotaImageData = imageWidth & "|" & imageHigh & "|" & Join(newImageColor, ",") //旋转后的数据字符串
    Call Plugin.TURING.LoadImageData(rotaImageData)
    Call Plugin.TURING.SaveImageData("C:\Users\Administrator\Desktop\tupian\" & cirNum & ".bmp")
    //Call Plugin.TURING.Pixel_Preview()
next

发新话题 回复该主题