圖片大小
- 圖片在計(jì)算機(jī)中的大小
- 圖片的總大小 = 圖片的總像素 * 每個(gè)像素占用的大小
位圖
bmp格式的圖片是無(wú)損壓縮,嚴(yán)格按照算法來(lái)計(jì)算圖片大欣;jpg格式的圖片是有損壓縮。
2016/9/19 18:24:20
- 單色位圖:只能表示2種顏色
- 使用兩個(gè)數(shù)字:0和1
- 使用一個(gè)長(zhǎng)度為1的二進(jìn)制數(shù)字就可以表示了
- 每個(gè)像素占用1/8個(gè)字節(jié)
- 16色位圖:能表示16種顏色
- 需要16個(gè)數(shù)字:0-15鬓梅,0000 - 1111
- 使用一個(gè)長(zhǎng)度為4的二進(jìn)制數(shù)組就可以表示了
- 每個(gè)像素占用1/2個(gè)字節(jié)
- 256色位圖:能表示256種顏色
- 需要256個(gè)數(shù)字:0 - 255,0000 0000 - 1111 1111
- 使用一個(gè)長(zhǎng)度為8的二進(jìn)制數(shù)字
- 每個(gè)像素占用1個(gè)字節(jié)
- 24位位圖:
- 每個(gè)像素占用24位,也就是3個(gè)字節(jié)谨湘,所在叫24位位圖
- R:0-255,需要一個(gè)長(zhǎng)度為8的二進(jìn)制數(shù)字己肮,占用1個(gè)字節(jié)
- G:0-255,需要一個(gè)長(zhǎng)度為8的二進(jìn)制數(shù)字,占用1個(gè)字節(jié)
- B:0-255,需要一個(gè)長(zhǎng)度為8的二進(jìn)制數(shù)字悲关,占用1個(gè)字節(jié)
對(duì)圖片進(jìn)行縮放
-
獲取屏幕寬高
Display dp = getWindowManager().getDefaultDisplay(); int screenWidth = dp.getWidth(); int screenHeight = dp.getHeight();
-
獲取圖片寬高
Options opts = new Options(); //請(qǐng)求圖片屬性但不申請(qǐng)內(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; //為圖片申請(qǐng)內(nèi)存 opts.inJustDecodeBounds = false; Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/dog.jpg", opts); iv.setImageBitmap(bm);
在內(nèi)存中創(chuàng)建圖片的副本
直接加載的bitmap對(duì)象是只讀的寓辱,無(wú)法修改艘绍,要修改圖片只能在內(nèi)存中創(chuàng)建出一個(gè)一模一樣的bitmap副本,然后修改副本
-
加載原圖
Bitmap bmSrc = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/jietu.jpg");
-
在內(nèi)存中創(chuàng)建一個(gè)與原圖一模一樣大小的bitmap對(duì)象<一張白紙>(可讀可寫)
Bitmap bitmap = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
-
創(chuàng)建畫筆對(duì)象
Paint paint = new Paint();
-
創(chuàng)建畫板對(duì)象秫筏,將白紙鋪在畫板上
Canvas canvas = new Canvas(bitmap);
-
開始作畫诱鞠,把原圖的內(nèi)容繪制在白紙上
canvas.drawBitmap(bmSrc, new Matrix(), paint);
簡(jiǎn)單繪圖
-
繪圖需要用到觸摸偵聽事件,需要給畫畫板設(shè)置觸摸偵聽事件
/*給畫畫板設(shè)置觸摸偵聽事件*/ imageView.setOnTouchListener(new OnTouchListener() { /*觸摸事件產(chǎn)生時(shí)这敬,此方法調(diào)用*/ @Override public boolean onTouch(View v, MotionEvent event) { /*拿到觸摸屏幕對(duì)象現(xiàn)在所處的狀態(tài)*/ int action = event.getAction(); switch (action) { /*用戶手指觸摸到屏幕*/ case MotionEvent.ACTION_DOWN: Log.d("MainActivity", "觸摸屏幕"); break; /*用戶手指正在滑動(dòng)航夺,此方法會(huì)被不斷調(diào)用*/ case MotionEvent.ACTION_MOVE: Log.d("MainActivity", "滑動(dòng)屏幕" + x + " " + y); break; /*用戶手指離開屏幕,此方法調(diào)用*/ case MotionEvent.ACTION_UP: Log.d("MainActivity", "離開屏幕"); break; } /*此處返回true表示用戶手動(dòng)處理事件*/ return true; } });
-
畫筆對(duì)象改變線條粗細(xì)
paint.setStrokeWidth(float width);
-
畫筆對(duì)象改變線條顏色
paint.setColor(int color);
-
保存畫畫板圖像崔涂,通過(guò)
Bitmap
對(duì)象的方法來(lái)實(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);
-
從圖庫(kù)中立即查看到保存的圖片
直接將圖片保存,接著打開圖庫(kù)是不能看到圖片信息的冷蚂。系統(tǒng)每次收到SD卡就緒廣播時(shí)缭保,都會(huì)去遍歷sd卡的所有文件和文件夾懂牧,把遍歷到的所有多媒體文件都在MediaStore數(shù)據(jù)庫(kù)保存一個(gè)索引蓖宦,這個(gè)索引包含多媒體文件的文件名、路徑伍纫、大小隆夯。圖庫(kù)每次打開時(shí)钳恕,并不會(huì)去遍歷sd卡獲取圖片,而是通過(guò)內(nèi)容提供者從MediaStore數(shù)據(jù)庫(kù)中獲取圖片的信息蹄衷,然后讀取該圖片忧额。故我們將圖片保存起來(lái)以后,需要手動(dòng)發(fā)送一條SD卡就緒廣播宦芦,這樣MediaStore數(shù)據(jù)庫(kù)中就添加進(jìn)所保存圖片的索引宙址。Intent intent = new Intent(); intent.setAction(Intent.ACTION_MEDIA_MOUNTED); /*設(shè)置data屬性*/ intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); /*發(fā)送廣播*/ sendBroadcast(intent);