1. 程式人生 > >Android繪圖例項(Bitmmap,Canvas,Pain的使用)&動態的在圖片上新增文字(canvas.drawText)

Android繪圖例項(Bitmmap,Canvas,Pain的使用)&動態的在圖片上新增文字(canvas.drawText)

近些天學習影象處理,今天看見了一段程式碼中有Bitmap時,找了些Bitmap的資料,有查看了與之有關的繪圖類。

BitMap代表一張點陣圖,BitmapDrawable裡封裝的圖片就是一個Bitmap物件,開發者被一個Bitmap物件包裝成BitmapDrawable物件,可以呼叫BitmapDrawable的構造器。

//把一個Bitmap物件包裝成BitmapDrawable物件
BitmapDrawable drawable = newBitmapDrawable(bitmap);

如果需要獲取BitmapDrawable所包裝的Bitmap物件,則可呼叫BitmapDrawable的getBitmap()方法

//獲取一個BitmapDrawable所包裝的Bitmap物件
Bitmap bitmap = drawabel.getBitmap();

除此之外,Bitmap還提供一些靜態方法來建立新的Bitmap物件,列如如下常用方法。
createBitmap(Bitmap source, int x, int y, int width, int height);從源點陣圖source的指定座標(給定,x,y)開始,從中“挖取”寬width,高height的一塊出來,創新的Bitmap物件。


createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);對源點陣圖src進行縮放,縮放成寬dstWidth,高dstHeight的點陣圖。

createBitmap(int width, int height, Bitmap.Config config):建立一個寬width,高height的新點陣圖


createBitmap(Bitmap source, int x, int y, int width, int height, Matrizm m, boolean filter):從源點陣圖source的指定座標點(給定,x,y)開始,從中“挖取”寬width,高height的一塊出來,建立新的Bitmap物件。並按Matrix指定的規則進行轉化。

自己做了一個宇宙飛船的Demo:通過每次重新繪製圖片改變飛行背景,根據飛行高度判讀飛行區域,動態新增文字。

效果如:


程式碼:(沒有使用xml佈局)

import java.util.Timer;
import java.util.TimerTask;

import android.R.bool;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Toast;
/**
 * Matrix ,中文裡叫矩陣,高等數學裡有介紹,在影象處理方面,主要是用於平面的縮放、平移、旋轉等操作。 
 * Matrix的操作,總共分為四種:translate(X,Y)(平移到座標X,Y),
 * rotate(X)(旋轉X度),
 * scale(縮放)
 * skew(傾斜)
 * 每一種變換在Android的API裡都提供了set, post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點。 
 * set是直接設定Matrix的值,每次set一次,整個Matrix的陣列都會變掉。 
 * post是後乘,當前的矩陣乘以引數給出的矩陣。可以連續多次使用post,來完成所需的整個變換。
 * pre是前乘,引數給出的矩陣乘以當前的矩陣。所以操作是在當前矩陣的最前面發生的。
 * 座標中心一半是左上角
 * */
public class MoveBack extends Activity {
	/**
	 * DisplayMetrics metrics=getWindowManager().getDefaultDisplay().getMetrics(metrics);
	 * metrics.widthPixels           螢幕寬
	 * metrics.heightPixels          螢幕高
	 * metrics.density               螢幕密度
	 * */
	DisplayMetrics dm;
	private int screenWidth;
	private int screenHight;
	private String text = "宇宙旅行";
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		screenHight = dm.heightPixels;
		screenWidth = dm.widthPixels;
		setContentView(new MyView(this));
	}
	//自定義檢視
	class MyView extends View {
		// 記錄背景點陣圖的實際高度
		int BACK_HEIGHT = 1186;
		// 背景圖片
		private Bitmap back;
		private Bitmap plane;
		// 背景圖片的開始位置
		int WIDTH;
		int HEIGHT;
		//飛機的位置
		int fWIDTH;
		int fHEIGHT;
		private int startY;
		public MyView(Context context) {
			super(context);
			back = BitmapFactory.decodeResource(context.getResources(),
					R.drawable.back2);
			plane = BitmapFactory.decodeResource(context.getResources(),
					R.drawable.plane);
			System.out.println(String.valueOf(back.getHeight()) + "TO"
					+ String.valueOf(back.getWidth()));
			System.out.println(screenHight + "TO" + screenWidth);
			BACK_HEIGHT = back.getHeight();
			//將圖片的大小設定成和螢幕大小一樣的
			WIDTH = dm.widthPixels;
			HEIGHT = dm.heightPixels;
			fHEIGHT = plane.getHeight();
			fWIDTH = plane.getWidth();
			startY = BACK_HEIGHT - HEIGHT;
			System.out.println(startY);
			final Handler handler = new Handler() {
				public void handleMessage(Message msg) {
					if (msg.what == 0x123) {
						// 重新開始移動
						fly(startY, BACK_HEIGHT);
						//判斷StartY是否在onDraw時大於0
						if (startY <= 2) {
							startY = BACK_HEIGHT - HEIGHT;
						} else {
							//使用者控制飛行速度
							startY -= 3;
						}
					}
					invalidate();
				}
			};
			new Timer().schedule(new TimerTask() {
				@Override
				public void run() {
					handler.sendEmptyMessage(0x123);
				}

			}, 0, 100);
			invalidate();
		}
		@Override
		public void onDraw(Canvas canvas) {
			//根據原始點陣圖和Matrix建立新圖片
			Bitmap bitmap2 = Bitmap
					.createBitmap(back, 0, startY, WIDTH, HEIGHT);
			Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
			paint.setTextSize(30);
			paint.setStrokeWidth(2);
			paint.setColor(Color.CYAN);
			//繪製宇宙背景
			canvas.drawBitmap(bitmap2, 0, 0, null);
			//繪製飛船
			canvas.drawBitmap(plane, (float) (WIDTH - fWIDTH) / 2f,
					(float) (HEIGHT - fHEIGHT - 50), null);
			//在圖片上動態的新增文字
			canvas.drawText(text, dm.widthPixels/2-text.length()*30/2, dm.heightPixels/2, paint);
		}
	}
	/**
	 * @param n當前位置
	 * @param l宇宙長短
	 * @return 判斷出飛船進入那個星系
	 * */
	public void fly(int n, int l){
		switch (n/(l/5)) {
		case 0:
			text = "進入仙女座";
			break;
		case 1:
			text = "進入射手座";
			break;
		case 2:
			text = "進入天蠍座";
			break;
		case 3:
			text = "進入人馬座";
			break;
		case 4:
			text = "進入銀河系";
			break;
		default:
			break;
		}
	}
}


相關推薦

Android繪圖例項(Bitmmap,Canvas,Pain的使用)&動態的在圖片新增文字(canvas.drawText)

近些天學習影象處理,今天看見了一段程式碼中有Bitmap時,找了些Bitmap的資料,有查看了與之有關的繪圖類。 BitMap代表一張點陣圖,BitmapDrawable裡封裝的圖片就是一個Bitmap物件,開發者被一個Bitmap物件包裝成BitmapDrawable物

利用python pil 實現給圖片新增文字

最近的一個工程專案是講文字新增到影象上。 使用了opencv,結果發現利用opencv給影象新增文字有侷限。 (1)可利用的字型型別比較少,需要安裝Freetype擴充套件,比較複雜。 (2)不能用putText函式輸出中文,否則就會出現亂碼的情況 只好選擇使用pytho

iOS開發 在圖片新增文字圖片合成文字圖片新增文字,美圖秀秀,美顏相機文字編輯

+ (UIImage *)imageWithText:(NSString *)text textFont:(NSInteger)fontSize textColor:(UIColor *)textColor

圖片畫熱區/canvas繪圖,相互不覆蓋

 思路: 1.canvas儲存路徑,顯示頁面用圖片熱區<map>顯示 2.不相互覆蓋:這個問題想了好久,一直找操作canvas的方法。今天忽然開竅,還是利用圖片熱區。         本來是在canvas的點選事件上獲取點的位

android之使用GridView+仿微信圖片傳功能(附源代碼)

相冊 ada nbu [] for round pen fromfile idt   由於工作要求最近在使用GridView完成圖片的批量上傳功能,我的例子當中包含仿微信圖片上傳、拍照、本地選擇、相片裁剪等功能,如果有需要的朋友可以看一下,希望我的實際經驗能對您有所幫助。

例項叢集部署下的圖片傳和訪問

場景 存在多個無狀態的Web應用服務,支援多例項叢集化部署(使用nginx作為反向代理) 在Web應用中存在圖片檔案上傳功能 不能將圖片檔案直接儲存到資料庫中,資料庫中只儲存檔案訪問連結 問題 因為Web應用服務是多例項叢集化部署的,因此上傳圖片之後不能簡單儲存到本地,否則其他例

Android使用Retrofit技術仿微信圖片傳,可以選擇多張圖片拍照

Android 仿照微信發說說,既能實現拍照,選相簿,多圖案上傳 使用Retrofit技術。 使用方法:詳見部落格 專案的執行效果: 伺服器端接收檔案的action UploadFile.java @Controller p

