自己写了一个拍照的页面,但是保存的图片太模糊了。求大神帮忙看看

 
public class PhotographActivity extends Activity implements
SeekBar.OnSeekBarChangeListener, OnClickListener, Runnable {
private ImageView takePic, back, flash;// 按钮
private final int FLASH_AUTO = 0;// 自动闪光
private final int FLASH_OFF = 1;// 闪光灯关闭
private final int FLASH_ON = 2; // 闪光灯打开
private int flashImg[] = { R.drawable.light_auto_confirm,
R.drawable.light_off_confirm, R.drawable.light_on_confirm };// 闪光灯图标
private boolean preview = false, flashOpen = false;// preview预览 flashOpen闪光灯
private Camera camera;// 硬件相机
private SurfaceView cameraBG;// 相机预览
@SuppressWarnings("unused")
private Uri videoFilePath;
// PopupWindow和AlertDialog都是Android对话框的内容,不同的是PopupWindow是阻塞式对话框
PopupWindow popupWindow;
private Camera.Parameters parameters;// 照相机参数集
private BitmapFactory.Options options = new BitmapFactory.Options();
private int ScreenW, ScreenH;// 屏幕宽高

@Override
public void onCreate(Bundle savedInstanceState) {

// 获得屏幕宽高
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
ScreenW = metrics.widthPixels;
ScreenH = metrics.heightPixels;
Log.d("屏幕宽高", ScreenW + "," + ScreenH);
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {// SD卡允许读写
Toast.makeText(PhotographActivity.this, "SD卡没有插入或不能读写",
Toast.LENGTH_LONG).show();
}
Window window = getWindow();
// 只要这个窗口是用户可见的,保持设备的屏幕打开及明亮。
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// 选择支持半透明模式,在有surfaceview的activity中使用。
window.setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 去掉信息栏
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_photograph);
init();
}

@SuppressLint("NewApi")
private void init() {
options.inSampleSize = 2;// 图片宽高都为原来的2分之一,即图片为原来的4分之一
takePic = (ImageView) findViewById(R.id.btn_picture);// 拍照
back = (ImageView) findViewById(R.id.btn_backcapter);// 返回
flash = (ImageView) findViewById(R.id.btn_flash);// 调整闪光效果
cameraBG = (SurfaceView) findViewById(R.id.camrea);// 相机预览
// 固定surfaceView的高宽
cameraBG.getHolder().setFixedSize(ScreenW, ScreenH);
// 设置该surfaceView不用自己维护缓冲区
cameraBG.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置surfaceView的回调函数
cameraBG.getHolder().addCallback(new SurfaceCallback());
takePic.setOnClickListener(this);
back.setOnClickListener(this);
flash.setOnClickListener(this);
cameraBG.setOnClickListener(this);
}

private final class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (camera != null) {
camera.release();// 相机释放
}
camera = Camera.open();// 打开相机
camera.setDisplayOrientation(90);// 旋转镜头

parameters = camera.getParameters();// 获取相机参数集
if (parameters.getFlashMode() == null) {
flash.setImageResource(flashImg[FLASH_OFF]);
Toast.makeText(PhotographActivity.this, "无闪光灯",
Toast.LENGTH_SHORT).show();
} else {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
List<Size> SupportedPreviewSizes = parameters
.getSupportedPreviewSizes();// 获取支持预览照片的尺寸
Size previewSize = SupportedPreviewSizes.get(0);// 从List取出Size
parameters
.setPreviewSize(previewSize.width, previewSize.height);// 设置预览照片的大小
List<Size> supportedPictureSizes = parameters
.getSupportedPictureSizes();// 获取支持保存图片的尺寸
Size pictureSize = supportedPictureSizes.get(0);// 从List取出Size
parameters
.setPictureSize(pictureSize.width, pictureSize.height);// 设置照片的大小
camera.setParameters(parameters);
}
try {
camera.setPreviewDisplay(cameraBG.getHolder());// 设置相机预览
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();// 开始预览
preview = true;

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
if (preview) {
camera.stopPreview();
}
camera.release();
}
}

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (camera != null && event.getRepeatCount() == 0) {
switch (keyCode) {
case KeyEvent.KEYCODE_CAMERA:
case KeyEvent.KEYCODE_DPAD_CENTER:
takPicture();
break;
case KeyEvent.KEYCODE_BACK:
if (flashOpen) {
popupWindow.dismiss();
} else {
finish();
}
}
}
return true;
}

private final class TakePictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
// 检测sd是否可用
Toast.makeText(PhotographActivity.this, "没有SD卡或SD卡不可用!",
Toast.LENGTH_LONG).show();
return;
} else {
Log.d("解码", "data.length=" + data.length);
// 解码指定字节数组中的一个不变的位图
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length, options);
Log.d("解码", "1*******");
// 旋转图片 动作
Matrix matrix = new Matrix();
matrix.postRotate(90);
Log.d("保存照片", "0");
// 创建新的图片
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
Uri resource_uri = Uri.parse(MediaStore.Images.Media
.insertImage(getContentResolver(), bitmap, null, null));
Log.d("保存照片", "1");
BufferedOutputStream bos = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(
getContentResolver(), resource_uri);
String name = getCurrentTime() + ".jpg";
File file = new File(
Environment.getExternalStorageDirectory()
+ "/DCIM/Camera/");
file.mkdirs();// 尝试创建系统默相册文件夹
String image_Path = Environment
.getExternalStorageDirectory()
+ "/DCIM/Camera/"
+ name;
bos = new BufferedOutputStream(new FileOutputStream(
image_Path));
Log.d("bos", bos.toString());
// 压缩位图到指定的输出流
// 第一个参数:压缩的格式
// 第二个参数:压缩的质量,100即为无损压缩
// 第三个参数:压缩到制定的流
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);// 把数据写入文件
bitmap.recycle();
scanPhoto(image_Path);// 扫描文件夹
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap bitmap2 = MediaStore.Images.Media.getBitmap(
getContentResolver(), resource_uri);
Log.d("bitmap2", bitmap2.toString());
if (bitmap2.compress(CompressFormat.JPEG, 100, baos)) {
byte[] code = baos.toByteArray();
Log.d("拍照0", code.toString());
byte[] output = Base64.encode(code, Base64.NO_WRAP);
Log.d("拍照1", output.toString());
String Str = new String(output);
Log.d("长度", Str.length() + "");
JSONObject jsonObject = new JSONObject();
jsonObject.put("imgFileStr", Str);
jsonObject.put("imgPath", image_Path);
bitmap2.recycle();
Xxxplugin.callbackData.success(jsonObject);

}

} catch (Exception e) {
Log.d("异常", e.toString());
} finally {
try {
bos.close();
PhotographActivity.this.finish();
} catch (IOException e) {
e.getMessage();
}
}
}
}
}

public void takPicture() {
camera.autoFocus(null);// 自动对焦
// takePicture有一个重载,分别是三个参数,四个参数
// 三个参数的
// 第一个参数是按下快门触发
// 第二参数是得到原始图像时候触发
// 第三个是JPG图片(系统处理后触发);

// 四个参数的
// 第一个参数是按下快门触发
// 第二参数是得到原始图像时候触发
// 第三个是缩放和压缩图像时触发
// 第四个是JPG图片(系统处理后触发);
// camera.takePicture(shutter, raw, jpeg)
// camera.takePicture(shutter, raw, postview, jpeg)
camera.takePicture(null, null, null, new TakePictureCallback());
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
camera.setParameters(parameters);
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_picture:
takePic.setEnabled(false);
takPicture();
break;
case R.id.btn_backcapter:
if (flashOpen) {
popupWindow.dismiss();
} else {
finish();
}
break;
case R.id.btn_flash:
if (parameters.getFlashMode() == null) {
Toast.makeText(PhotographActivity.this, "无闪光灯",
Toast.LENGTH_SHORT).show();
} else if (parameters.getFlashMode() == Camera.Parameters.FLASH_MODE_AUTO) {
flash.setImageResource(flashImg[FLASH_OFF]);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
} else if (parameters.getFlashMode() == Camera.Parameters.FLASH_MODE_OFF) {
flash.setImageResource(flashImg[FLASH_ON]);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
camera.setParameters(parameters);
} else if (parameters.getFlashMode() == Camera.Parameters.FLASH_MODE_ON) {
flash.setImageResource(flashImg[FLASH_AUTO]);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
camera.setParameters(parameters);
}
break;
case R.id.camrea:
camera.autoFocus(null);
break;
}
}

@Override
public void run() {
while (true) {
if (camera != null) {
camera.autoFocus(null);
}
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

/**
 * 得到当前系统的时间
 **/
private String getCurrentTime() {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmss");
String str = format.format(new Date());
return str;

}

/**
 * 对文件夹进行扫描,使图库可以及时显示自己保存的图片(无需手机重启)
 */
private void scanPhoto(String path) {
MediaScannerConnection.scanFile(PhotographActivity.this,
new String[] { path }, null, null);



}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值