unity3D -- 压缩图片
2015-09-25 15:16
393 查看
由于微信分享图片要求图片大小不能超过200k,有些手机的高清屏幕截下来的图片肯定大于200k了,这个时候只能是压缩图片了,unity压缩图片的方法,直接上C#源代码:
public void WXShareImage (string imagePath, int sceneType)
{
byte[] fileData = File.ReadAllBytes (imagePath);
Texture2D tex = new Texture2D ((int)(Screen.width), (int)(Screen.height), TextureFormat.RGB24, true);
tex.LoadImage (fileData);
float miniSize = Mathf.Max (tex.width, tex.height);
float scale = 1200.0f / miniSize;
if (scale > 1.0f) {
scale = 1.0f;
}
Texture2D temp = ScaleTexture (tex, (int)(tex.width * scale), (int)(tex.height * scale));
byte[] pngData = temp.EncodeToJPG ();
string miniImagePath = imagePath.Replace (".png", "_min.jpg");
File.WriteAllBytes (miniImagePath, pngData);
Destroy (tex);
Destroy (temp);
}
该函数的接受两个参数,一个是传过来的图片路径,第二个参数是微信分享场景的id(微信文档有)。
private Texture2D ScaleTexture (Texture2D source, int targetWidth, int targetHeight)
{
Texture2D result = new Texture2D (targetWidth, targetHeight, source.format, true);
Color[] rpixels = result.GetPixels (0);
float incX = ((float)1 / source.width) * ((float)source.width / targetWidth);
float incY = ((float)1 / source.height) * ((float)source.height / targetHeight);
for (int px = 0; px < rpixels.Length; px++) {
rpixels [px] = source.GetPixelBilinear (incX * ((float)px % targetWidth), incY * ((float)Mathf.Floor (px / targetWidth)));
}
result.SetPixels (rpixels, 0);
result.Apply ();
return result;
}
该函数将图片压缩并返回压缩后的图片,压缩后的大小由调用者传过来。
源代码功能把最后图片转成了JPG格式,要是想转成PNG格式的话,unity有相应的方法,但是转成PNG,图片占用的内存会更大,就不能压缩成1200像素的了,要压缩的更小,这个需要注意一下。
该方法我已经测试过,没有问题,所以才上的源代码,图就不传了,反正压缩前后的图片截下来你也看不到变下了。
——Rocky
public void WXShareImage (string imagePath, int sceneType)
{
byte[] fileData = File.ReadAllBytes (imagePath);
Texture2D tex = new Texture2D ((int)(Screen.width), (int)(Screen.height), TextureFormat.RGB24, true);
tex.LoadImage (fileData);
float miniSize = Mathf.Max (tex.width, tex.height);
float scale = 1200.0f / miniSize;
if (scale > 1.0f) {
scale = 1.0f;
}
Texture2D temp = ScaleTexture (tex, (int)(tex.width * scale), (int)(tex.height * scale));
byte[] pngData = temp.EncodeToJPG ();
string miniImagePath = imagePath.Replace (".png", "_min.jpg");
File.WriteAllBytes (miniImagePath, pngData);
Destroy (tex);
Destroy (temp);
}
该函数的接受两个参数,一个是传过来的图片路径,第二个参数是微信分享场景的id(微信文档有)。
private Texture2D ScaleTexture (Texture2D source, int targetWidth, int targetHeight)
{
Texture2D result = new Texture2D (targetWidth, targetHeight, source.format, true);
Color[] rpixels = result.GetPixels (0);
float incX = ((float)1 / source.width) * ((float)source.width / targetWidth);
float incY = ((float)1 / source.height) * ((float)source.height / targetHeight);
for (int px = 0; px < rpixels.Length; px++) {
rpixels [px] = source.GetPixelBilinear (incX * ((float)px % targetWidth), incY * ((float)Mathf.Floor (px / targetWidth)));
}
result.SetPixels (rpixels, 0);
result.Apply ();
return result;
}
该函数将图片压缩并返回压缩后的图片,压缩后的大小由调用者传过来。
源代码功能把最后图片转成了JPG格式,要是想转成PNG格式的话,unity有相应的方法,但是转成PNG,图片占用的内存会更大,就不能压缩成1200像素的了,要压缩的更小,这个需要注意一下。
该方法我已经测试过,没有问题,所以才上的源代码,图就不传了,反正压缩前后的图片截下来你也看不到变下了。
——Rocky
相关文章推荐
- Unity3D之UGUI学习笔记(二):Rect Transform与Anchor
- Unity2d Sprite 不是真实尺寸的问题
- 全面解析Unity3D自动生成的脚本工程文件
- Unity3D发布为exe后无法连接数据库问题
- Unity3D Member Data和Inspector, Serialize的关系
- Unity5.2的广告类使用(Unity-ads)
- 在Unity3D中如何让摄像机进行平滑的透视(perspective)和正视(orthographic)角度变换(就像编辑器中点击Gizmos一样的效果)
- Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas
- Unity的一些笔试题
- unity3d后期效果的重影
- Unity中2D和UGUI图集的理解与使用
- Unity5 的新旧延迟渲染Deferred Lighting Rendering Path
- Unity3D中脚本的执行顺序和编译顺序
- Unity5 的新旧延迟渲染Deferred Lighting Rendering Path
- UnityGUI 基础
- Unity3D:NGUI 深入剖析NGUI的游戏UI架构
- Unity3D之ScriptableObject学习笔记
- Unity游戏编程定制编辑器(一)
- Unity3D之Legacy动画系统学习笔记
- Unity3D之Mecanim动画系统学习笔记(十一):高级功能应用