當前位置:首頁 » 安卓系統 » android圖片自定義裁剪

android圖片自定義裁剪

發布時間: 2023-03-06 01:29:15

『壹』 Android調用系統的圖片剪裁,剪裁框大小能設置嗎outputX和outputY不是

剪裁框大小可以設置,也可以手動拖動,outputX和outputY是用來指定輸出的圖片X Y軸的大小。


1.創建一個uri指向圖片路徑

Uri imageUri = Uri.parse(file:///sdcard/temp.jpg);


2.裁剪框設置代碼:

java">Intentintent=newIntent(Intent.ACTION_GET_CONTENT,null);
intent.setType("image/*");
intent.putExtra("crop","true");
//裁剪框比例
intent.putExtra("aspectX",2);
intent.putExtra("aspectY",1);
//圖片輸出大小
intent.putExtra("outputX",600);
intent.putExtra("outputY",300);
intent.putExtra("scale",true);
intent.putExtra("return-data",false);
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
//不啟用人臉識別
intent.putExtra("noFaceDetection",false);
startActivityForResult(openAlbumIntent,PHOTO_ALBUM_REQUEST);


3.啟動裁剪即可

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

takePhotoIntent .putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(takePhotoIntent , CAMERA_REQUEST);

『貳』 Android拍照、從圖庫導入以及圖片裁剪

以前在實際項目中使用拍照和從圖庫中獲取圖片時,不知道以何種方式從回調中取得圖片資源,以Bitmap方式還是Uri的形式?如果是使用Bitmap,應該注意些什麼,Uri又是一種什麼樣的格式?有時會出現拍照時回調data數據為空的情況,又該如何定位問題呢?圖片裁剪又是怎樣決定方案的?以下將針對這幾個問題闡述自己的見解。

在Android中,Intent觸發 Camera程序,拍好照片後會返回數據,比如攝像頭800萬像素,拍出來的圖片尺寸為 3200x2400,占據內存大小=3200 x 2400 x 4bytes / (1024 x 1024) = 30MB 【圖像設置ARGB_8888一個像素點占據4位元組內存】,這個尺寸對應的 Bitmap會耗光應用程序的內存,出於安全方面的考慮,Android會給你一個縮略圖,比如 160 x 120 px。

Q:為何要返回圖縮略?
縮略圖是指從onActivityForResullt回調方法中 intent保存的參數圖片。這是因為在啟動相機程序拍攝圖片,為了讓Bitmap數據能在Activity之間傳遞,不得不將拍攝後的Bitmap進行壓縮再傳遞,因此通過回調從intent中取得的是縮略圖在於拍攝的Bitmap太大,Activity之間Bundle存放的數據不能太大,會導致程序無響應。高清原圖是指直接將拍攝的圖片以文件/Uri形式保存到手機。
註:Bitmap實現了Parcelable 介面,所有可以在Activity間使用Intent傳遞。

Q:使用Bitmap需要注意哪些問題?

1、Android 裁剪圖片 Intent 附加數據的含義

| setExtra | DataType | Desciption | Extra |
|:-------- |:--------:| :------: |
|crop| String | Signals the crop feature | value="true" |
|aspectX|int|Aspect Ratio|裁剪橫向比例|
|aspectY|int|Aspect Ratio|裁剪縱向比例|
|outputX|int|width od output created from this intent|輸出寬度|
|outputY|int|height od output created from this intent|輸出高度|
|scale|boolean|should it scale|是否伸縮|
|return-date|boolean|Return the bitmap with Action-inline-data by using the data|是否返回Bitmap數據|
|data|Parcelable|Bitmap to process, you may provide it a bitmap (not tested)|可設置data為Bitmap或者將相應數據同uri聯系起來|
|circleCrop|String|if this string is not null, it will provide some cicular cr||
|MediaStore.
EXTRA_OUTPUT("output")|URI|set this URI to a File|輸出路徑到uri中|
2、圖片裁剪終極方案 — 圖片來源有拍照和圖庫,可採取的操作有:

3、剪切圖片:

『叄』 調用 android 自身裁剪功能

在Android操作系統下可通過編程實現對視頻圖像進行抓拍並對圖片的裁剪與上傳功能。簡單的實現方法採用Android 自帶有關於照片的自由裁剪,非常適用及視頻抓拍的介面功能。
一、視頻抓拍
1、基本類
Android 框架通過 Camera API 或者 camer Intent 的方式,支持 捕捉圖像和視頻 。相關的大類主要有以下幾個:
(1) Camera 攝像時候必須調用到的類;
(2)SurfaceView 提供攝像頭預覽。
(3)MediaRecorder 錄像時候用到的類;
(4)Intent 如果不通過 Camera 對象來操控攝像頭,那麼用兩個intent 動作 MediaStore.ACTION_IMAGE_CAPTURE or MediaStore.ACTION_VIDEO_CAPTURE 也能夠實現攝影和錄像。
o MediaStore.ACTION_IMAGE_CAPTURE —— 向內置攝像頭程序請求圖像的意圖活動類型。
o MediaStore.ACTION_VIDEO_CAPTURE —— 向內置攝像頭程序請求視頻的意圖活動類型。

2、 Manifest 聲明
在使用Camera API前,必須做出使用 Camera 硬體的聲明。主要有下面 點:
(1) Camera 允許:(注意,如果是通過intent 意圖來操控的,則不需要下面聲明)
<uses-permission android:name="android.permission.CAMERA" />
(2)Camera 特徵,比如說名字
<uses-feature android:name="android.hardware.camera" />
(3)如果你要在SD卡中保存照片和視頻,那麼就得開啟SD卡許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(4)錄音許可權
<uses-permission android:name="android.permission.RECORD_AUDIO" />
(5)如果希望在照片中插入GPS當地信息,還得開啟GPS
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
3、使用方法
使用攝像頭的方法有兩種:
一種是編寫代碼比較少的,快速使用攝像頭的意圖Intent 方法;
另外一種就是 自動外觀的攝像頭用戶界面,要求編寫更多的代碼。
4、使用Intent 快速應用攝像頭:使用默認配置拍攝並保存

二、圖片自由裁剪
關鍵代碼如下:
public void imageCut(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//開啟裁剪功能
intent.putExtra("crop", "true");
//設定寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//設定裁剪圖片寬高
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
//要求返回數據
intent.putExtra("return-data", true);
startActivityForResult(intent, 100);
}
返回數據後直接在onActivityResult 里對返回的圖片數據進行顯示就行了,這里由於剪切後的圖片較小,個人覺得應該不用考慮OOM的問題,問題是,在調用自帶的裁剪功能的時候,由於沒看源碼,所以不知道在調整裁剪框的時候,顯示的那副圖片有沒有進行壓縮,如果沒有進行壓縮,那麼當圖片很大的時候,載入起來就很容易出現OOM了,明顯對此由於是調用官方的API,我沒有方法去解決它。唯一的辦法就是不用它,而是自己去寫一個,就可以避免這個問題。利用如下的代碼進行壓縮,很好地避免OOM問題。

『肆』 android 怎麼裁剪drawable

可使用ScaleType來指定drawable的縮放方式,來實現裁剪效果。

ImageView的Scaletype決定了圖片在View上顯示時的樣子,如進行何種比例的縮放,及顯示圖片的整體還是部分,等等。
設置的方式包括:
1. 在layout xml中定義android:scaleType="CENTER"
2. 或在代碼中調用imageView.setScaleType(ImageView.ScaleType.CENTER);

Scaletype的取值說明:
1. SetScaleType(ImageView.ScaleType.CENTER);
按圖片的原來size居中顯示,當圖片長/寬超過View的長/寬,則截取圖片的居中部分顯示

2. SetScaleType(ImageView.ScaleType.CENTER_CROP);

按比例擴大圖片的size居中顯示,使得圖片長(寬)等於或大於View的長(寬)

3. setScaleType(ImageView.ScaleType.CENTER_INSIDE);
將圖片的內容完整居中顯示,通過按比例縮小或原來的size使得圖片長/寬等於或小於View的長/寬

4. setScaleType(ImageView.ScaleType.FIT_CENTER);

把圖片按比例擴大/縮小到View的寬度,居中顯示

5. FIT_START, FIT_END在圖片縮放效果上與FIT_CENTER一樣,只是顯示的位置不同,FIT_START是置於頂部,FIT_CENTER居中,FIT_END置於底部。
在此就不給出示例了。

6. FIT_XY
不按比例縮放圖片,目標是把圖片塞滿整個View。

『伍』 android 怎麼裁剪drawable

圖片裁剪
package com.xiaoma.piccut.demo;

import java.io.File;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
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.ImageButton;
import android.widget.ImageView;
/**
* @Title: PicCutDemoActivity.java
* @Package com.xiaoma.piccut.demo
* @Description: 圖片裁剪功能測試
* @author XiaoMa
*/
public class PicCutDemoActivity extends Activity implements OnClickListener {

private ImageButton ib = null;
private ImageView iv = null;
private Button btn = null;
private String tp = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化
init();
}

/**
* 初始化方法實現
*/
private void init() {
ib = (ImageButton) findViewById(R.id.imageButton1);
iv = (ImageView) findViewById(R.id.imageView1);
btn = (Button) findViewById(R.id.button1);
ib.setOnClickListener(this);
iv.setOnClickListener(this);
btn.setOnClickListener(this);
}

/**
* 控制項點擊事件實現
*
* 因為有朋友問不同控制項的背景圖裁剪怎麼實現,
* 我就在這個地方用了三個控制項,只為了自己記錄學習
* 大家覺得沒用的可以跳過啦
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageButton1:
ShowPickDialog();
break;
case R.id.imageView1:
ShowPickDialog();
break;
case R.id.button1:
ShowPickDialog();
break;

default:
break;
}
}

/**
* 選擇提示對話框
*/
private void ShowPickDialog() {
new AlertDialog.Builder(this)
.setTitle("設置頭像...")
.setNegativeButton("相冊", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
/**
* 剛開始,我自己也不知道ACTION_PICK是幹嘛的,後來直接看Intent源碼,
* 可以發現裡面很多東西,Intent是個很強大的東西,大家一定仔細閱讀下
*/
Intent intent = new Intent(Intent.ACTION_PICK, null);

/**
* 下面這句話,與其它方式寫是一樣的效果,如果:
* intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
* intent.setType(""image/*");設置數據類型
* 如果朋友們要限制上傳到伺服器的圖片類型時可以直接寫如:"image/jpeg 、 image/png等的類型"
* 這個地方小馬有個疑問,希望高手解答下:就是這個數據URI與類型為什麼要分兩種形式來寫呀?有什麼區別?
*/
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, 1);

}
})
.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
/**
* 下面這句還是老樣子,調用快速拍照功能,至於為什麼叫快速拍照,大家可以參考如下官方
* 文檔,you_sdk_path/docs/guide/topics/media/camera.html
* 我剛看的時候因為太長就認真看,其實是錯的,這個裡面有用的太多了,所以大家不要認為
* 官方文檔太長了就不看了,其實是錯的,這個地方小馬也錯了,必須改正
*/
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
//下面這句指定調用相機拍照後的照片存儲的路徑
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
"xiaoma.jpg")));
startActivityForResult(intent, 2);
}
}).show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
// 如果是直接從相冊獲取
case 1:
startPhotoZoom(data.getData());
break;
// 如果是調用相機拍照時
case 2:
File temp = new File(Environment.getExternalStorageDirectory()
+ "/xiaoma.jpg");
startPhotoZoom(Uri.fromFile(temp));
break;
// 取得裁剪後的圖片
case 3:
/**
* 非空判斷大家一定要驗證,如果不驗證的話,
* 在剪裁之後如果發現不滿意,要重新裁剪,丟棄
* 當前功能時,會報NullException,小馬只
* 在這個地方加下,大家可以根據不同情況在合適的
* 地方做判斷處理類似情況
*
*/
if(data != null){
setPicToView(data);
}
break;
default:
break;

}
super.onActivityResult(requestCode, resultCode, data);
}

/**
* 裁剪圖片方法實現
* @param uri
*/
public void startPhotoZoom(Uri uri) {
/*
* 至於下面這個Intent的ACTION是怎麼知道的,大家可以看下自己路徑下的如下網頁
* yourself_sdk_path/docs/reference/android/content/Intent.html
* 直接在裡面Ctrl+F搜:CROP ,之前小馬沒仔細看過,其實安卓系統早已經有自帶圖片裁剪功能,
* 是直接調本地庫的,小馬不懂C C++ 這個不做詳細了解去了,有輪子就用輪子,不再研究輪子是怎麼
* 製做的了...吼吼
*/
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪圖片寬高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}

/**
* 保存裁剪之後的圖片數據
* @param picdata
*/
private void setPicToView(Intent picdata) {
Bundle extras = picdata.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
Drawable drawable = new BitmapDrawable(photo);

/**
* 下面注釋的方法是將裁剪之後的圖片以Base64Coder的字元方式上
* 傳到伺服器,QQ頭像上傳採用的方法跟這個類似
*/

/*ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);
byte[] b = stream.toByteArray();
// 將圖片流以字元串形式存儲下來

tp = new String(Base64Coder.encodeLines(b));
這個地方大家可以寫下給伺服器上傳圖片的實現,直接把tp直接上傳就可以了,
伺服器處理的方法是伺服器那邊的事了,吼吼

如果下載到的伺服器的數據還是以Base64Coder的形式的話,可以用以下方式轉換
為我們可以用的圖片類型就OK啦...吼吼
Bitmap dBitmap = BitmapFactory.decodeFile(tp);
Drawable drawable = new BitmapDrawable(dBitmap);
*/
ib.setBackgroundDrawable(drawable);
iv.setBackgroundDrawable(drawable);
}
}

}

