1. 程式人生 > >安卓類——PorterDuffXfermode影象合成類

安卓類——PorterDuffXfermode影象合成類

影象合成,是將兩幅退昂放在一起的動作,它使得我們能夠同時看到兩幅影象的特徵。

我們可以首先在Canvas物件上繪製一個位圖物件,然後再相同的Canvas物件上繪製第二個點陣圖物件的方式來實現合成。不過這裡在繪製第二幅影象的時候,需要在Paint物件上指定一個過渡模式(Xfermode)。

可用作過渡模式的類集合都繼承自Xfermode基類,而其中包括一個成為PorterDuffXfermode的類。PorterDuffXfermode因Thomas Porter和Tom Duff而得名,他們於1984年在ACM SIGGRAPH計算機圖形學出版物上發表了題為“Compositing digital images”(合成數字影象)的文章,詳細介紹了一系列不同的規則,用於彼此重疊的繪製圖像。

Android的PorterDuff.Mode類中列舉了他們制定的規則:

android.graphics.PorterDuff.Mode.SRC:只繪製源影象

android.graphics.PorterDuff.Mode.DST:只繪製目標影象

android.graphics.PorterDuff.Mode.DST_OVER:在源影象的頂部繪製目標影象

android.graphics.PorterDuff.Mode.DST_IN:只在源影象和目標影象相交的地方繪製目標影象

android.graphics.PorterDuff.Mode.DST_OUT:只在源影象和目標影象不相交的地方繪製目標影象

android.graphics.PorterDuff.Mode.DST_ATOP:在源影象和目標影象相交的地方繪製目標影象,在不相交的地方繪製源影象

android.graphics.PorterDuff.Mode.SRC_OVER:在目標影象的頂部繪製源影象

android.graphics.PorterDuff.Mode.SRC_IN:只在源影象和目標影象相交的地方繪製源影象

android.graphics.PorterDuff.Mode.SRC_OUT:只在源影象和目標影象不相交的地方繪製源影象

android.graphics.PorterDuff.Mode.SRC_ATOP

:在源影象和目標影象相交的地方繪製源影象,在不相交的地方繪製目標影象

android.graphics.PorterDuff.Mode.XOR:在源影象和目標影象重疊之外的任何地方繪製他們,而在不重疊的地方不繪製任何內容

android.graphics.PorterDuff.Mode.LIGHTEN:獲得每個位置上兩幅影象中最亮的畫素並顯示

android.graphics.PorterDuff.Mode.DARKEN:獲得每個位置上兩幅影象中最暗的畫素並顯示

android.graphics.PorterDuff.Mode.MULTIPLY:將每個位置的兩個畫素相乘,除以255,然後使用該值建立一個新的畫素進行顯示。結果顏色=頂部顏色*底部顏色/255

android.graphics.PorterDuff.Mode.SCREEN:反轉每個顏色,執行相同的操作(將他們相乘併除以255),然後再次反轉。結果顏色=255-(((255-頂部顏色)*(255-底部顏色))/255)

以下是使用的範例原始碼:

  1. publicclass MainActivity extends Activity implements OnClickListener  
  2. {  
  3.     staticfinalint PICKED_ONE = 0;  
  4.     staticfinalint PICKED_TWO = 1;  
  5.     boolean onePicked = false;  
  6.     boolean twoPicked = false;  
  7.     ImageView compositeImageView;  
  8.     Button choosePicture1, choosePicture2;  
  9.     Bitmap bmp1, bmp2;  
  10.     Canvas canvas;  
  11.     Paint paint;  
  12.     @Override
  13.     protectedvoid onCreate(Bundle savedInstanceState)  
  14.     {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         compositeImageView = (ImageView) findViewById(R.id.ChosenImageView);  
  18.         choosePicture1 = (Button) findViewById(R.id.ChoosePictureButton1);  
  19.         choosePicture2 = (Button) findViewById(R.id.ChoosePictureButton2);  
  20.         choosePicture1.setOnClickListener(this);  
  21.         choosePicture2.setOnClickListener(this);  
  22.     }  
  23.     @Override
  24.     publicvoid onClick(View v)  
  25.     {  
  26.         // TODO Auto-generated method stub
  27.         int which = -1;  
  28.         if (v == choosePicture1)  
  29.         {  
  30.             which = PICKED_ONE;  
  31.         } else
  32.         {  
  33.             which = PICKED_TWO;  
  34.         }  
  35.         Intent choosePictureIntent = new Intent(Intent.ACTION_PICK,  
  36.                 Media.EXTERNAL_CONTENT_URI);  
  37.         startActivityForResult(choosePictureIntent, which);  
  38.     }  
  39.     private Bitmap loadBitmap(Uri imageFileUri)  
  40.     {  
  41.         Display currentDisplay = getWindowManager().getDefaultDisplay();  
  42.         int dw = currentDisplay.getWidth();  
  43.         int dh = currentDisplay.getHeight();  
  44.         Bitmap returnBmp = Bitmap.createBitmap(dw, dh, Config.ARGB_4444);  
  45.         BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();  
  46.         bmpFactoryOptions.inJustDecodeBounds = true;  
  47.         try
  48.         {  
  49.             returnBmp = BitmapFactory.decodeStream(getContentResolver()  
  50.                     .openInputStream(imageFileUri), null, bmpFactoryOptions);  
  51.         } catch (FileNotFoundException e)  
  52.         {  
  53.             // TODO Auto-generated catch block
  54.             e.printStackTrace();  
  55.         }  
  56.         int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight  
  57.                 / (float) dh);  
  58.         int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth  
  59.                 / (float) dw);  
  60.         if (heightRatio > 1 && widthRatio > 1)  
  61.         {  
  62.             if (heightRatio > widthRatio)  
  63.             {  
  64.                 bmpFactoryOptions.inSampleSize = heightRatio;  
  65.             } else
  66.             {  
  67.                 bmpFactoryOptions.inSampleSize = widthRatio;  
  68.             }  
  69.         }  
  70.         bmpFactoryOptions.inJustDecodeBounds = false;  
  71.         try
  72.         {  
  73.             returnBmp = BitmapFactory.decodeStream(getContentResolver()  
  74.                     .openInputStream(imageFileUri), null, bmpFactoryOptions);  
  75.         } catch (FileNotFoundException e)  
  76.         {  
  77.             // TODO Auto-generated catch block
  78.             e.printStackTrace();  
  79.         }  
  80.         return returnBmp;  
  81.     }  
  82.     @Override
  83.     protectedvoid onActivityResult(int requestCode, int resultCode, Intent data)  
  84.     {  
  85.         // TODO Auto-generated method stub
  86.         super.onActivityResult(requestCode, resultCode, data);  
  87.         if (resultCode == RESULT_OK)  
  88.         {  
  89.             Uri imageFileUri = data.getData();  
  90.             if (requestCode == PICKED_ONE)  
  91.             {  
  92.                 bmp1 = loadBitmap(imageFileUri);  
  93.                 onePicked = true;  
  94.             } else
  95.             {  
  96.                 bmp2 = loadBitmap(imageFileUri);  
  97.                 twoPicked = true;  
  98.             }  
  99.             if (onePicked && twoPicked)  
  100.             {  
  101.                 Bitmap drawingBitmap = Bitmap.createBitmap(bmp1.getWidth(),  
  102.                         bmp1.getHeight(), bmp1.getConfig());  
  103.                 canvas = new Canvas(drawingBitmap);  
  104.                 paint = new Paint();  
  105.                 canvas.drawBitmap(bmp1, 00, paint);  
  106.                 paint.setXfermode(new PorterDuffXfermode(  
  107.                         android.graphics.PorterDuff.Mode.DARKEN));  
  108.                 canvas.drawBitmap(bmp2, 00, paint);  
  109.                 compositeImageView.setImageBitmap(drawingBitmap);  
  110.             }  
  111.         }  
  112.     }  
  113. }  


相關推薦

——PorterDuffXfermode影象合成類

影象合成,是將兩幅退昂放在一起的動作,它使得我們能夠同時看到兩幅影象的特徵。 我們可以首先在Canvas物件上繪製一個位圖物件,然後再相同的Canvas物件上繪製第二個點陣圖物件的方式來實現合成。不過這裡在繪製第二幅影象的時候,需要在Paint物件上指定一個過渡模式(Xfermode)。 可用作過渡模

9】SQLiteDatabase、ContentValues

election use cursor 數據類型 ssa 語言 size 基本 模式 SQLiteDatabase類     android.database.sqlite.SQLiteDatabase類的實例都代表了一個SQLite數據庫的操作,通過SQLiteDatab

9】SQLiteOpenHelper 、增刪改操作

and arc 插入 被調用 val etc left nts ces SQLiteOpenHelper 類 SQLiteOpenHelper類是Android提供的用於操作SQLite數據庫的工具類,該工具類能方便地創建數據庫、表,以及管理數據庫版本。          

vue中根據手機型判斷是、微信或IOS跳轉相應下載頁面

