① android 圖像處理 用什麼庫
沒有,只有GPU
② Android如何進行圖片編輯
裁剪選取或拍攝的圖片
public static void cropphoto(Fragment fragment, Uri uri){ //設置裁剪圖片保存位置 File bomb=new File(fragment.getContext().getExternalCacheDir(),"bmob"); Log.d("tag", "cropphoto: "+bomb); if (!bomb.exists()){ bomb.mkdir(); } File file=new File(bomb,"user_icon.jpg"); if (!file.exists()){ try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } Intent intent=new Intent("com.android.camera.action.CROP");//intent隱式調用啟動拍照界面 intent.setDataAndType(uri,"image/*");//設置需要裁剪的圖片地址 intent.putExtra("crop", "true");//通過put(key,value)方法設置相關屬相 intent.putExtra("aspectX", 1);//設置圖片寬高比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", 240);//設置圖片寬高 intent.putExtra("outputY", 240); intent.putExtra("return-data", false);//該屬性設置為false表示拍照後不會將數據返回到onResluet方法中(建議設置為false,這樣獲取的圖片會比較清晰) intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));//該屬性設置的是拍照後圖片保存的位置 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//設置輸出格式 intent.putExtra("noFaceDetection", true);//是否取消人臉識別 /*ComponentName componentName = intent.resolveActivity(context.getPackageManager()); Log.d("TAG", "cropphoto: "+componentName); if (componentName!=null){ fragment.startActivityForResult(intent,Variable.request_crop); }*/ fragment.startActivityForResult(intent,Variable.request_crop); }
③ android設置圖片
1、創建imageview對象
2、設置imageview的圖片
3、添加到布局中
示例代碼
ViewGroup group = (ViewGroup) findViewById(R.id.viewGroup); //獲取原來的布局容器
ImageView imageView = new ImageView(this); //創建imageview
imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); //image的布局方式
imageView.setImageResource(R.drawable.ic_launcher); //設置imageview呈現的圖片
group.addView(imageView); //添加到布局容器中,顯示圖片。
④ Android 保存圖片到本地。
這里只介紹按下「保存」後如何將一個Bitmap對象保存為圖片文件的執行步驟,對圖片的下載,圖片到Bitmap對象的轉換,Bitmap對象的格式轉換和壓縮,以及界面設計部分全部都忽略了。
確定存儲路徑
獲取外部存儲許可權
確定外部存儲狀態
確定文件名
保存到文件中
發送廣播,通知系統掃描保存後的文件
確定存儲路徑
在Android中文件存儲路徑包括內部存儲和外部存儲兩種類型。
對內部存儲,當一個app被安裝到手機後,Android系統會在內部存儲的/data/data/目錄下創建一個以包名稱命名的文件夾。例如/data/data/com.sohu.inputmethod.sogou/。一個應用對內部存儲的所有訪問都被限制在這個文件夾中,也就是說Android應用只能在該目錄中讀取,創建,修改文件。對該目錄之外的其他內部存儲中的目錄都沒有任何操作的許可權。因此,如果將圖片保存在內部存儲中,只能被應用自身讀取,其他應用均無法讀取。如果需要讓系統圖庫,相冊或其他應用能夠找到保存的圖片,必須將圖片保存到外部存儲中。
對外部存儲,當一個app被安裝到手機後,Android系統會在外部存儲的/Android/data/目錄下創建一個以包名命名的文件夾(這里第一個/不是根路徑,而是相對外部存儲所掛載路徑的相對路徑)。例如/storage/emulated/0/Android/data/com.sohu.inputmethod/。這個路徑同樣只能被應用自身讀取,其他應用不能訪問。因此,也不能將圖片保存在這個目錄中。
除外部存儲的/Android目錄之外的其他目錄一般都是可以被其他應用訪問的。目前,大多數應用都會在外部存儲的根路徑下建立一個類似包名的多層目錄,以存儲需要共享的文件。例如/storage/emulated/0/sogou/image/。還需要注意的是,很多查看圖片的應用都支持按照文件夾來查看圖片。如果將圖片所在的文件夾取名為image,photo之類的,就無法和其他文件夾區分開,用戶也不能識別該文件夾的用途。因此最好取一個有區分度的文件夾名字,例如網路貼吧就保存在/tieba目錄,微信是保存在/tencent/MicroMsg/WeiXin目錄。
由於Android系統的碎片化問題,不同設備上外部存儲的路徑很可能會不同,因此,不能直接使用/storage/emulated/0/作為外部存儲的根路徑。
Android SDK中 Environment類 提供了getExternalStorageDirectory()方法來獲取外部存儲的根路徑。示例如下:
[java]view plain
Stringdir=Environment.getExternalStorageDirectory().getAbsolutePath()+"/tencent/MicroMsg/WeiXin/"
需要注意的是Environment.getExternalStorageDirectory()返回的路徑中最後一個字元不是/,如果需要創建子目錄,需要在子目錄的前後都加上/。
獲取外部存儲許可權
由於需要在外部存儲中寫文件,需要在AndroidManifest.xml中增加如下的許可權聲明。
[java]view plain
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
確定外部存儲狀態
由於外部存儲需要被掛載,也可以被卸載,在寫入文件之前,需要先判斷外部存儲的狀態是否正常。只有狀態正常情況下才可以執行保存文件的操作。獲取外部存儲狀態同樣是通過Environment類,通過Environment.getExternalStorageState()可以得到一個字元串,來表示外部存儲的狀態。同時在Environment類中定義了一系列的String常量表示不同的狀態。在所有的狀態中只有內部存儲處於Environment.MEDIA_MOUNTED狀態時才可以讀寫文件,因此,需要將獲取到的狀態和Environment.MEDIA_MOUNTED做比較,如果不是Environment.MEDIA_MOUNTED狀態,就返回保存失敗。示例如下。
[java]view plain
//獲取內部存儲狀態
Stringstate=Environment.getExternalStorageState();
//如果狀態不是mounted,無法讀寫
if(!state.equals(Environment.MEDIA_MOUNTED)){
return;
}
確定文件名
保存的圖片文件名可以由應用根據自身需要自行確定,一般來說需要有一個命名規則,然後根據命名規則計算得到文件名。
這里列舉幾種常見的命名規則。
隨機命名
這種命名規則是隨機生成一個字元串或一組數字來對圖片命名。
字元串可以通過UUID來生成,數字可以通過Random()類來生成,例如:
[java]view plain
//通過UUID生成字元串文件名
StringfileName1=UUID.randomUUID().toString();
//通過Random()類生成數組命名
Randomrandom=newRandom();
StringfileName2=String.valueOf(random.nextInt(Integer.MAX_VALUE));
這種命名規則是按照數字從小到大的順序來對圖片命名。
在程序啟動時先獲取圖片文件名中當前最大數字的文件名,之後每保存一張圖片就將數字加1即可。
時間命名
這種命名規則是根據保存圖片的當前系統時間來對圖片命名。
系統時間可以通過System.currentTimeMillis()來獲取,不過System.currentTimeMillis()獲取到的時間是一個long型的整數,如果用它做文件名,無法通過文件名直接看出文件的具體保存時間。可以通過SimpleDateFormat先對當前時間做格式化,然後再將其作為文件名來使用。例如:
[java]view plain
使用這種命名規則來命名需要注意的是同一秒鍾可能會有多張圖片需要保存,在得到當前系統時間對應的文件名後,需要判斷該文件是否存在。如果文件已經存在,需要重新生成文件名。重新生成的文件名可以在之前的文件名後加上一個隨機數後綴,或者是用毫秒數做後綴。
Calendarnow=newGregorianCalendar();
SimpleDateFormatsimpleDate=newSimpleDateFormat("yyyyMMddHHmmss",Locale.getDefault());
StringfileName=simpleDate.format(now.getTime());
文件URL命名
每張網路圖片都有一個對應的圖片URL,可以根據圖片的URL來對圖片命名。
不過URL中會包含一些不能用作文件名的特殊字元,此外直接用URL來命名可能會帶來安全問題。為了避免這兩個問題,可以將圖片URL的MD5值作為文件名來使用。由於MD5是不可逆的,也就無法通過MD5值反向得到圖片URL,同時MD5值對應的字元串只包含[0-9A-Z],不包含特殊字元,可是作為文件名使用。
由於每張圖片的URL是唯一的,其對應的文件名也就是唯一的。如果需要每張網路圖片只能生成一個文件,不允許保存為多份拷貝,可以用這種命名規則。在得到URL對應的文件名後,先判斷文件是否已經存在,如果已經存在,直接覆蓋或不處理。
保存到文件中
保存圖片文件時,通過Bitmap的compress()方法將Bitmap對象壓縮到一個文件輸出流中,然後flush()即可。示例如下。
[java]view plain
try{
Filefile=newFile(dir+fileName+".jpg");
FileOutputStreamout=newFileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
}catch(Exceptione){
e.printStackTrace();
}
發送廣播,通知系統掃描保存後的文件
至此,已經實現將Bitmap對象保存成外部存儲中的一個jpg格式的文件。但此時該文件只是保存在外部存儲的一個目錄中,必須進入其所在的目錄中才可以看到。在系統圖庫,相冊和其他應用中無法看到新建的圖片文件。為了讓其他應用能夠知道圖片文件被創建,必須通知MediaProvider服務將新建的文件添加到圖片資料庫中。
Android系統中常駐一個MediaProvider服務,對應的進程名為android.process.media,此服務用來管理本機上的媒體文件,提供媒體管理服務。在系統開機或者收到外部存儲的掛載消息後,MediaProvider會調用MediaScanner,MediaScanner會掃描外部存儲中的所有文件,根據文件類型的後綴將文件信息保存到對應的資料庫中,供其他APP使用。
MediaScannerReceiver是一個廣播接收者,當它接收到特定的廣播請求後,就會去掃描指定的文件,並根據文件信息將其添加到資料庫中。當圖片文件被創建後,就可以發送廣播給MediaScannerReceiver,通知其掃描新建的圖片文件。示例如下。
[java]view plain
try{
Filefile=newFile(dir+fileName+".jpg");
FileOutputStreamout=newFileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
//保存圖片後發送廣播通知更新資料庫
Uriuri=Uri.fromFile(file);
sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));
}catch(Exceptione){
e.printStackTrace();
}
圖片的非同步保存
保存圖片文件時,如果圖片很大,或需要同時保存多張圖片時,就需要較多的時間。為了避免阻塞UI線程,出現幀率下降或ANR,通常需要將圖片保存操作放到線程中去執行。當圖片保存完畢後通過sendMessage()方法通知UI線程保存結果。
將圖片保存放到後台線程去執行需要增加一些同步機制避免一些多線程問題。例如有兩張圖片需要保存,分別放到兩個線程中去執行,保存圖片時文件名以數字順序增加。第一個線程選中文件名為125.jpg,但此時文件還未創建,第二個線程判斷125.jpg不存在,於是也選取125.jpg作為文件名,兩張圖片就保存到同一個文件中了。
⑤ android中 怎麼顯示一直圖片為圓形圖片
android中的imageview只能顯示矩形的圖片,這樣一來不能滿足我們其他的需求,比如要顯示圓形的圖片,這個時候,我們就需要自定義imageview了,其原理就是首先獲取到圖片的bitmap,然後進行裁剪圓形的bitmap,然後在ondraw()進行繪制圓形圖片輸出。
⑥ 求助,關於android圖像識別。
你有圖像識別庫嗎?如果有的話,App具體操作其實很簡單,啟動Camera采圖嗲用庫識別。
但是如果你沒有圖像識別庫的話,你要自己去實現,一般庫都是C++寫的,我們公司用圖像識別技術都是有專門的人寫一個對應的圖像識別庫,而且對應掃描不同的東西都要單寫一個庫,然後打包給我們App調用,當然具體怎麼寫一個識別庫,肯定也不是那麼簡單,必須要對C++如何實現圖像識別技術要有一定基礎的。
你要是有時間和精力想自己弄的話,推薦一個國外網站http://opencv.org/platforms/android.html,希望對你有幫助,都是這么苦逼過來的。
⑦ android怎麼實現 圖像隨著手指的移動而移動
總得一句話要重寫onTouchEvent 1.手勢滾動有很多方法: 可用viewpager實現view的左右滑屏,也可以用ViewFlipper,還有笨方法就是一個imageview,獲取按下抬起坐標,判斷左滑右滑,然後set另一張圖片進去。 2.縮放也有很多做法 正統的做法是把imageview的屬性scaleType設置為matrix(矩陣),然後獲取滑動手勢,來操作矩陣獲得縮放的效果
⑧ android如何實現圖片預覽
main.xml
先定義一個GridView,然後再定義一個ImageSwitcher
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<GridView
android:id="@+id/gridView1"
android:layout_height="fill_parent"
android:layout_width="300px"
android:layout_marginTop="6px"
android:horizontalSpacing="3px"
android:verticalSpacing="3px"
android:numColumns="4"/>
<ImageSwitcher
android:id="@+id/imageSwicher1"
android:padding="20px"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
></ImageSwitcher>
</LinearLayout>
MainActivity代碼如下
{
privateint[]imageId=newint[]{R.drawable.w1,R.drawable.w2,
R.drawable.w3,R.drawable.w4,R.drawable.w5,R.drawable.w6};
;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageSwitcher=(ImageSwitcher)findViewById(R.id.imageSwicher1);
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_in));//設置淡入動畫
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_out));//設置談出動畫
imageSwitcher.setFactory(newViewFactory(){
@Override
publicViewmakeView(){
//TODOAuto-generatedmethodstub
ImageViewimageView=newImageView(MainActivity.this);//實例化一個ImageView類的對象
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);//設置保持縱橫比居中縮放圖像
imageView.setLayoutParams(newImageSwitcher.LayoutParams(//主要要是用ImageSwitcher的LayoutParams
LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
returnimageView;
}
});
imageSwitcher.setImageResource(imageId[0]);
GridViewgridView=(GridView)findViewById(R.id.gridView1);
BaseAdapteradapter=newBaseAdapter(){
/*
*獲得數量
*
*@seeandroid.widget.Adapter#getCount()
*/
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnimageId.length;
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
/**
*獲得當前選項
*/
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
ImageViewimageView;
if(convertView==null){
imageView=newImageView(MainActivity.this);
/**設置圖像的寬度和高度**/
imageView.setAdjustViewBounds(true);
imageView.setMaxWidth(150);
imageView.setMaxHeight(113);
imageView.setPadding(5,5,5,5);
}else{
imageView=(ImageView)convertView;
}
imageView.setImageResource(imageId[position]);
returnimageView;
}
};
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
longarg3){
//TODOAuto-generatedmethodstub
imageSwitcher.setImageResource(imageId[arg2]);//顯示選中的圖片
}
});
}
}
⑨ Android繪制圖片的幾種方式
在android中做圖像鏡像有很多方法,今天算是學習了!
兩種方法如下:
復制代碼 代碼如下:
//方法一
Matrix matrix = new Matrix();
matrix.postScale(leftOrRight, 1, bmpW/2, bmpH/2);//前兩個是xy變換,後兩個是對稱軸中心點
matrix.postTranslate(x, y);
canvas.drawBitmap(bmpLuffy[0], matrix, paint);
//方法二
// canvas.save();
// canvas.scale(-1, 1, x + bmpLuffy[0].getWidth() / 2, y + bmpLuffy[0].getHeight() / 2);
// canvas.drawBitmap(bmpLuffy[0], x, y, paint);
// canvas.restore();
方法一,使用矩陣的方式(3x3)矩陣:
1、先使用postScale的方式將圖片以點(bmpW/2,bmpH/2)為中心,以x=bmpW/2為對稱軸翻轉;
2、使用postTranslate,將圖片移到(x,y)坐標
方法二,畫布翻轉(略)
注意如下問題:
對於其中的bmpW和bmpH是指所用圖片的寬高,需要使用圖片bmp.getWidth()和bmp.getHeight()獲取,
不能使用PC上看到的大小,否則可能會出現錯位!