Bitmap擷取中間正方形並取出圓形圖片
自定義View繼承ImageView
/**
* Created by softpo on 2016/10/29.
*/
public class CircleImageView extends ImageView {
private Bitmap mBitmap;
public CircleImageView(Context context) {
this(context,null);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//得到影像
mBitmap = ((BitmapDrawable) getDrawable()).getBitmap();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
Bitmap bitmap = centerSquareScaleBitmap(mBitmap,100);
canvas.drawBitmap(bitmap,100,100,null);
}
/**
* 將給定圖片維持寬高比縮放後,擷取正中間的正方形部分。
*
* @param bitmap 原圖
* @param edgeLength 希望得到的正方形部分的邊長
* @return 縮放擷取正中部分後的點陣圖。
*/
public static Bitmap centerSquareScaleBitmap(Bitmap bitmap, int edgeLength) {
if (null == bitmap || edgeLength <= 0) {
return null;
}
Bitmap result = bitmap;
int widthOrg = bitmap.getWidth();
int heightOrg = bitmap.getHeight();
if (widthOrg >= edgeLength && heightOrg >= edgeLength) {
//壓縮到一個最小長度是edgeLength的bitmap
int longerEdge = (int) (edgeLength * Math.max(widthOrg, heightOrg) / Math.min(widthOrg, heightOrg));
int scaledWidth = widthOrg > heightOrg ? longerEdge : edgeLength;
int scaledHeight = widthOrg > heightOrg ? edgeLength : longerEdge;
Bitmap scaledBitmap;
try {
scaledBitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth, scaledHeight, true);
} catch (Exception e) {
return null;
}
//從圖中擷取正中間的正方形部分。
int xTopLeft = (scaledWidth - edgeLength) / 2;
int yTopLeft = (scaledHeight - edgeLength) / 2;
try {
result = Bitmap.createBitmap(scaledBitmap, xTopLeft, yTopLeft, edgeLength, edgeLength);
scaledBitmap.recycle();
} catch (Exception e) {
return null;
}
}
return result;
}
}
佈局中使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.softpo.customviewdemo.MainActivity">
<ImageView
android:id="@+id/rawImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/p5"
/>
<com.softpo.customviewdemo.widget.CircleImageView
android:layout_below="@id/rawImg"
android:layout_width="300dp"
android:layout_height="300dp"
android:src="@mipmap/p5"
/>
</RelativeLayout>
效果圖:
從中取出圓形圖片
修改程式碼:
/**
* Created by softpo on 2016/10/29.
*/
public class CircleImageView extends ImageView {
private Bitmap mBitmap;
private int mWidth,mHeight;
private BitmapShader mBitmapShader;
private ShapeDrawable mShapeDrawable;
public CircleImageView(Context context) {
this(context,null);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//得到影像
mBitmap = ((BitmapDrawable) getDrawable()).getBitmap();
mWidth = mBitmap.getWidth();
mHeight = mBitmap.getHeight();
//構造渲染器BitmapShader
/*
CLAMP :如果渲染器超出原始邊界範圍,會複製範圍內邊緣染色。
REPEAT :橫向和縱向的重複渲染器圖片,平鋪。
MIRROR :橫向和縱向的重複渲染器圖片,這個和REPEAT 重複方式不一樣,它是以映象方式平鋪。
*/
Bitmap squareScaleBitmap = centerSquareScaleBitmap(mBitmap, 100);
mBitmapShader = new BitmapShader(squareScaleBitmap, Shader.TileMode.MIRROR,Shader.TileMode.MIRROR);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
//精確賦值
/**
* EXACTLY:當我們設定width或height為match_parent或者固定值時,容器在佈局時呼叫子 view的measure方法傳入的模式是EXACTLY,
* 因為子view會佔據剩餘容器的空間,所以它大小是確定的;
*
* AT_MOST:而當設定為 wrap_content時,容器傳進去的是AT_MOST,
* 表示子view的大小最多是多少,這樣子view會根據這個上限來設定自己的尺寸;
*
* UNSPECIFIED:是未指定尺寸,這種情況不多,一般都是父控制元件是AdapterView,通過measure方法傳入的模式
*/
if(modeWidth==MeasureSpec.EXACTLY&&modeHeight==MeasureSpec.EXACTLY){
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
//將圖片裁剪為橢圓形
//構建ShapeDrawable物件並定義形狀為橢圓
mShapeDrawable = new ShapeDrawable(new OvalShape());
//得到畫筆並設定渲染器
mShapeDrawable.getPaint().setShader(mBitmapShader);
//設定顯示區域
mShapeDrawable.setBounds(20, 20,mWidth,mHeight);
//繪製shapeDrawable
mShapeDrawable.draw(canvas);
}
/**
* 將給定圖片維持寬高比縮放後,擷取正中間的正方形部分。
*
* @param bitmap 原圖
* @param edgeLength 希望得到的正方形部分的邊長
* @return 縮放擷取正中部分後的點陣圖。
*/
public static Bitmap centerSquareScaleBitmap(Bitmap bitmap, int edgeLength) {
if (null == bitmap || edgeLength <= 0) {
return null;
}
Bitmap result = bitmap;
int widthOrg = bitmap.getWidth();
int heightOrg = bitmap.getHeight();
if (widthOrg >= edgeLength && heightOrg >= edgeLength) {
//壓縮到一個最小長度是edgeLength的bitmap
int longerEdge = (int) (edgeLength * Math.max(widthOrg, heightOrg) / Math.min(widthOrg, heightOrg));
int scaledWidth = widthOrg > heightOrg ? longerEdge : edgeLength;
int scaledHeight = widthOrg > heightOrg ? edgeLength : longerEdge;
Bitmap scaledBitmap;
try {
scaledBitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth, scaledHeight, true);
} catch (Exception e) {
return null;
}
//從圖中擷取正中間的正方形部分。
int xTopLeft = (scaledWidth - edgeLength) / 2;
int yTopLeft = (scaledHeight - edgeLength) / 2;
try {
result = Bitmap.createBitmap(scaledBitmap, xTopLeft, yTopLeft, edgeLength, edgeLength);
scaledBitmap.recycle();
} catch (Exception e) {
return null;
}
}
return result;
}
}
佈局中使用:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.softpo.customviewdemo.MainActivity">
<ImageView
android:id="@+id/rawImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/p5"
/>
<com.softpo.customviewdemo.widget.CircleImageView
android:layout_below="@id/rawImg"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/p5"
/>
</RelativeLayout>
相關文章
- 《Android開發卷——設定圓形頭像,Android擷取圓形圖片》Android
- Android中將方形圖片擷取成圓形的兩種實現方式Android
- CSS圓形圖片效果CSS
- Java 圖片裁剪,擷取Java
- Glide實現圓角圖片,以及圓形圖片IDE
- android圓形頭像的選擇和剪下並儲存出圓形圖片Android
- 求擷取圖片等比公式公式
- CGContextRef處理圓形圖片GCContext
- js擷取影片的封面圖片JS
- 使用 HTML5 Canvas 實現圓形圖片裁剪並上傳HTMLCanvas
- TableView ScrollreView 截圖 擷取全屏 圖片模糊View
- android圖片處理,讓圖片變成圓形Android
- 微信小程式裁剪圖片成圓形微信小程式
- BitmapShader繪製圓形圖片
- 擷取圖片生成頭像外掛
- node平臺擷取圖片模組——jimp
- Android Xfermode 實戰 實現圓形、圓角圖片Android
- Android中圖片圓形設定三種方法介紹Android
- AlamofireImage 使用 – swift載入網路圖片,縮放圖片,生成圓形圖片Swift
- 微信小程式之裁剪圖片成圓形微信小程式
- CircleImageView 圓形圖片頭像實現View
- Android自定義View之圖片外形特效——輕鬆實現圓角和圓形圖片AndroidView特效
- Android圓形圖片--自定義控制元件Android控制元件
- node上擷取圖片工具 images(node-images)
- HTML5畫布canvas隨機生成圓形和正方形HTMLCanvas隨機
- Java實現圖片上傳到伺服器,並把上傳的圖片讀取出來Java伺服器
- 直播平臺原始碼,vue圖片中劃框擷取部分圖片原始碼Vue
- Android自定義設定圓形圖片控制元件Android控制元件
- Arcgis For Android 中MapView 截圖獲取BitmapAndroidView
- 如何在視訊中擷取到高清的畫面並轉換為圖片的格式
- Glide與CircleImageView載入圓形圖片的問題IDEView
- 在RFT中如何擷取螢幕影像並儲存到檔案中?
- Excel 讀取圖片並獲取儲存路徑Excel
- 美圖秀秀怎麼摳圖?美圖秀秀對圖片進行圓形摳圖的教程
- c#呼叫本地命令並擷取OutputC#
- 將網路圖片 轉化成bitmap
- Bitmap的圖片壓縮彙總
- Java擷取指定區間內的陣列元素並存入新陣列Java陣列