Android利用Gradle多渠道打包如何動態替換資源,文字

動態替換APP logo 首先我們在app的build.gradle下面加入如下程式碼,以oem1為示例, productFlavors { oem1 { manifestPlaceholders = [

android 呼叫系統相機拍照後圖片顯示文字

 先說說自己的思路(有什麼欠缺的望噴。。。)    1、在xml 檔案寫入Imageview(用來顯示拍照圖片) 和textview (顯示想要顯示的文字)  2、將xml 佈局通過   LayoutInflater.from(context).inflate轉換為view檢

以申購單為例項,講解Jquery動態刪減行,新增新增滑鼠事件,子視窗與父視窗傳值,自動計算金額,及輸入值的驗證,前臺資料批量提交到後臺action

最近在為公司做一個小型ERP,其中有一個申購模組,公司需求大概:新建申購單,新建時新增要申購的物料資訊。輸入每樣物料的申購數量,預計價格,前臺自動計算總價。 設計需求大概:申購單應可以動態增減物料資訊。每條物料資訊應驗證不可重複。大概就是這些。本人剛剛畢業,參考網上資料後,

Android中通過Exif-ExifInterface獲取圖片的相關資訊,並且在圖片新增獲取到的資訊將圖片展示出來

1、Exif-ExifInterface簡介 Exif是一種影象檔案格式,它的資料儲存與JPEG格式是完全相同的。實際上Exif格式就是在JPEG格式頭部插入了數碼照片的資訊,包括拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等各種和拍攝條件以及相機品牌、

鼠標經過圖片圖片出現文字,鼠標移出時隱藏(通俗版) -《狗嗨默示錄》-

his -h fun con 出現 type ava style size <script type="text/javascript"> $(".news_con_col").mouseover(function(){ $(this).find(".bg-

如何快速識別提取圖片文字

14. 找到 如果 ima 全部 情況 技術 智能 相冊 我們在日常工作中,我們經常會遇到將圖片上文字轉換成Word文檔這樣的情況,要知道, 圖片上的文字是不能直接復制的,這是一件令人頭疼的一件事情。那麽要怎樣才能快速的 提取這些圖片的文字呢? 快速識別提取圖片上的的文

java呼叫百度AI識別圖片文字功能

1、登入百度AI開放平臺     網站連結:http://ai.baidu.com/     新手接入指南:http://ai.baidu.com/docs#/Begin/top   &n

thinkphp 利用GD庫在圖片文字

<?php /** * Created by PhpStorm. * User: Administrator */ namespace Home\Event; use \Think\Image; use \Think\Upload; class ImgEvent { privat

圖片文字轉換成word文字

轉換後的文字不是很如意,但是免費方便。   1、開啟Office辦公軟體自帶的OneNote工具。隨便新建一個筆記頁面,以方便我們接下來的操作。             2、插入圖片。在選單欄裡點選【插入】,選擇插入【圖片】,找到我們需要轉換的圖片,插入。   

Python 給圖片文字

import PIL from PIL import ImageFont import PIL from PIL import ImageFont from PIL import Image from PIL import ImageDraw #設定字型,如果

OCR文字識別工具,輕鬆幫你識別圖片文字

目前手機上OCR圖片文識別的軟體有很多,拍照識別提取圖片上的文字,翻 譯識別出來的結果,很方便。 但是,如果你的手機上沒有安裝類似的軟體,這個時候該怎麼辦呢?其實只 要你的手機上有一個微信就可以,一個小程式就能幫你輕鬆搞定這些問題。 開啟小程式 首先開啟手機微信

萬彩影像大師教程 | 為圖片視訊新增文字描述1

俗話說“紅花雖好, 尚需綠葉扶持”, 一個精彩的照片視訊正如一朵紅花,但若缺乏生動的文字描述作為映襯,這個視訊至少是不完整的。 換言之,配上共情的文字描述,來引起觀眾的同理心,才能將圖片和視訊的資訊傳達到極致。 使用萬彩影像大師,為你的照片視訊新增文字描述,從一個視訊開始, 講述你的動人故事

萬彩影像大師教程 | 為圖片視訊新增文字描述2

俗話說“紅花雖好, 尚需綠葉扶持”, 一個精彩的照片視訊正如一朵紅花,但若缺乏生動的文字描述作為映襯,這個視訊至少是不完整的。 換言之,配上共情的文字描述,來引起觀眾的同理心,才能將圖片和視訊的資訊傳達到極致。 使用萬彩影像大師,為你的照片視訊新增文字描述,從一個視訊開始, 講述你的動人故事