版權聲明:本文為HaiyuKing原創文章,轉載請注明出處!
前言
用於縮放bitmap以及將bitmap保存成圖片到SD卡中
效果圖
代碼分析
bitmapZoomByHeight(Bitmap srcBitmap, float newHeight): 根據指定的高度進行縮放(src是bitmap)
bitmapZoomByHeight(Drawable drawable, float newHeight) :根據指定的高度進行縮放(src是drawable)
bitmapZoomByScale(Bitmap srcBitmap, float scaleWidth, float scaleHeight): 根據指定的寬度比例值和高度比例值進行縮放
drawableToBitmap(Drawable drawable) :將drawable對象轉成bitmap對象
drawableToBitmap2(Drawable drawable) :將drawable對象轉成bitmap對象
saveBitmapToSDCard(Bitmap bitmap, String path): 將bitmap對象保存成圖片到sd卡中
getBitmapFromSDCard(String path) :從sd卡中去除圖片的bitmap對象
使用步驟
一、項目組織結構圖
注意事項:
1、 導入類文件后需要change包名以及重新import R文件路徑
2、 Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制里面的內容,不要整個覆蓋
二、導入步驟
將BitmapUtil復制到項目中
package com.why.project.bitmaputildemo.utils; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; /** * Created by HaiyuKing * Used */ public class BitmapUtil { public static Bitmap temp; /**根據指定的高度進行縮放(source是bitmap)*/ public static Bitmap bitmapZoomByHeight(Bitmap srcBitmap, float newHeight) { float scale = newHeight / (((float)srcBitmap.getHeight())); return BitmapUtil.bitmapZoomByScale(srcBitmap, scale, scale); } /**根據指定的高度進行縮放(source是drawable)*/ public static Bitmap bitmapZoomByHeight(Drawable drawable, float newHeight) { Bitmap bitmap = BitmapUtil.drawableToBitmap(drawable); float scale = newHeight / (((float)bitmap.getHeight())); return BitmapUtil.bitmapZoomByScale(bitmap, scale, scale); } /**根據指定的寬度比例值和高度比例值進行縮放*/ public static Bitmap bitmapZoomByScale(Bitmap srcBitmap, float scaleWidth, float scaleHeight) { int width = srcBitmap.getWidth(); int height = srcBitmap.getHeight(); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(srcBitmap, 0, 0, width, height, matrix, true); if(bitmap != null) { return bitmap; }else { return srcBitmap; } } /**將drawable對象轉成bitmap對象*/ public static Bitmap drawableToBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; Bitmap bitmap = Bitmap.createBitmap(width, height, config); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, width, height); drawable.draw(canvas); return bitmap; } /**將drawable對象轉成bitmap對象*/ public static Bitmap drawableToBitmap2(Drawable drawable) { BitmapDrawable bd = (BitmapDrawable) drawable; Bitmap bm= bd.getBitmap(); return bm; } /**將bitmap對象保存成圖片到sd卡中*/ public static void saveBitmapToSDCard(Bitmap bitmap, String path) { File file = new File(path); if(file.exists()) { file.delete(); } try { FileOutputStream fileOutputStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, ((OutputStream)fileOutputStream));//設置PNG的話,透明區域不會變成黑色 fileOutputStream.close(); System.out.println("----------save success-------------------"); } catch(Exception v0) { v0.printStackTrace(); } } /**從sd卡中獲取圖片的bitmap對象*/ public static Bitmap getBitmapFromSDCard(String path) { Bitmap bitmap = null; try { FileInputStream fileInputStream = new FileInputStream(path); if(fileInputStream != null) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; //當圖片資源太大的適合,會出現內存溢出。圖片寬高都為原來的二分之一,即圖片為原來的四分一 bitmap = BitmapFactory.decodeStream(((InputStream) fileInputStream), null, options); } } catch(Exception e) { return null; } return bitmap; } }
在AndroidMainfest.xml文件中聲明權限
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.why.project.bitmaputildemo"> <!-- =================BitmapUtil用到的權限========================== --> <!-- 允許程序讀取外部存儲文件 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!-- 允許程序寫入外部存儲,如SD卡上寫文件 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
添加運行時權限的處理(本demo中采用的是修改targetSDKVersion=22)
三、使用方法
本Demo搭配《AppDir【創建緩存目錄】》使用
package com.why.project.bitmaputildemo; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import com.why.project.bitmaputildemo.utils.AppDir; import com.why.project.bitmaputildemo.utils.BitmapUtil; import java.io.File; public class MainActivity extends AppCompatActivity { private ImageView img_source; private ImageView img_scale1; private ImageView img_scale2; private Button btn_save; private Button btn_show; private ImageView img_show; private String pngFilePath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); initDatas(); initEvents(); } private void initViews() { img_source = (ImageView) findViewById(R.id.img_source); img_scale1 = (ImageView) findViewById(R.id.img_scale1); img_scale2 = (ImageView) findViewById(R.id.img_scale2); btn_save = (Button) findViewById(R.id.btn_save); btn_show = (Button) findViewById(R.id.btn_show); img_show = (ImageView) findViewById(R.id.img_show); } private void initDatas() { img_source.setImageResource(R.mipmap.ic_launcher); Bitmap sourceBitmap = BitmapUtil.drawableToBitmap(getResources().getDrawable(R.mipmap.ic_launcher)); Bitmap sacleBitmap1 = BitmapUtil.bitmapZoomByHeight(sourceBitmap,200); img_scale1.setImageBitmap(sacleBitmap1); Bitmap sacleBitmap2 = BitmapUtil.bitmapZoomByScale(sourceBitmap,2,1); img_scale2.setImageBitmap(sacleBitmap2); } private void initEvents() { btn_save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { pngFilePath = AppDir.getInstance(MainActivity.this).IMAGE + File.separator + System.currentTimeMillis() + ".png"; Bitmap sourceBitmap = BitmapUtil.drawableToBitmap(getResources().getDrawable(R.mipmap.ic_launcher)); BitmapUtil.saveBitmapToSDCard(sourceBitmap,pngFilePath); } }); btn_show.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String pngPath = pngFilePath; Bitmap pngBitmap = BitmapUtil.getBitmapFromSDCard(pngPath); img_show.setImageBitmap(pngBitmap); } }); } }
混淆配置
無
參考資料
Android常用的Drawable和Bitmap之間的轉化方法