圖片大小
- 圖片在計(jì)算機(jī)中的大小
- 圖片的總大小 = 圖片的總像素 * 每個像素占用的大小
位圖
bmp格式的圖片是無損壓縮,嚴(yán)格按照算法來計(jì)算圖片大??;jpg格式的圖片是有損壓縮。
2016/9/19 18:24:20
- 單色位圖:只能表示2種顏色
- 使用兩個數(shù)字:0和1
- 使用一個長度為1的二進(jìn)制數(shù)字就可以表示了
- 每個像素占用1/8個字節(jié)
- 16色位圖:能表示16種顏色
- 需要16個數(shù)字:0-15,0000 - 1111
- 使用一個長度為4的二進(jìn)制數(shù)組就可以表示了
- 每個像素占用1/2個字節(jié)
- 256色位圖:能表示256種顏色
- 需要256個數(shù)字:0 - 255,0000 0000 - 1111 1111
- 使用一個長度為8的二進(jìn)制數(shù)字
- 每個像素占用1個字節(jié)
- 24位位圖:
- 每個像素占用24位,也就是3個字節(jié),所在叫24位位圖
- R:0-255,需要一個長度為8的二進(jìn)制數(shù)字,占用1個字節(jié)
- G:0-255,需要一個長度為8的二進(jìn)制數(shù)字,占用1個字節(jié)
- B:0-255,需要一個長度為8的二進(jìn)制數(shù)字,占用1個字節(jié)
對圖片進(jìn)行縮放
-
獲取屏幕寬高
Display dp = getWindowManager().getDefaultDisplay(); int screenWidth = dp.getWidth(); int screenHeight = dp.getHeight(); -
獲取圖片寬高
Options opts = new Options(); //請求圖片屬性但不申請內(nèi)存 opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/dog.jpg", opts); int imageWidth = opts.outWidth; int imageHeight = opts.outHeight; -
圖片的寬高除以屏幕寬高,算出寬和高的縮放比例,取較大值作為圖片的縮放比例
int scale = 1; int scaleX = imageWidth / screenWidth; int scaleY = imageHeight / screenHeight; if(scaleX >= scaleY && scaleX > 1){ scale = scaleX; } else if(scaleY > scaleX && scaleY > 1){ scale = scaleY; } -
按縮放比例加載圖片
//設(shè)置縮放比例 opts.inSampleSize = scale; //為圖片申請內(nèi)存 opts.inJustDecodeBounds = false; Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/dog.jpg", opts); iv.setImageBitmap(bm);
在內(nèi)存中創(chuàng)建圖片的副本
直接加載的bitmap對象是只讀的,無法修改,要修改圖片只能在內(nèi)存中創(chuàng)建出一個一模一樣的bitmap副本,然后修改副本
-
加載原圖
Bitmap bmSrc = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/jietu.jpg"); -
在內(nèi)存中創(chuàng)建一個與原圖一模一樣大小的bitmap對象<一張白紙>(可讀可寫)
Bitmap bitmap = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig()); -
創(chuàng)建畫筆對象
Paint paint = new Paint(); -
創(chuàng)建畫板對象,將白紙鋪在畫板上
Canvas canvas = new Canvas(bitmap); -
開始作畫,把原圖的內(nèi)容繪制在白紙上
canvas.drawBitmap(bmSrc, new Matrix(), paint);
簡單繪圖
-
繪圖需要用到觸摸偵聽事件,需要給畫畫板設(shè)置觸摸偵聽事件
/*給畫畫板設(shè)置觸摸偵聽事件*/ imageView.setOnTouchListener(new OnTouchListener() { /*觸摸事件產(chǎn)生時(shí),此方法調(diào)用*/ @Override public boolean onTouch(View v, MotionEvent event) { /*拿到觸摸屏幕對象現(xiàn)在所處的狀態(tài)*/ int action = event.getAction(); switch (action) { /*用戶手指觸摸到屏幕*/ case MotionEvent.ACTION_DOWN: Log.d("MainActivity", "觸摸屏幕"); break; /*用戶手指正在滑動,此方法會被不斷調(diào)用*/ case MotionEvent.ACTION_MOVE: Log.d("MainActivity", "滑動屏幕" + x + " " + y); break; /*用戶手指離開屏幕,此方法調(diào)用*/ case MotionEvent.ACTION_UP: Log.d("MainActivity", "離開屏幕"); break; } /*此處返回true表示用戶手動處理事件*/ return true; } }); -
畫筆對象改變線條粗細(xì)
paint.setStrokeWidth(float width); -
畫筆對象改變線條顏色
paint.setColor(int color); -
保存畫畫板圖像,通過
Bitmap對象的方法來實(shí)現(xiàn)保存功能/* * format:保存的格式 * quality:保存質(zhì)量,(0-100. 0)數(shù)字越大質(zhì)量越高 * stream:輸出流 * compress(CompressFormat format, int quality, OutputStream stream) */ bitmap.compress(CompressFormat.PNG, 100, stream); -
從圖庫中立即查看到保存的圖片
直接將圖片保存,接著打開圖庫是不能看到圖片信息的。系統(tǒng)每次收到SD卡就緒廣播時(shí),都會去遍歷sd卡的所有文件和文件夾,把遍歷到的所有多媒體文件都在MediaStore數(shù)據(jù)庫保存一個索引,這個索引包含多媒體文件的文件名、路徑、大小。圖庫每次打開時(shí),并不會去遍歷sd卡獲取圖片,而是通過內(nèi)容提供者從MediaStore數(shù)據(jù)庫中獲取圖片的信息,然后讀取該圖片。故我們將圖片保存起來以后,需要手動發(fā)送一條SD卡就緒廣播,這樣MediaStore數(shù)據(jù)庫中就添加進(jìn)所保存圖片的索引。Intent intent = new Intent(); intent.setAction(Intent.ACTION_MEDIA_MOUNTED); /*設(shè)置data屬性*/ intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); /*發(fā)送廣播*/ sendBroadcast(intent);