『陸』 調用android系統的圖片裁剪方式問題和解決方式

調用android系統的圖片裁剪方式問題和解決方式:

如果你的程序中使用的圖片裁剪方式是這樣子的話:

1、調用系統自帶的圖片裁剪頁面,吧圖片保存在inetnt中;

2、裁剪完畢通過intentData取出圖片

如果使用這種方式,就會遇到一個問題:

在某些手機(本人遇到的情況是小米3)上面無法跳轉到系統的圖片裁剪頁面,或者IntentData是null。

這種方式是把圖片放在intent中傳遞,而intent在安卓中的定義是傳遞輕量級的數據,顯然傳遞圖片是不合適的,高性能的手機可能沒問題,性能差點的手機就會出問題了。、

解決方式:

1、用intent傳遞圖片的Uri:

private staticUrimUriFile;

2、裁剪完畢通過Uri取出圖片:

這里要注意取圖片的方式,小心oom。把規避oom的方式也貼出來:

『柒』 (譯)uCrop介紹 —— 我們自己的Android圖片裁剪庫

原文鏈接: https://yalantis.com/blog/introcing-ucrop-our-own-image-cropping-library-for-android

譯者: Eirture

我們在 Yalantis 開發了許多不同的 Android 應用,經驗告訴我們,幾乎在所有的應用中,都需要圖片裁剪的功能。圖片裁剪的用途很廣,從簡單的用戶頭像調整到圖片的比例裁剪、靈活變換等各種復雜的處理。

我們想為所有的用戶提供最好的圖片處理工具,所以決定創建Android的圖片裁剪庫 uCrop 。 可以在 Proct Hunt 上為 uCorp 投票。

也許你會好奇,為什麼我們不使用現成的 Android 圖片裁剪解決方案。 畢竟,可以在 Github 或者 Android Arsenal 上找到很多這類的庫。但是問題是,那些解決方案都不滿足我們的需求。我們來看一些主流的開源圖片裁剪庫,為什麼不符合我們的需求。

我在幾個項目裡面使用了 SoundCloud 庫很成功,但是仍然有幾個問題讓我很頭痛。

首先,你操作的是一個裁剪的框,而不是圖片本身。當需要裁剪一個很小面積的圖片時,這會你感覺有點痛苦。這是與用戶使用習慣向悖的。我確信 Instagram 傳授給我們的是一些優秀的 UX (用戶體驗),可以移動的裁剪框也已經滅絕了。

其次,SoundCloud 裁剪庫不允許用戶旋轉圖片。Come on, guys! 所有人都知道,有成百上千「不可思議」的安卓手機給照片設置了錯誤的EXIF信息(謝天謝地,我們有 CWAC 來清理這個爛攤子)。而且,很大部分的用戶是希望能夠轉動圖片的(不僅僅是 90 度)。

