您的位置:首页 > 移动开发 > Unity3D

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: