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