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

android剪裁

發布時間: 2023-05-30 03:39:51

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

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

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

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

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

⑵ 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。

⑶ (譯)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 的經歷,敬請關注!

⑷ Android 圖片選擇(ImageSelector) (拍照,裁剪,壓縮,查看)

1.遍歷sdcard文件夾(指定層次深度 searchDeep ),如果文件夾發現圖片 , 添加到已搜索到圖片的文件列表中,並跳入下一個文件夾搜索

2.使用 ContentResolver 搜索 添加搜索標簽(png,jpg,jpeg,gif 等) 優點:更快速

壓縮調用

第一步-->

采樣率壓縮:設置 BitmapFactory.Options.inSampleSize 大小

第二步-->

PNG:尺寸壓縮( Config:ARGB_4444 ,工具: Canvas );

JPG:尺寸壓縮( Config:ARGB_565 ,工具: Canvas )+壓縮質量( bitmap.compress() )

注 :

1.GIF不做壓縮處理

2.尺寸壓縮:改變寬高(png,jpg)

3.壓縮質量:改變文件大小(適用jpg,png無效)

⑸ 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系統的圖片裁剪方式問題和解決方式

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

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

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

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

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

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

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

解決方式:

1、用intent傳遞圖片的Uri:

private staticUrimUriFile;

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

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

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

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

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

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

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

⑻ 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裁剪之fonts(字體庫)淺析

源碼

問題:
1.系統編譯過程對應的/system/空缺fonts資源來自?
註:
回答此問題,涉及很多編譯方面的斗蔽辯知識

2.app在啟動的時候,怎麼進行字體的並孫載入?
註:
回答此問題,涉及進程啟動流程

3.解讀fonts.xml

熱點內容
組合鍵腳本 發布:2025-02-10 23:32:43 瀏覽:552
安卓籃球手游在哪裡下 發布:2025-02-10 23:21:55 瀏覽:133
linux改變所有者 發布:2025-02-10 23:04:13 瀏覽:650
源碼曹毅 發布:2025-02-10 23:04:01 瀏覽:582
odbcforsqlserver 發布:2025-02-10 22:26:37 瀏覽:600
區塊鏈數據存儲在那裡 發布:2025-02-10 22:25:48 瀏覽:689
c語言for死循環 發布:2025-02-10 22:24:08 瀏覽:523
蘋果限制訪問初始密碼 發布:2025-02-10 22:21:31 瀏覽:759
為什麼安卓手機一年後卡頓 發布:2025-02-10 22:15:39 瀏覽:732
職工信息管理系統設計c語言 發布:2025-02-10 22:15:30 瀏覽:119