Android下的圖形處理
•Android系統下的圖片都是32位的點陣圖
•Android下載入圖片的大小是和圖片的解析度有關係的,因為每個畫素點都要被存入到記憶體,所以,往往我們看圖片只有1M多,但是放到手機上就會OOM異常 out of Memery
Android圖片操作技巧
1. 如何在Android中載入大圖片防止OOM異常呢??
具體步驟如下:
1.獲取圖片的資訊類
ExifInterface exif = new ExifInterface("圖片地址");
2.獲取圖片的寬高資訊
int width = exif.getAttributeInt(ExifInterface.TAG _IMAGE_WIDTH, 0);
int height = exif.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0);
3.獲取到當前裝置螢幕寬高
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
int screenWidth = wm.getDefaultDisplay().getWidth();
int screenHeight = wm.getDefaultDisplay().getHeight();
4.建立一個選項條件
Options opts = new Options();
5.根據圖片寬高和螢幕寬高的比例,確定圖片縮放的值,這裡通常會優先選擇值比較大的,也可以選兩者之間的中間值,然後設定進去
opts.inSampleSize = ?; //設定取樣率
6.把圖片創建出來
Bitmap bitmap = BitmapFactory.decodeFile("圖片路徑", opts);
小結:
只要選擇合適的取樣率inSampleSize去載入圖片就不會發生OOM異常了!
2. Android中圖片變換的步驟
將圖片載入到Android應用中之後,免不了會對圖片進行一系列變換操作,比如:平移,縮放,旋轉…
下面推薦一個常規的操作步驟:
1.載入圖片到記憶體中,獲取bitmap物件
Bitmap srcBitmap = BitmapFactory.decodeFile("圖片路徑");
2.建立一個空的bitmap物件,大小和原來bitmap一樣
Bitmap copyedBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
3.建立畫板
Canvas canvas = new Canvas("空白的bitmap");
4.建立畫筆
Paint paint = new Paint();
5.建立matrix 矩陣,我們可以利用這個矩陣來做到圖片的縮放,平移等操作
Matrix matrix = new Matrix();
//1. 按比例擴大擴充套件縮放
matrix.setScale(x軸比例, y軸比例);
//2. 平移
matrix.setTranslate(x軸偏移量, y軸偏移量);
//3. 旋轉
matrix.setRotate(旋轉角度, 圍繞x軸點旋轉, 圍繞y軸點旋轉);
//4. 鏡面效果
matrix.setScale(-1, 1); //左右效果
matrix.postTranslate(srcBitmap.getWidth(), 0);
//如果想新增多個屬性,後面的要用post,如果呼叫set會把前面的覆蓋
//5. 倒影效果
matrix.setScale(1, -1); //上下效果
matrix.postTranslate(0, srcBitmap.getHeight());
6.作畫
canvas.drawBitmap(原圖, matrix, paint);
步驟小結:
1. 獲取圖片資源
2. 建立一個空白的原圖副本,大小和原圖一樣
3. 建立畫板
4. 建立畫筆
5. 建立Matrix矩陣,設定對圖片需要做的操作
6. 將步驟5操作後的圖片畫到畫板上
應用:
市面上有一款經典的小遊戲,叫做”撕衣服”, 這款遊戲的實現原理就是遵循以上步驟實現的!!
核心API是:
bitmap.setPixel(x座標,y座標,要設定的顏色);//根據xy軸設定bitmap對應畫素點的顏色值為透明
實現原理:
1.利用相對佈局放兩張圖片,上面一張圖片正常穿著衣服,下面一張圖片不穿衣服.
2.通過以上API對上面一張圖片進行操作,接觸到的點全部變為透明,最終顯示效果你懂得!!
<案例實現:美女撕衣服>
- 首先看看實現的效果(請保持平和的心態):
- 具體程式碼:
1.layout下的佈局檔案activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<!--相對佈局放置兩種圖片-->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/iv_after"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/after9"
/>
<ImageView
android:id="@+id/iv_pre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
</LinearLayout>
2.res/drawable-hdpi目錄下放置圖片資源和音效檔案
3.包com.yashiro.dragclose包裡面的MainActivtiy.java檔案
package com.yashiro.dragclose;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv_pre;
private Bitmap alterBitmap;
private SoundPool soundPool;
private int soundId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_pre=(ImageView) findViewById(R.id.iv_pre);
//載入音效
soundPool=new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
//找到音效檔案
soundId=soundPool.load(this, R.drawable.higirl, 1);
//獲取原圖的路徑
Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.pre9);
//建立原圖配置的空白副本
// 修改點陣圖的配置資訊(帶有透明度alpha,相容Android2.3低版本)Bitmap.Config.ARGB_8888
alterBitmap=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig().ARGB_8888);
//建立畫板
final Canvas canvas=new Canvas(alterBitmap);
//建立畫筆
Paint paint=new Paint();
//將原圖臨摹到畫板上
canvas.drawBitmap(bitmap, new Matrix(), paint);
//將臨摹後的影象放到介面上
iv_pre.setImageBitmap(alterBitmap);
//設定圖片的觸控事件. 觸控之處都是透明的
iv_pre.setOnTouchListener(new OnTouchListener() {
//定義觸控到時的座標
int x;
int y;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//播放音效
soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1.1f);
x=(int) event.getX();
y=(int) event.getY();
//觸控到的地方都是透明的. 用半徑為10的原點操作
dragClose(x,y,10);
break;
case MotionEvent.ACTION_UP:
break;
}
return true; //空間自己處理,事件結束就銷燬
}
/**
* 撕衣服的方法
*/
private void dragClose(int x,int y, int radius) {
for(int i=-radius;i<radius+1;i++){
for (int j = -radius; j < radius+1; j++) {
if (Math.sqrt(i*i+j*j)<=radius) {
if ((x+i)<alterBitmap.getWidth()&&(x+i)>0&&(y+j)<alterBitmap.getHeight()&&(y+j)>0) {
alterBitmap.setPixel(x+i, y+j, Color.TRANSPARENT);
}
}
}
}
iv_pre.setImageBitmap(alterBitmap);
}
});
}
}
案例小結:
1.嚴格按照Android圖片變換的5步獲取到圖片資源並進行透明處理
2.利用iv_pre.setOnTouchListener(listener), 這個觸控監聽事件,實現所觸之處皆為透明.
3.最後將上層透明操作之後的圖片設定到下層圖片之上.
4.利用SoundPool實現觸控圖片時發出音效的效果. 感覺很贊呀!!
以上,請各位大俠們指點,點撥~~~
相關推薦
Android 下json處理字串處理
今天做android小應用程式 需要對json字串進行處理 由於後臺用的ssh框架,而且後臺json處理用的是json-lib的第三方jar包,感覺很好用,於是準備在Android下也用這個,結果發現報異常,以為是包沒
ANDROID 高效能圖形處理 之 二. OPENGL ES
在之前的介紹中我們說到在Android 4.2上使用RenderScript有諸多限制,我們於是嘗試改用OpenGL ES 2.0來實現濾鏡。本文不詳細介紹OpenGL ES的規範以及組成部分,感興趣的同學可以閱讀 《OpenGL -ES Programming
Android下的圖形處理
•Android系統下的圖片都是32位的點陣圖 •Android下載入圖片的大小是和圖片的解析度有關係的,因為每個畫素點都要被存入到記憶體,所以,往往我們看圖片只有1M多,但是放到手機上就會OOM異常 out of Memery Android圖片操作技
Android下新增新的自定義鍵值和按鍵處理流程
[cpp] view plain copy print? <span style="font-family:FangSong_GB2312;font-size:18px;">/* * Copyright (C) 2010 The Android Open So
android之webview無網路情況下簡單處理
android的webview是如何使用的網路上一搜索就是一大頁面的資料。通常我們通過webview來訪問web頁面都是在網路的情況下,一旦沒有網路就會顯示"無法找到該網頁"的資訊,這樣會暴露我們的連線,所以我們需要一個有好的提示,並且不會暴露連結的方法。這時候WebVie
android 應用在網路非常差的情況下的處理
app在無網路情況下非常好判斷,但是當網路很差,但是又有連結就不好辦了。使用的retrofit+rxJava,自定義了一個subscribe就可以很好的處理網路差的情況public class MySubscrible<T> extends Subscriber&
VTK圖形處理之剪下
剪下 與抽取輪廓類似,剪下(Cut)也是指獲取資料集中的部分資料。不過剪下是從一個完全不同的角度來處理的。剪下可以控制資料獲取的區域,而抽取輪廓做不到這一點。 剪下操作需要一把”刀“——隱函式,並且要指剪下的位置——剪下值。給定了這兩個引數後,就確定
android webview無網路情況下的處理
import com.yck.utils.diy.LoadingDialog; import com.yck.utils.net.HttpUrl; import com.yck.utils.tools.MyLog; import android.content.Dialo
淺談android中圖片處理之圖形變換特效Matrix(四)
今天,我們就來談下android中圖片的變形的特效,在上講部落格中我們談到android中圖片中的色彩特效來實現的。改變它的顏色主要通過ColorMatrix類來實現。 現在今天所講的圖片變形的特效主要就是通過Matrix類來實現,我們通過上篇部落格知道,改變色彩特效,主要
開源播放器 ijkplayer (六) :Android 下使用 ijkplayer 異常處理思路
videoplay 開源 下使用 ide 異常 異常處理 targe bsp 目前 一、 java.lang.IllegalStateException: mpjni: setOptionLong: null mp 根據已查到的資料看,目前是ijk內部的問題,只能通過tr
Android 下拉刷新上拉載入效果功能
使用方式 blank 新建 ann out hlist tar sha mstr 應用場景: 在App開發中,對於信息的獲取與演示。不可能所有將其獲取與演示。為了在用戶使用中,給予用戶以友好、方便的用戶體驗,以滑動、下拉的效果動態載入數據的要求就會出現。為此,該效果功能
【Android進階】(3)Android圖像處理
progress chang etc geo xtend static ogr arch 取出 1. 概念 色調/色相:物體傳遞的顏色 飽和度:顏色的純度,從0(灰)到100%(飽和)來進行描寫敘述 亮度/明度:顏色的相對明暗程度 2. 調整圖像小Demo 創建一個
巧婦能為少米之炊(1)——Android下小內存下的生存之道
直接內存 -a 響應時間 分區 popu 身邊 執行 人的 算法 常常聽到身邊用安卓的朋友抱怨手機卡頓,內存動不動就快沒了。而Google聲稱在512M的內存下也能流暢執行Android 4.4。究竟它做了什麽? 總結一下它主要做了四件事: 1.優化內核,使用Activ
Android圖像處理之Bitmap類
out creat 功能 create 選項 操作 upload true graph Bitmap是Android系統中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進行圖像剪切、旋轉、縮放等操作,並可以指定格式保存圖像文件。本文從應用的角度,著重介紹怎麽用Bitm
android ImageUtils 圖片處理工具類
copy pac float can turn getconf ble static ring /** * 加入文字到圖片。相似水印文字。 * @param gContext * @param gResId * @param gText * @re
【邊做項目邊學Android】異常處理:android.os.NetworkOnMainThreadException--多線程問題
不能 timeout throws extend dex com order trace res 一切搞定。以為高枕無憂了,結果還是有問題! log開始報錯了,獲取更新信息異常。。!debug一下。發現Exception:android.os.NetworkOnM
cocos2dx之WebView踩過的坑(android返回鍵處理問題)
lib mar 是否 12px blog tex clas ons 測試的 最近遊戲接入了一個私服平臺,由於沒有sdk,所以支付相關的操作需要在網頁端進行,也就是說點擊充值需要在遊戲內部彈出一個網頁,並定位到平臺充值的地址。查閱相關資料後決定使用cocos2dx自帶的W
Android下強制顯示ActionBar的overflowbutton
print trac acc onf als 永遠 能夠 16px tac 因為手機硬件情況的不同,在沒有物理Menu鍵的手機上。ActionBar的overflowbutton會有顯示不出來的情況,能夠通過反射的方式改動ViewConfiguration類中的sH
Android 消息處理源代碼分析(2)
urn msg illegal r.java roi fin 報錯 mes pri Android 消息處理源代碼分析(1)點擊打開鏈接 繼續接著分析剩下的類文件 Looper.java public final class Looper {
Android下apk安裝的過程,安卓項目的目錄結構
版本 自動 過程 apk drawable 分辨 jar 程序 軟件安裝 安卓下軟件安裝的過程: 1:拷貝XXX.apk到/data/app/XXX-1.apk 2.在/data/data目錄下創建一個文件夾 文件夾名稱 當前應用程序的包名. 安卓項目的目錄結構: