微信分享图片,对缩略图的大小是有要求的,笔者被这个坑的很惨。笔者开发的游戏分辨率为1280*720,安卓缩略图大小为128*72,IOS缩略图大小为256*144.
笔者直接贴代码了,详细的注释代码里面都有的。
JS部分
cc.Class({
properties: {
_isCapturing: false, // 正在截图中标志
},
// 微信分享屏幕截图
shareScreenshot: function () {
// 网页端不支持
if (cc.sys.isBrowser) {
cc.log('网页端不支持微信分享~');
return;
}
// 正在截图中判断
if (this._isCapturing) {
return;
}
this._isCapturing = true;
// 截图文件判断
var fileName = "shareScreenshot.jpg";
var fullPath = jsb.fileUtils.getWritablePath() + fileName;
if (jsb.fileUtils.isFileExist(fullPath)) {
jsb.fileUtils.removeFile(fullPath);
}
// 截图并保存图片文件
var size = cc.director.getWinSize(); // 获取视图大小
var texture = new cc.RenderTexture(size.width, size.height); // 新建渲染纹理
texture.setPosition(cc.p(size.width / 2, size.height / 2)); // 移动渲染纹理到视图中心
texture.begin(); // 开始渲染
cc.director.getRunningScene().visit(); // 访问当前场景
texture.end(); // 渲染结束
texture.saveToFile(fileName, cc.IMAGE_FORMAT_JPG); // 保存渲染纹理到图片文件
// 延时50毫秒,检测截图文件是否存在
// 重复10次这个过程,如果超过10次仍没检测到图片文件,截图失败(超时)
var self = this;
var tryTimes = 0;
var fn = function () {
if (jsb.fileUtils.isFileExist(fullPath)) {
// 调用相应平台微信分享图片方法
if (cc.sys.os === cc.sys.OS_ANDROID) {
jsb.reflection.callStaticMethod('org/cocos2dx/javascript/MyJsPlugin', 'shareIMG', '(Ljava/lang/String;)V', fullPath);
} else if (cc.sys.os === cc.sys.OS_IOS) {
jsb.reflection.callStaticMethod('AppController', 'shareIMG:', fullPath);
}
self._isCapturing = false;
} else {
tryTimes++;
if (tryTimes > 10) {
self._isCapturing = false;
cc.log('截图失败,超时~');
return;
}
setTimeout(fn, 50);
}
};
setTimeout(fn, 50);
},
});
安卓部分
/**
* 分享图片
*/
public static void shareIMG(String path) {
// 初始化WXImageObject对象
Bitmap bmp = BitmapFactory.decodeFile(path);
WXImageObject imgObj = new WXImageObject(bmp);
// 初始化WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
// 设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 128, 72, true);
bmp.recycle();
msg.thumbData = Util.bmpToByteArray(thumbBmp, true); // Util工具类在微信官方的范例代码中
// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img"); // transaction字段用于唯一标识一个请求
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;
// 调用api接口发送数据到微信
api.sendReq(req);
}
IOS部分
// 微信分享图片
+ (void) shareIMG:(NSString*)filePath {
// 初始化WXImageObject对象
WXImageObject *imageObject = [WXImageObject object];
imageObject.imageData = [NSData dataWithContentsOfFile:filePath];
// 初始化WXMediaMessage对象
WXMediaMessage *message = [WXMediaMessage message];
message.mediaObject = imageObject;
// 设置缩略图
UIImage *thumbImage = [AppController compressIMG:filePath width:256 height:144];
[message setThumbImage:thumbImage];
// 构造一个Req
SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
// 调用api接口发送数据到微信
[WXApi sendReq:req];
}
// 压缩图片到指定大小
+ (UIImage *)compressIMG:(NSString *)filePath width:(int)width height:(int)height {
// 获取图片
NSData *imageData = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:imageData];
// 压缩图片
CGSize newSize = CGSizeMake(width, height);
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,(NSInteger)newSize.width, (NSInteger)newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}