当前位置:   article > 正文

Unity之合并多张图片为一张大图_unity如何将切割的jpg合并

unity如何将切割的jpg合并

一、前言

最近项目内接到一个需求,使用工具将序列帧转化为Texture。研究了一波,发现unity本身可以实现,于是有了这个东西。

先说一下思路:直接从文件夹读取到需要操作的图片,然后将图片依次写入一张新建的Texture。

废话不多说,直接上代码

以下为从文件夹读取到jpg的图片,然后通过FileStream转换成Texture2D。(以下为测试使用,部分参数未规范化,请轻喷...)

  1. [MenuItem("Tools/合并多张图片", false, 4)]
  2. public static void Test()
  3. {
  4. string path = Application.dataPath + "/sucai";
  5. Debug.Log(path);
  6. DirectoryInfo folder = new DirectoryInfo(path);
  7. var files = folder.GetFiles("*.jpg");
  8. Debug.Log("files count :" + files.Length);
  9. Texture2D[] texture2Ds = new Texture2D[files.Length];
  10. int count = files.Length;
  11. for (int i = 0; i < files.Length; i++)
  12. {
  13. Debug.Log(files[i].Name);
  14. //EditorUtility.DisplayProgressBar("合并图片--->" + files[i].Name, "0%", i / count);
  15. FileStream fs = new FileStream(path + "/" + files[i].Name, FileMode.Open, FileAccess.Read);
  16. int byteLength = (int)fs.Length;
  17. byte[] imgBytes = new byte[byteLength];
  18. fs.Read(imgBytes, 0, byteLength);
  19. fs.Close();
  20. fs.Dispose();
  21. //因为懒得去写比例,所以直接将原图尺寸写入了
  22. Texture2D t2d = new Texture2D(1280, 720);
  23. ///这一步会将图片转换成实际大小
  24. t2d.LoadImage(imgBytes);
  25. t2d.Apply();
  26. texture2Ds[i] = t2d;
  27. //Color col = t2d.GetPixel(t2d.width / 2, t2d.height / 2);
  28. //Debug.Log(col);
  29. }
  30. Texture2D tex = MergeMoreTex(texture2Ds);
  31. byte[] bytes = tex.EncodeToPNG();
  32. //File.WriteAllBytes(Application.dataPath + "/out.png", bytes);
  33. EditorUtility.ClearProgressBar();
  34. EditorApplication.ExecuteMenuItem("Assets/Refresh");
  35. }

以下部分为将多个Texture2D对象写入一张大图,大图的尺寸我用的4096*4096。因为给我的图片尺寸本身不标准,所以写完后拿到的图最后会有空缺的部分。

  1. public static Texture2D MergeMoreTex(Texture2D[] texs)
  2. {
  3. if (texs.Length < 1) return null;
  4. Texture2D nTex = new Texture2D(4096, 4096, TextureFormat.ARGB32, true);
  5. Color[] colors = new Color[nTex.width * nTex.height];
  6. int startw, starth;
  7. startw = 0;//横向写入偏移
  8. starth = 0;//纵向写入偏移
  9. //以下计算横向跟纵向个数可能会出现大部分空余,这里的计算能满足我自己的需求,没有测试过复杂情况。有需要可以修改
  10. //根据数量计算横向个数
  11. int wcnt = Mathf.CeilToInt(Mathf.Sqrt(texs.Length / 1.8f));
  12. //纵向个数
  13. int hcnt = Mathf.FloorToInt(wcnt * (1280f / 720f));
  14. //单张高度
  15. int oneh = Mathf.FloorToInt(4096 / hcnt);
  16. //单张宽度
  17. int onew = Mathf.FloorToInt(4096 / wcnt);
  18. for (int i = 0; i < texs.Length; i++)
  19. {
  20. for (int h = 0; h < oneh; h++)
  21. {
  22. for (int w = 0; w < onew; w++)
  23. {
  24. Color color = texs[i].GetPixelBilinear((float)w / onew, (float)h / oneh);
  25. int index = h * nTex.width + w + startw + (starth * 4096);
  26. if(index >= colors.Length)
  27. {
  28. Debug.LogError("数组越界");
  29. continue;
  30. }
  31. if (colors[index] == null)
  32. {
  33. colors[index] = color;
  34. continue;
  35. }
  36. colors[index] = color;
  37. }
  38. }
  39. startw += onew;
  40. if(startw + onew > 4096)
  41. {
  42. starth += oneh;
  43. startw = 0;
  44. }
  45. }
  46. nTex.SetPixels(colors);
  47. nTex.Apply();
  48. return nTex;
  49. }

以上就是所有的东西了,然后附上效果图(截图)

因之前没有操作过这一块的东西,欢迎指出不足之处~。

噢,对了。这个没法支持不透明的图~

参考链接:https://blog.csdn.net/qq_18192161/article/details/104941792?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

 

更新:具体计算单张图占比以及大小有问题,只需要看思路好了...

请看后续:Unity之合并多张图片为一张大图(二)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/98018
推荐阅读
相关标签
  

闽ICP备14008679号