利用系统api 裁剪照片

很重要的是加入权限,很多人因为没加入拍照权限而导致运行不能成功。

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.CAMERA" />  
  2.   
  3.    <uses-feature android:name="android.hardware.camera" />  
  4.    <uses-feature android:name="android.hardware.camera.autofocus" />  

大概的流程:

        1.调用Intent,调用系统的相机。

         2.在回调方法中获取返回的bitmap数据。

         3.将bitmap数据写入图片文件中。

然后你就可以查看该图片了。


[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class TestCamera extends Activity implements OnClickListener {  
  2.     private Button button;  
  3.     private ImageView imageView;  
  4.   
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.   
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.acy_testcamera);  
  10.         button = (Button) findViewById(R.id.buttonPicture);  
  11.         button.setOnClickListener(this);  
  12.         imageView = (ImageView) findViewById(R.id.imageView1);  
  13.   
  14.     }  
  15.   
  16.     @Override  
  17.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  18.         // TODO Auto-generated method stub  
  19.         super.onActivityResult(requestCode, resultCode, data);  
  20.         if (resultCode == Activity.RESULT_OK) {  
  21.             // 获取sdcard状态  
  22.             String sdStatus = Environment.getExternalStorageState();  
  23.             // 检测sd是否可用  
  24.             if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {  
  25.                 return;  
  26.             }  
  27.             Bundle bundle = data.getExtras();  
  28.             // 获取相机返回的数据,并转换为Bitmap图片格式  
  29.             Bitmap bitmap = (Bitmap) bundle.get("data");  
  30.   
  31.             FileOutputStream b = null;  
  32.             File file = null;  
  33.             try {  
  34.                 // 创建指定位置的临时文件  
  35.                 file = File.createTempFile("testimg", ".jpg", new File(  
  36.                         Environment.getExternalStorageDirectory() + "/DCIM/"));  
  37.   
  38.                 b = new FileOutputStream(file.getAbsolutePath());  
  39.                 // 将文件流数据写入图片文件中  
  40.                 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);  
  41.             } catch (Exception e) {  
  42.                 e.printStackTrace();  
  43.             } finally {  
  44.                 try {  
  45.                     // 关闭流  
  46.                     b.flush();  
  47.                     b.close();  
  48.                 } catch (IOException e) {  
  49.                     e.printStackTrace();  
  50.                 }  
  51.             }  
  52.             imageView.setImageBitmap(bitmap);// 显示bitmap  
  53.         }  
  54.     }  
  55.   
  56.     @Override  
  57.     public void onClick(View v) {  
  58.         // TODO Auto-generated method stub  
  59.         if (v == button) {  
  60.             // 调用系统相机  
  61.             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  62.             startActivityForResult(intent, 1);  
  63.         }  
  64.     }  
  65. }  