nload tor js代碼 roi agen 按鈕 path his cati 按鈕:<div class="download" @click="downApp">立即下載</div> 遮罩層:<div class="dark" v-show

關於專案中統計資料achartengine(包括餅狀圖,柱狀圖,折線圖等)的使用

       最近由於專案中需要統計資料,通過比較直觀的方式展示給使用者,所以就抽時間學習了一個統計圖的類庫achartengine,裡面包含統計中所需的餅狀圖,柱狀圖,折線圖等等,所以就拿出來給大家分享一下,希望大家相互學習,如有不足之處

常用控制元件——按鈕、影象檢視與影象按鈕

目錄   一、按鈕(Button): 二、圖象檢視(Image View)   2、在XML中的屬性:     3、ImageView的background和src屬性有什麼區別: 三、影象按鈕(ImageButton)

中用到的PreferencesUtils

public class PreferencesUtils { public static String PREFERENCE_NAME = "XXX"; public static boolean putString(Context context, String key,

專案實戰之好用的SharedPreferences工具封裝

SpUtils.java程式碼如下: public class SpUtils { /** * 儲存在手機裡面的檔名,在這裡要特別注意,因為在Android中已經確定了SharedPreferences是以xml形式儲存, * 所以,在填寫檔名引數時,不要

SharedPreferences 工具(支援物件存取)

一、快取輔助類 import android.content.Context; import android.content.SharedPreferences; import java.lang.reflect.InvocationTargetExcepti

修改protostuff-runtime原始碼排序實體欄位,解決和java伺服器序列化不一致

github 原始碼地址 https://github.com/brucelwl/protostuff-runtime-bruce-1.1.3.git Protobuf是Google開源的高效,跨平臺的序列化工具,而protostuff是一個基於protobuf實現的序列化工具, 它較於proto

AndroidUtilCode 1.22.7 釋出,工具

   AndroidUtilCode 1.22.7 已釋出,AndroidUtilCode 是一個強大易用的安卓工具類庫,它合理地封裝了安卓開發中常用的函式,具有完善的 Demo 和單元測試,利用其封裝好的 APIs 可以大大提高開發效率,如今它主要包括兩部分模組,其一是主工具

製作一個介面,可以進行密碼和賬號的判斷,有用來儲存輸入賬號和密碼的,用來在其他中呼叫

首先附上安卓介面圖和完整版下載地址: 下載地址:https://download.csdn.net/download/qq_39343904/10881646                   &nb

AndroidUtilCode 1.22.9 釋出,工具

   AndroidUtilCode 1.22.9 已釋出,AndroidUtilCode 是一個強大易用的安卓工具類庫,它合理地封裝了安卓開發中常用的函式,具有完善的 Demo 和單元測試,利用其封裝好的 APIs 可以大大提高開發效率,如今它主要包括兩部分模組,其一是主工具

so動態庫載入代理實現,可以實現C層的反射效果

一般來說如果我們需要載入so檔案,需要一個java對應層的類,即有一個類必須要是包名和類名是不變的。 比如說下面的c層程式碼,這樣寫就必須要求有個類是com.example.hellojni.HelloJni,呼叫的方法為stringFromJNI /* DO NOT

Bitmap影象格式轉為BGRA

最近在做opencv的一個專案,安卓人臉識別。 為了提高效率,完全拋棄javacv(opencv4android)的內容,完全使用jni開發,應用層做的工作只是把攝像頭獲取的影象資料傳到jni中,其餘人臉檢測、識別完全在jni中用opencv的c、c++介面開發完成。 那麼問題來了,安卓攝像

整理開發工具列表,有些確實的,就自己整理吧,ToastUtils

package com.zhy.utils; import android.content.Context; import android.widget.Toast; /** * Toast統一

開發工具---獲取手機IMSI,IMEI,IP地址

/** * Created by LZC on 2018/4/2. */ import android.content.Context; import android.provider.Settings; import android.telephony.Telephon

開發 做商城APP遇到的一些坑

一、安卓8.0以上,通知要做 通知渠道(NotificationChannel),不做的話收不到任何通知。 解決方案:要麼更改 targetSdkVersion 到26以下,要麼做通知渠道分類。搜一下安卓8.0通知適配,會有很多方案程式碼。 二、網路請求錯誤的提示:err

常用工具-StringUtils【String字串工具

判斷字串是否為空,專案中用的太多了。必須封裝起來!另外判斷集合是否為空用的也很多,這裡也放到一起~ package com.example.burro.demo.appframework.util;

--非同步處理工具(AsyncTask)

.xml程式碼如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schem