Android拍照得到全尺寸图片并进行压缩
程序员文章站
2023-12-20 09:39:58
废话不多说了,直接给大家贴代码了,具体代码如下所示:
废话不多说了,直接给大家贴代码了,具体代码如下所示:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <button android:id="@+id/take_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="take photo" /> <button android:id="@+id/get_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="get photo" /> <imageview android:id="@+id/picture" android:layout_width="300dp" android:layout_height="300dp" android:layout_gravity="center_horizontal" /> </linearlayout> package com.example.choosepictest; import java.io.file; import java.io.ioexception; import java.text.simpledateformat; import java.util.date; import android.app.activity; import android.content.intent; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.net.uri; import android.os.bundle; import android.os.environment; import android.provider.mediastore; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.imageview; public class mainactivity extends activity implements onclicklistener { static final int request_image_capture = 1; private button takephoto; private button getphoto; private imageview picture; private uri imguri; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); takephoto = (button) findviewbyid(r.id.take_photo); getphoto = (button) findviewbyid(r.id.get_photo); picture = (imageview) findviewbyid(r.id.picture); takephoto.setonclicklistener(this); getphoto.setonclicklistener(this); } @override public void onclick(view v) { switch (v.getid()) { case r.id.take_photo: dispatchtakepictureintent(); break; default: break; } } // 保存全尺寸照片 string mcurrentphotopath; private void dispatchtakepictureintent() { file appdir = new file(environment.getexternalstoragedirectory(), "/etoury/piccache"); if (!appdir.exists()) { appdir.mkdir(); } string timestamp = new simpledateformat("yyyymmdd_hhmmss") .format(new date()); string filename = timestamp + ".jpg"; file outputimage = new file(appdir, filename); try { if (outputimage.exists()) { outputimage.delete(); } outputimage.createnewfile(); } catch (ioexception e) { e.printstacktrace(); } mcurrentphotopath = outputimage.getabsolutepath(); imguri = uri.fromfile(outputimage); // 意图 相机 intent intent = new intent("android.media.action.image_capture"); intent.putextra(mediastore.extra_output, imguri); // 如果有相机 if (intent.resolveactivity(getpackagemanager()) != null) { startactivityforresult(intent, request_image_capture); } } //解码缩放图片(decode a scaled image) private void setpic() { // get the dimensions of the view int targetw = picture.getwidth(); int targeth = picture.getheight(); // get the dimensions of the bitmap bitmapfactory.options bmoptions = new bitmapfactory.options(); // 该 值设为true那么将不返回实际的bitmap,也不给其分配内存空间这样就避免内存溢出了。但是允许我们查询图片的信息这其中就包括图片大小信息 bmoptions.injustdecodebounds = true; bitmapfactory.decodefile(mcurrentphotopath, bmoptions); int photow = bmoptions.outwidth; int photoh = bmoptions.outheight; // determine how much to scale down the image // math.min求最小值 int scalefactor = math.min(photow/targetw, photoh/targeth); // decode the image file into a bitmap sized to fill the view bmoptions.injustdecodebounds = false; // 设置恰当的insamplesize可以使bitmapfactory分配更少的空间以消除该错误 bmoptions.insamplesize = scalefactor; // 如果inpurgeable设为true的话表示使用bitmapfactory创建的bitmap,用于存储pixel的内存空间在系统内存不足时可以被回收 bmoptions.inpurgeable = true; bitmap bitmap = bitmapfactory.decodefile(mcurrentphotopath, bmoptions); picture.setimagebitmap(bitmap); } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { if (resultcode == result_ok) { switch (requestcode) { case request_image_capture: setpic(); break; default: break; } } } }
以上代码就是本文给大家介绍的android拍照得到全尺寸图片并进行压缩 的全部内容,希望大家喜欢。