今天在项目中发现有些手机调起微信分享链接功能可以成功,但是有些sendReq返回是false 无法分享。
同一品牌不同型号、不同固件版本对图片压缩的方式都不一样,查看了所有手机压缩后的分享缩略图,每款手机压缩后的大小都不一样。
大家可以视情况,加大对图片尺寸、质量的压缩,
我压缩的尺寸是20px*20px
public static ByteArrayOutputStream compressSize(Bitmap bitmaps, int pixelW, int pixelH) {
//暂时防止图片超出1M 会溢出 先不用
ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmaps.compress(Bitmap.CompressFormat.PNG, 100, os);
if (os.toByteArray().length / 1024 > 1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
os.reset();//重置baos即清空baos
bitmaps.compress(Bitmap.CompressFormat.PNG, 50, os);//这里压缩50%,把压缩后的数据存放到baos中
}
ByteArrayInputStream bis = new ByteArrayInputStream(os.toByteArray());
BitmapFactory.Options options = new BitmapFactory.Options();
//此次压缩只获取边框
options.inJustDecodeBounds = true;
//设置成 jpg格式的颜色分配
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeStream(bis, null, options);
Log.i("fsef", "bis = " + bis + " bitmap = " + bitmap);
//设置好压缩的尺寸开始压缩
options.inJustDecodeBounds = false;
int w = options.outWidth;
int h = options.outHeight;
float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了
float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;//be=1表示不缩放
//如果当前图片尺寸大于要指定的尺寸 那就压缩
if(hh <= h && ww <= w){
if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
be = (int) (options.outWidth / ww);
} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
be = (int) (options.outHeight / hh);
}
if (be <= 1) be = 2;
}
options.inSampleSize = be;//设置缩放比例
//每进行一次构建 bis 流都要重新 获取
bis = new ByteArrayInputStream(os.toByteArray());
bitmap = BitmapFactory.decodeStream(bis, null, options);
//压缩完了尺寸进行质量的压缩
return compressQuality(bitmap);
}
/**
* 压缩图片质量 返回压缩后的流对象
*/
public static ByteArrayOutputStream compressQuality(Bitmap bmp) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int options = 90;//个人喜欢从80开始,
bmp.compress(Bitmap.CompressFormat.PNG, options, baos);
while (baos.toByteArray().length / 1024 > 200) {
if(options == 50){
break;
}
baos.reset();
options -= 10;
bmp.compress(Bitmap.CompressFormat.PNG, options, baos);
}
/*ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray());
return BitmapFactory.decodeStream(bis);*/
return baos;
}
之后看看所有手机压缩后的分享图标都小于32kb就可以分享成功了,部分手机看着是小于32kb,但分享出去重新载入内存后就不止32kb。