裁剪图片:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class CramaActivity extends Activity {  
  2.     private ImageView img = null;  
  3.     private TextView text = null;  
  4.     private File tempFile = new File(Environment.getExternalStorageDirectory(),  
  5.             getPhotoFileName());  
  6.     private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照  
  7.     private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择  
  8.     private static final int PHOTO_REQUEST_CUT = 3;// 结果  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_main);  
  14.         init();  
  15.     }  
  16.   
  17.     private void init() {  
  18.         // TODO Auto-generated method stub  
  19.         img = (ImageView) findViewById(R.id.img_creama);  
  20.         text = (TextView) findViewById(R.id.text);  
  21.           
  22.         ((Button) findViewById(R.id.btn_creama))  
  23.                 .setOnClickListener(new OnClickListener() {  
  24.   
  25.                     public void onClick(View v) {  
  26.                         // TODO Auto-generated method stub  
  27.                         Intent cameraintent = new Intent(  
  28.                                 MediaStore.ACTION_IMAGE_CAPTURE);  
  29.                         // 指定调用相机拍照后照片的储存路径  
  30.                         cameraintent.putExtra(MediaStore.EXTRA_OUTPUT,  
  31.                                 Uri.fromFile(tempFile));  
  32.                         startActivityForResult(cameraintent,  
  33.                                 PHOTO_REQUEST_TAKEPHOTO);  
  34.                     }  
  35.                 });  
  36.   
  37.     }  
  38.   
  39.     /**  
  40.      * 回调  
  41.      */  
  42.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  43.         super.onActivityResult(requestCode, resultCode, data);  
  44.         switch (requestCode) {  
  45.         case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用  
  46.             startPhotoZoom(Uri.fromFile(tempFile));  
  47.             break;  
  48.         case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时  
  49.             // 做非空判断,当我们觉得不满意想重新剪裁的时候便不会报异常,下同  
  50.             if (data != null)  
  51.                 startPhotoZoom(data.getData());  
  52.             break;  
  53.         case PHOTO_REQUEST_CUT:// 返回的结果  
  54.             if (data != null)  
  55.                 sentPicToNext(data);  
  56.             break;  
  57.         }  
  58.     }  
  59.   
  60.     private void startPhotoZoom(Uri uri) {  
  61.         Intent intent = new Intent("com.android.camera.action.CROP");  
  62.         intent.setDataAndType(uri, "image/*");  
  63.         // crop为true是设置在开启的intent中设置显示的view可以剪裁  
  64.         intent.putExtra("crop", "true");  
  65.   
  66.         // aspectX aspectY 是宽高的比例  
  67.         intent.putExtra("aspectX", 1);  
  68.         intent.putExtra("aspectY", 1);  
  69.   
  70.         // outputX,outputY 是剪裁图片的宽高  
  71.         intent.putExtra("outputX", 300);  
  72.         intent.putExtra("outputY", 300);  
  73.         intent.putExtra("return-data", true);  
  74.         intent.putExtra("noFaceDetection", true);  
  75.         startActivityForResult(intent, PHOTO_REQUEST_CUT);  
  76.     }  
  77.   
  78.     // 将进行剪裁后的图片传递到下一个界面上  
  79.     private void sentPicToNext(Intent picdata) {  
  80.         Bundle bundle = picdata.getExtras();  
  81.         if (bundle != null) {  
  82.             Bitmap photo = bundle.getParcelable("data");  
  83.             if (photo == null) {  
  84.                 img.setImageResource(R.drawable.ic_launcher);  
  85.             } else {  
  86.                 photo = toRoundCorner((Bitmap) bundle.getParcelable("data"), 50);  
  87.                 Drawable drawable = new BitmapDrawable(this.getResources(),  
  88.                         photo);  
  89.                 img.setImageDrawable(drawable);  
  90.                 // 设置文本内容为 图片绝对路径和名字  
  91.                 text.setText(tempFile.getAbsolutePath());  
  92.             }  
  93.         }  
  94.     }  
  95.   
  96.     /**  
  97.      * 圆角图片处理  
  98.      *   
  99.      * @param bitmap  
  100.      * @param radius半径50  
  101.      * @return  
  102.      */  
  103.     public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {  
  104.         Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),  
  105.                 bitmap.getHeight(), Config.ARGB_8888);  
  106.         Canvas canvas = new Canvas(output);  
  107.         final int color = 0xff424242;  
  108.         final Paint paint = new Paint();  
  109.         final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
  110.         final RectF rectF = new RectF(rect);  
  111.         final float roundPx = pixels;  
  112.         paint.setAntiAlias(true);  
  113.         canvas.drawARGB(0, 0, 0, 0);  
  114.         paint.setColor(color);  
  115.         canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  116.         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  117.         canvas.drawBitmap(bitmap, rect, rect, paint);  
  118.         return output;  
  119.     }  
  120.   
  121.     // 使用系统当前日期加以调整作为照片的名称  
  122.     private String getPhotoFileName() {  
  123.         Date date = new Date(System.currentTimeMillis());  
  124.         SimpleDateFormat dateFormat = new SimpleDateFormat(  
  125.                 "'IMG'_yyyyMMdd_HHmmss");  
  126.         return dateFormat.format(date) + ".jpg";  
  127.     }  
  128. }  

