安卓類——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)
以下是使用的範例原始碼:
- publicclass MainActivity extends Activity implements OnClickListener
- {
- staticfinalint PICKED_ONE = 0;
- staticfinalint PICKED_TWO = 1;
- boolean onePicked = false;
- boolean twoPicked = false;
- ImageView compositeImageView;
- Button choosePicture1, choosePicture2;
- Bitmap bmp1, bmp2;
- Canvas canvas;
- Paint paint;
- @Override
- protectedvoid onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- compositeImageView = (ImageView) findViewById(R.id.ChosenImageView);
- choosePicture1 = (Button) findViewById(R.id.ChoosePictureButton1);
- choosePicture2 = (Button) findViewById(R.id.ChoosePictureButton2);
- choosePicture1.setOnClickListener(this);
- choosePicture2.setOnClickListener(this);
- }
- @Override
- publicvoid onClick(View v)
- {
- // TODO Auto-generated method stub
- int which = -1;
- if (v == choosePicture1)
- {
- which = PICKED_ONE;
- } else
- {
- which = PICKED_TWO;
- }
- Intent choosePictureIntent = new Intent(Intent.ACTION_PICK,
- Media.EXTERNAL_CONTENT_URI);
- startActivityForResult(choosePictureIntent, which);
- }
- private Bitmap loadBitmap(Uri imageFileUri)
- {
- Display currentDisplay = getWindowManager().getDefaultDisplay();
- int dw = currentDisplay.getWidth();
- int dh = currentDisplay.getHeight();
- Bitmap returnBmp = Bitmap.createBitmap(dw, dh, Config.ARGB_4444);
- BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
- bmpFactoryOptions.inJustDecodeBounds = true;
- try
- {
- returnBmp = BitmapFactory.decodeStream(getContentResolver()
- .openInputStream(imageFileUri), null, bmpFactoryOptions);
- } catch (FileNotFoundException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight
- / (float) dh);
- int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth
- / (float) dw);
- if (heightRatio > 1 && widthRatio > 1)
- {
- if (heightRatio > widthRatio)
- {
- bmpFactoryOptions.inSampleSize = heightRatio;
- } else
- {
- bmpFactoryOptions.inSampleSize = widthRatio;
- }
- }
- bmpFactoryOptions.inJustDecodeBounds = false;
- try
- {
- returnBmp = BitmapFactory.decodeStream(getContentResolver()
- .openInputStream(imageFileUri), null, bmpFactoryOptions);
- } catch (FileNotFoundException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return returnBmp;
- }
- @Override
- protectedvoid onActivityResult(int requestCode, int resultCode, Intent data)
- {
- // TODO Auto-generated method stub
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == RESULT_OK)
- {
- Uri imageFileUri = data.getData();
- if (requestCode == PICKED_ONE)
- {
- bmp1 = loadBitmap(imageFileUri);
- onePicked = true;
- } else
- {
- bmp2 = loadBitmap(imageFileUri);
- twoPicked = true;
- }
- if (onePicked && twoPicked)
- {
- Bitmap drawingBitmap = Bitmap.createBitmap(bmp1.getWidth(),
- bmp1.getHeight(), bmp1.getConfig());
- canvas = new Canvas(drawingBitmap);
- paint = new Paint();
- canvas.drawBitmap(bmp1, 0, 0, paint);
- paint.setXfermode(new PorterDuffXfermode(
- android.graphics.PorterDuff.Mode.DARKEN));
- canvas.drawBitmap(bmp2, 0, 0, paint);
- compositeImageView.setImageBitmap(drawingBitmap);
- }
- }
- }
- }
相關推薦
安卓類——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