Unity 使用C#翻转图片并缩放
来源:互联网 发布:樱井翔堀北真希 知乎 编辑:程序博客网 时间:2024/06/04 19:49
翻墙看来的代码,其实自己写也不会很麻烦,就是花点时间而已(我只是代码的搬运工。。。)
水平翻转图片
<span style="font-size:14px;"> Texture2D FlipTexture(Texture2D orig) { Texture2D flip = new Texture2D(orig.width,orig.height); int xN = orig.width; int yN = orig.height; for(int i=0; i < xN; i++) { for(int j=0; j < yN; j++) { flip.SetPixel(xN-i-1, j, orig.GetPixel(i,j)); } } flip.Apply(); return flip; }</span>
垂直翻转图片
<span style="font-size:14px;">Texture2D FlipTexture(Texture2D orig) { Texture2D flip = new Texture2D(orig.width,orig.height); int xN = orig.width; int yN = orig.height; for(int i=0; i < xN; i++) { for(int j=0; j < yN; j++) { flip.SetPixel(i, yN - j - 1, orig.GetPixel(i,j)); } } flip.Apply(); return flip; }</span>缩放TextureScale.cs
using UnityEngine;using UnityEngine.UI;using System.Collections;using System.Threading;public class TextureScale : MonoBehaviour { public class ThreadData { public int start; public int end; public ThreadData(int s, int e) { start = s; end = e; } } private static Color[] texColors; private static Color[] newColors; private static int w; private static float ratioX; private static float ratioY; private static int w2; private static int finishCount; private static Mutex mutex; public static Texture2D Point(Texture2D tex, int newWidth, int newHeight,bool flipH,bool flipV) { return ThreadedScale(tex, newWidth, newHeight, false,flipH,flipV); } public static Texture2D Bilinear(Texture2D tex, int newWidth, int newHeight,bool flipH,bool flipV) { return ThreadedScale(tex, newWidth, newHeight, true,flipH, flipV); } private static Texture2D ThreadedScale(Texture2D tex, int newWidth, int newHeight, bool useBilinear,bool flipH,bool flipV) { texColors = tex.GetPixels(); newColors = new Color[newWidth * newHeight]; if (useBilinear) { ratioX = 1.0f / ((float)newWidth / (tex.width - 1)); ratioY = 1.0f / ((float)newHeight / (tex.height - 1)); } else { ratioX = ((float)tex.width) / newWidth; ratioY = ((float)tex.height) / newHeight; } w = tex.width; w2 = newWidth; var cores = Mathf.Min(SystemInfo.processorCount, newHeight); var slice = newHeight / cores; finishCount = 0; if (mutex == null) { mutex = new Mutex(false); } if (cores > 1) { int i = 0; ThreadData threadData; for (i = 0; i < cores - 1; i++) { threadData = new ThreadData(slice * i, slice * (i + 1)); ParameterizedThreadStart ts = useBilinear ? new ParameterizedThreadStart(BilinearScale) : new ParameterizedThreadStart(PointScale); Thread thread = new Thread(ts); thread.Start(threadData); } threadData = new ThreadData(slice * i, newHeight); if (useBilinear) { BilinearScale(threadData); } else { PointScale(threadData); } while (finishCount < cores) { Thread.Sleep(1); } } else { ThreadData threadData = new ThreadData(0, newHeight); if (useBilinear) { BilinearScale(threadData); } else { PointScale(threadData); } } tex.Resize(newWidth, newHeight); tex.SetPixels(newColors); tex.Apply(); Texture2D orig = new Texture2D(tex.width, tex.height); if (flipV) { int xN = tex.width; int yN = tex.width; for (int i = 0; i < xN; i++) { for (int j = 0; j < yN; j++) { // tex.SetPixel(xN - i - 1, j, orig.GetPixel(i, j)); orig.SetPixel(i, yN - j - 1, tex.GetPixel(i, j)); } } orig.Apply(); }else if (flipH) { int xN = tex.width; int yN = tex.width; for (int i = 0; i < xN; i++) { for (int j = 0; j < yN; j++) { // tex.SetPixel(xN - i - 1, j, orig.GetPixel(i, j)); orig.SetPixel(xN - i - 1, j, tex.GetPixel(i, j)); } } orig.Apply(); } else { orig = tex; } return orig; } public static void BilinearScale(System.Object obj) { ThreadData threadData = (ThreadData)obj; for (var y = threadData.start; y < threadData.end; y++) { int yFloor = (int)Mathf.Floor(y * ratioY); var y1 = yFloor * w; var y2 = (yFloor + 1) * w; var yw = y * w2; for (var x = 0; x < w2; x++) { int xFloor = (int)Mathf.Floor(x * ratioX); var xLerp = x * ratioX - xFloor; newColors[yw + x] = ColorLerpUnclamped(ColorLerpUnclamped(texColors[y1 + xFloor], texColors[y1 + xFloor + 1], xLerp), ColorLerpUnclamped(texColors[y2 + xFloor], texColors[y2 + xFloor + 1], xLerp), y * ratioY - yFloor); } } mutex.WaitOne(); finishCount++; mutex.ReleaseMutex(); } public static void PointScale(System.Object obj) { ThreadData threadData = (ThreadData)obj; for (var y = threadData.start; y < threadData.end; y++) { var thisY = (int)(ratioY * y) * w; var yw = y * w2; for (var x = 0; x < w2; x++) { newColors[yw + x] = texColors[(int)(thisY + ratioX * x)]; } } mutex.WaitOne(); finishCount++; mutex.ReleaseMutex(); } private static Color ColorLerpUnclamped(Color c1, Color c2, float value) { return new Color(c1.r + (c2.r - c1.r) * value, c1.g + (c2.g - c1.g) * value, c1.b + (c2.b - c1.b) * value, c1.a + (c2.a - c1.a) * value); } }原来只有缩放,我把翻转也给加进去了,静态方法,很容易调用
恩,大概就是这些了
0 0
- Unity 使用C#翻转图片并缩放
- Unity 图片翻转
- java图片旋转,缩放,翻转
- 图片旋转缩放翻转效果
- unity图片水平/垂直翻转
- C#实现图片翻转
- 缩放图片并保存
- java 实现图片的缩放、翻转
- Android实现图片的缩放翻转功能
- Android实现图片的缩放翻转功能
- WPF图片控件的旋转、缩放、翻转
- WPF图片控件的旋转、缩放、翻转
- C# 缩放图片方法
- C#图片缩放
- c# 图片按比例缩放
- c# 图片按比例缩放
- C#图片按比例缩放
- UIKit 图片的移动、位移、旋转、缩放、翻转、翻页等特效的使用
- netbeans 快捷键
- svn clean up 时 .svn\pristine\cc\cca2e58e9e310a113a37e3bd87eae3a42434e899.svn-base 找不到文件解决方法
- bzoj 4521: [Cqoi2016]手机号码
- 单例模式 (懒汉式, 线程同步详解)
- UITableView的使用
- Unity 使用C#翻转图片并缩放
- Jsp标签
- ulimit 命令详解
- 为Jpanel设置背景图片
- pureMVC框架 子类实现父类的接口的目的
- 桥接模式
- Preference Learning——Object Ranking:Learning to Order Things
- Maven下载中央仓库到本地
- Android Studio 中文社区