1. 程式人生 > >Android下的圖形處理

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對上面一張圖片進行操作,接觸到的點全部變為透明,最終顯示效果你懂得!!

<案例實現:美女撕衣服>

  • 首先看看實現的效果(請保持平和的心態):

showResult
projectDir

  • 具體程式碼:

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 {

Androidapk安裝的過程,安卓項目的目錄結構

版本 自動 過程 apk drawable 分辨 jar 程序 軟件安裝 安卓下軟件安裝的過程: 1:拷貝XXX.apk到/data/app/XXX-1.apk 2.在/data/data目錄下創建一個文件夾 文件夾名稱 當前應用程序的包名. 安卓項目的目錄結構: