问题:我用系统底层的相机拍照,但是拍出来的照片压缩很严重,
找了很久也没解决的办法,求大神指点。
自定义相机中,我调用这句:
mCamera.takePicture(null,null, new PictureCallback() {// 查看源码是这样:
public final void takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg) {
takePicture(shutter, raw, null, jpeg);
}// 继续调用这个:
public final void takePicture(ShutterCallback shutter, PictureCallback raw,
PictureCallback postview, PictureCallback jpeg) {
mShutterCallback = shutter;
mRawImageCallback = raw;
mPostviewCallback = postview;
mJpegCallback = jpeg;
// If callback is not set, do not send me callbacks.
int msgType = 0;
if (mShutterCallback != null) {
msgType |= CAMERA_MSG_SHUTTER;
}
if (mRawImageCallback != null) {
msgType |= CAMERA_MSG_RAW_IMAGE;
}
if (mPostviewCallback != null) {
msgType |= CAMERA_MSG_POSTVIEW_FRAME;
}
if (mJpegCallback != null) {
msgType |= CAMERA_MSG_COMPRESSED_IMAGE;// 这句话对图片进行压缩吧,但是我的代码中mJpegCallback并不是null啊,找了很久都没人谈这个问题,
}
native_takePicture(msgType);
mFaceDetectionRunning = false;
}
public ByteArrayOutputStream compress(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 99;
while (baos.toByteArray().length / 1024 > maxSize) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
options -= 3;// 每次都减少10
// 压缩比小于0,不再压缩
if (options < 0) {
break;
}
Log.i(TAG, baos.toByteArray().length / 1024 + "");
baos.reset();// 重置baos即清空baos
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
}
return baos;
}
通过这种方式压缩,调整,可以适当保真
先谢过你,但是我在哪里调用这个方法呢?我的问题是系统自动给我压缩了图片,我不想让其压缩的。谢谢哈
在takePicture方法里调用