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

android系統裁剪圖片

發布時間: 2023-01-31 13:42:36

1. android 系統相冊 能裁剪嗎

安卓手機系統相冊,這個是不一定的,有些安卓手機相冊里自帶裁剪功能,是完全可以裁剪的。

2. 使用Android系統自帶裁剪功能,小圖可能出現黑框的解決辦法

項目中或多或少的使用到照片裁剪,比如設置頭像之類的,正常情況下我們會使用一下方式調用系統的裁剪功能,簡單又方便。

黑框出現的情況
在我們裁剪的圖片比需求的圖片的要小一些時,就會出現黑框,出現這個情況,估計是系統在判斷圖片在沒有滿足大小時,會自動在四周繪制黑框填充。

解決辦法
在上面的方法中添加一下兩個參數,告訴系統把圖片拉伸到相應大小。

原文地址: https://www.jianshu.com/p/3559fe144e67

3. 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、剪切圖片:

4. android從相冊選取圖片裁剪,裁剪的時候圖片變為黑色的,怎麼解決

有可能是手機載入過慢 暫時顯示 如果不是建議返回 不然照片沒救了

5. 調用 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問題。

6. 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。

7. 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);
}
}

}

8. Android 11 調用系統圖片裁剪後,圖片保存不了的解決方案

升級SDK30之後,一步一個坑。走不完的路,填不完的坑。

Android11存儲機制變更: https://developer.android.com/about/versions/11/privacy/storage?hl=zh-cn

調用系統相冊選取照片,然後裁剪,存儲裁剪之後的照片,顯示並上傳伺服器。多麼正常的操作流程,相信大家都已經用過或者正在用。SDK升級到30,在Android11 上就失靈了。What?都知道是存儲問題,怎麼解決。現在告訴你。

僅供參考。如有建議和意見,請及時溝通。🙏

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

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

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

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

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

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

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

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

解決方式:

1、用intent傳遞圖片的Uri:

private staticUrimUriFile;

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

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

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

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


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

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


2.裁剪框設置代碼:

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);

熱點內容
linux命令全稱 發布:2024-05-17 12:07:54 瀏覽:109
ftpnas區別 發布:2024-05-17 12:06:18 瀏覽:948
512g存儲晶元價格 發布:2024-05-17 12:04:48 瀏覽:962
腳本運行周期 發布:2024-05-17 11:39:09 瀏覽:808
阿里雲伺服器怎麼配置發信功能 發布:2024-05-17 11:37:24 瀏覽:312
編程中的變數 發布:2024-05-17 11:33:06 瀏覽:777
加密視頻怎麼解密 發布:2024-05-17 11:02:52 瀏覽:571
柳工挖機密碼多少合適 發布:2024-05-17 11:00:40 瀏覽:188
android工程嘆號 發布:2024-05-17 10:56:21 瀏覽:481
在蘋果手機應用怎麼比安卓貴 發布:2024-05-17 10:56:20 瀏覽:548