求助一个问题,100分,我也没多少分了。 本帖最后由 objectpc 于 2013-04-20 11:55:27 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先 isBm 判断一下这个有多大?package com.example.bitmapcompresstest;import java.io.ByteArrayOutputStream;import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.view.Menu;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getResources().getDrawable(R.drawable.koala123);// BitmapFactory.Options opts = Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.koala123); double maxSize =100.00;//限制的文件大小 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] b = baos.toByteArray(); //将字节换成KB double mid = b.length/1024; //判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩 if (mid > maxSize) { //获取bitmap大小 是允许最大大小的多少倍 double i = mid / maxSize; //开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍 (1.保持刻度和高度和原bitmap比率一致,压缩后也达到了最大大小占用空间的大小) bmp = zoomImage(bmp, bmp.getWidth() / Math.abs(i), bmp.getHeight() / Math.abs(i)); } ImageView imgView = (ImageView)findViewById(R.id.img); imgView.setImageBitmap(bmp);// Toast.makeText(this, "getRowBytes"+bmp.getRowBytes(), 0).show(); ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos2); byte[] b2 = baos2.toByteArray(); Toast.makeText(this, ""+b2.length/1024, 0).show();} public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) { // 获取这个图片的宽和高 float width = bgimage.getWidth(); float height = bgimage.getHeight(); // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 计算宽高缩放率 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, (int) height, matrix, true); return bitmap; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }} http://blog.csdn.net/tf576776047/article/details/8143456 我的代码经过验证了 可以达到压缩的目的 至于压缩到多大还需要你调整,这个链接 是来源! 任何压缩对图片的质量都是有损失的,这是JPG的算法决定的。只是这种损失在不严重的情况下肉眼不易察觉,但放大后仔细分辨可以发现质量上的损失。如果你又想保证质量又想保证大小 建议换成png格式试试看 不过这样 颜色上 可能会变得不那么鲜艳了 image.compress(Bitmap.CompressFormat.JPEG, 100, baos); 你这里把 100换成别的数字 就是你要的效果了 还有纠正一点 png 比 jpg 大 这个我记错了 我本地测试 是通过的 700+k的文件 压缩 保存 , 图片大小不变的前提下 只有 60+k 然后我将我处理的图片 通过 CSDN 上传到网盘 大小显示 还是60+k 我也不知道啥情况了,不好意思哥们,帮不了了。 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.koala123,opts); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 30, baos); byte[] b = baos.toByteArray(); try { OutputStream ops = new FileOutputStream("/mnt/emmc/bbbb.jpg"); ops.write(b); ops.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } 上传前压缩前1024x768压缩后1024x768上传后用搜狗浏览器预览图片右键点击图片选择图片属性大小 41060 字节维度 773 x 580 pixels选择图片下载到桌面 文件大小68.1K尺寸1024 X768 把你上传的相同照片 大小不一样的 下载下来 然后 去 http://exif.cn/ 这个网站 比较一下详细信息 看看是什么问题 这个 估计你要去网络那边问了 关于上传 我也不太清楚 332401890 谢谢!备注写CSDN 就可以了 公司 不能上QQ 回去加吧 加上了,我这个问题也算差不多了,我最后还是用了你的方法,差不多能控制在100K左右,而且质量相对其它的来说,也要强一些。谢谢了,不过又出现了一个问题,就是ViewPager的问题,比如我放进去10张图片,来回滑动,但是滑动到后面的时候,前面的图片就被销毁了,图片全都做了控制,以前也没遇到过这个问题 Android源码编译字符串编码问题 android虚拟机无法运行 怎么动态修改适配器 中的背景色 android解析Wap?有没有第三方包? Help!使用Robotium时请问如何查看Assert信息 使用TABWIDGET加tab标签报错 android自定义的View 如何加载 布局文件 类似手机助手的疑问 关于输入框的问题,请大神帮忙看下 NestedScrollView嵌套XRecyclerView缓慢滑动卡顿 帮忙分析一下原因 tabhost间隔线的问题
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getResources().getDrawable(R.drawable.koala123);
// BitmapFactory.Options opts =
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.koala123);
double maxSize =100.00;//限制的文件大小
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
//将字节换成KB
double mid = b.length/1024;
//判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
if (mid > maxSize) {
//获取bitmap大小 是允许最大大小的多少倍
double i = mid / maxSize;
//开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍 (1.保持刻度和高度和原bitmap比率一致,压缩后也达到了最大大小占用空间的大小)
bmp = zoomImage(bmp, bmp.getWidth() / Math.abs(i),
bmp.getHeight() / Math.abs(i));
}
ImageView imgView = (ImageView)findViewById(R.id.img);
imgView.setImageBitmap(bmp);
// Toast.makeText(this, "getRowBytes"+bmp.getRowBytes(), 0).show();
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos2);
byte[] b2 = baos2.toByteArray();
Toast.makeText(this, ""+b2.length/1024, 0).show();
} public static Bitmap zoomImage(Bitmap bgimage, double newWidth,
double newHeight) {
// 获取这个图片的宽和高
float width = bgimage.getWidth();
float height = bgimage.getHeight();
// 创建操作图片用的matrix对象
Matrix matrix = new Matrix();
// 计算宽高缩放率
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 缩放图片动作
matrix.postScale(scaleWidth, scaleHeight);
Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
(int) height, matrix, true);
return bitmap;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}}
如果你又想保证质量又想保证大小 建议换成png格式试试看 不过这样 颜色上 可能会变得不那么鲜艳了
image.compress(Bitmap.CompressFormat.JPEG, 100, baos); 你这里把 100换成别的数字 就是你要的效果了
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 30, baos);
byte[] b = baos.toByteArray();
try {
OutputStream ops = new FileOutputStream("/mnt/emmc/bbbb.jpg");
ops.write(b);
ops.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
压缩前1024x768
压缩后1024x768
上传后
用搜狗浏览器预览图片右键点击图片选择图片属性
大小 41060 字节
维度 773 x 580 pixels
选择图片下载到桌面
文件大小68.1K
尺寸1024 X768