小弟最近在做类似流媒体的东西,我是想在android上面截屏后压缩成PNG数据传送给PC,PC那边还好,问题就在android这边,我的要求是压缩后不能先保存在文件里再读出来,而是压缩后直接取得PNG格式的所有数据,哪位大神能指点一下啊。
------解决方案--------------------
第一步压缩图片:
/**
* 压缩图片
*
* @param bitmap
* 源图片
* @param width
* 想要的宽度
* @param height
* 想要的高度
* @param isAdjust
* 是否自动调整尺寸, true图片就不会拉伸,false严格按照你的尺寸压缩
* @return Bitmap
*/
public Bitmap reduce(Bitmap bitmap, int width, int height, boolean isAdjust) {
if (null == bitmap) {
return null;
}
if (bitmap.getWidth() < width && bitmap.getHeight() < height && isAdjust) {
return bitmap;
}
float sx = new BigDecimal(width).divide(new BigDecimal(bitmap.getWidth()), 4, BigDecimal.ROUND_DOWN)
.floatValue();
float sy = new BigDecimal(height).divide(new BigDecimal(bitmap.getHeight()), 4, BigDecimal.ROUND_DOWN)
.floatValue();
if (isAdjust) {
sx = (sx < sy ? sx : sy);
sy = sx;
}
Matrix matrix = new Matrix();
matrix.postScale(sx, sy);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
第二步,把Bitmap转成InputStream
public InputStream bitmap2IS(Bitmap bm){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
InputStream sbs = new ByteArrayInputStream(baos.toByteArray());
return sbs;
}
第三步,把InputStream 上传到服务器pc端
/**
* 上传文件到服务器
*
* @param url
* 上传路径
*
* @param input
* 文件流
* @return String
* @throws Exception
*/
public String upload(String url, InputStream input) throws Exception {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setChunkedStreamingMode(1024 * 1024);
conn.setRequestMethod(Constant.REQUEST_POST);
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Charsert", HTTP.UTF_8);
conn.setRequestProperty("Content-Type", "multipart/form-data;file=img.png");
OutputStream output = conn.getOutputStream();
int i = 0, total = 0;
byte[] buffer = new byte[1024];
while ((i = input.read(buffer)) != -1) {
output.write(buffer, 0, i);
}
String response = readFile(conn.getInputStream(), HTTP.UTF_8, 1, false);
input.close();
output.flush();
output.close();
conn.disconnect();
return response;
}