最後同樣重要的一點,使用 SoundCloud 庫不能改變長寬比。當然,如果你使用它僅僅是需要獲取一個方形的頭像,那沒有任何問題。但是,其它很多很有趣的頭像形狀,用這個庫無法實現。

Scissors 是一個新的庫,不久前我在一個 安卓問題周刊 上看到它的時候特別激動。但 5 分鍾內我的興奮就消失了。引用一句關於 Scissors 的 博文 :

這確實是一個值得稱贊的方法。實際上,我們找到又是一個不能旋轉圖片,也不能動態調整寬高比的庫。盡管 Scissors 集成了一些主流的圖片載入庫,像 Picasso , Glide 以及 Universal Image Loader 。希望 Scissors 在後續的版本中有更多實用的功能。

分析完這些現有庫的缺點,我們決定創建 自己的庫 ,支持手勢並且有一個良好的 UX。

安卓庫 uCrop 允許你修剪圖片來更好的使用。uCrop 重要的特性如下:

uCrop 有一個初始化的構建類型介面,來為你的應用配置一些適當的屬性。uCrop 庫最低的版本要求是 API 10,示例應用工作的版本是 API 15+ 。

你可以改變下面這個設置:

在下一篇文章中,將會展示我們構建 uCrop 的經歷,敬請關注!

『捌』 安卓什麼軟體可以把圖片裁截成任意形狀

你好
你好
你可以在瀏覽器裡面搜索應用寶。然後在搜索列表中找到官網標識的下載。你要找的自由裁剪功能的軟體有picsArt。只要你打開圖片,然後使用工具找到字頭裁剪或者是圖像裁剪等等。他就像是一個小型的ps工具很好用。

『玖』 android拍照圖片裁剪的問題

因為沒許可權就讀取不了內部存儲的文件啊

『拾』 如何在android開發中設計出一個四邊形(不是矩形,四邊均可一定)的照片裁剪框

裁剪框android自帶這樣的功能。
調用方式:
Intent intent = new Intent();
intent.setAction("com.android.camera.action.CROP");

intent.setDataAndType(mUri, "image/*");// mUri是已經選擇的圖片Uri
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);// 輸出圖片大小
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 200);

熱點內容
ie內核緩存 發布:2025-05-09 21:19:35 瀏覽:543
第五人格伺服器錯誤是怎麼解決 發布:2025-05-09 21:14:24 瀏覽:512
壓縮系數z 發布:2025-05-09 21:01:51 瀏覽:652
雙開助手緩存的文件在哪 發布:2025-05-09 21:01:41 瀏覽:525
酒仙腳本 發布:2025-05-09 21:00:40 瀏覽:905
牙髓存儲 發布:2025-05-09 20:50:22 瀏覽:433
安卓如何看自己去過哪裡 發布:2025-05-09 20:37:23 瀏覽:695
電腦怎麼製作手機版的我的世界伺服器 發布:2025-05-09 20:36:45 瀏覽:533
免流腳本破解 發布:2025-05-09 20:33:49 瀏覽:182
微信圖書館源碼 發布:2025-05-09 20:31:40 瀏覽:955