布局:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <Button  
  7.         android:id="@+id/btn_creama"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_centerHorizontal="true"  
  11.         android:text="拍照"  
  12.         tools:context=".CramaActivity" />  
  13.   
  14.     <ImageView  
  15.         android:id="@+id/img_creama"  
  16.         android:layout_width="150dip"  
  17.         android:layout_height="150dip"  
  18.         android:layout_below="@+id/btn_creama"  
  19.         android:layout_centerHorizontal="true"  
  20.         android:layout_margin="15dip"  
  21.         android:background="@drawable/ic_launcher"  
  22.         android:scaleType="fitXY" />  
  23.   
  24.     <TextView  
  25.         android:id="@+id/text"  
  26.         android:layout_width="fill_parent"  
  27.         android:layout_height="wrap_content"  
  28.         android:layout_below="@+id/img_creama"  
  29.         android:background="#22000000"  
  30.         android:textSize="16sp" />  
  31.   
  32. </RelativeLayout>  

效果:



注意:

1.在这调用系统相机的时候,开始的因为有个cursor关闭了,结果导致了 不能连接相机服务。那个游标在底层跟相机服务相关,测试了半天才发现这个问题的!

2.data==null

对于小米或者三星等的手机,调用系统相机时切换屏幕,以前的数据会清空掉,请在调用相机之前保存好相关的数据。

这里给出其中一种方法:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.     * 保存切换屏幕前的数据  
  3.     *  
  4.     * @return  
  5.     */  
  6.    @Override  
  7.    public Object onRetainNonConfigurationInstance() {  
  8.        Uri data = mCameraImageUri;  
  9.        return data;  
  10.    }  
然后在oncreate()中获取保存的数据:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. //获取保存de数据  
  2.        if (null == mCameraImageUri) {  
  3.            mCameraImageUri = (Uri) getLastNonConfigurationInstance();  
  4.        }  

3.Canvas: trying to use a recycled bitmap Android.graphics.Bitmap:

在回收之前加判断:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. if (null != mBitmap) {  
  2.                             if (b != mBitmap && b != null && !mBitmap.isRecycled()) {  
  3.                                 mImageView.setImageBitmapResetBase(b, true);  
  4.                                 mBitmap.recycle();  
  5.                             }  
  6.                             mBitmap = b;  
  7.                             if (mImageView.getScale() == 1F) {  
  8.                                 mImageView.center(true, true);  
  9.                             }  
  10.                         }  
在onDestroy()中回收:
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2.   protected void onDestroy() {  
  3.       super.onDestroy();  
  4.       if (mBitmap != null && !mBitmap.isRecycled()) {  
  5.           mBitmap.recycle();  
  6.           mBitmap = null;  
  7.       }  
  8.   }  

3.intent.putExtra("return-data", true)

true :返回数据 ,不保存裁剪的图片到相册中

false :会将裁剪的图片保存到相册中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vfp9.0调用API制作照相软件实例 PUBLIC WM_CAP_DRIVER_DISCONNECT PUBLIC hwndc,WM_CAP_SAVEDIB,WM_CAP_FILE_SET_CAPTURE_FILEA,WM_CAP_SEQUENCE,WM_CAP_STOP DECLARE INTEGER capCreateCaptureWindowA IN "AVICAP32.DLL" STRING lpszWindowName ,INTEGER dwStyle , INTEGER x, INTEGER Y, INTEGER nWidth ,INTEGER nHeight,INTEGER ParentWin,INTEGER nId DECLARE INTEGER SendMessage IN "user32" INTEGER HWND, INTEGER wmsg,INTEGER wpar1, INTEGER wpar2 DECLARE INTEGER SendMessage IN "user32" AS SendMessageA INTEGER HWND, INTEGER wmsg,INTEGER wpar1, STRING wpar2 *!* 显示: WM_USER = 1024 WM_CAP_START = WM_USER WM_CAP_STOP = WM_CAP_START + 68 WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10 WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11 WM_CAP_SAVEDIB = WM_CAP_START + 25 WM_CAP_GRAB_FRAME = WM_CAP_START + 60 WM_CAP_SEQUENCE = WM_CAP_START + 62 WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20 WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6 WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2 WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3 WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5 WM_CAP_SET_SCALE=WM_CAP_START+ 53 WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 hWndC = capCreateCaptureWindowA('My Own Capture Window',1342177280,0,0,200,150,THISFORM.HWND ,0) &&显示大小 IF hWndC 0 SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0) SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0) SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0) SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0) * THISFORM.ACTIVATE ENDIF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值