當前位置:首頁 » 安卓系統 » androidbitmap圓形

androidbitmap圓形

發布時間: 2023-02-18 07:45:01

⑴ Android 控制項 RoundedBitmapDrawable

RoundedBitmapDrawable 是 supportV4 下的一個類,有了它,顯示圓角和圓形圖片的情況下就不需要額外的第三方類庫了,還能和各種圖片載入庫配合使用。
點擊此處 可以看到官方的介紹。

setCircular(boolean circular) : 把圖片的形狀設為圓形;

setCornerRadius(float cornerRadius) : 設置圖片的圓角半徑。

這里貼一下源碼,更能清晰的知道它的實現:

至於具體的實現,閱讀源碼發現官方使用了 BitmapShader 來實現的圓角。

效果

首先來看下原圖和處理後效果,以及做一些擴展,如添加一個邊框

通過 RoundedBitmapDrawableFactory 傳遞要轉換bitmap 我就可以很簡單的生成一個如下圖的圓角圖片

可以看到我們僅僅只是改了一個屬性就實現了如下圖正圓形的轉換,但你可能已經發現圖像有一些變形,因為內部在接收到 circular == true 後先是對圖像進行了轉換為正方形的操作,這個操作是一個伸縮放操作,而不是裁剪,所以圖像發生了變形,所以在使用 setCircular 時最好能保證你的原圖時一個正方形的,如果不是的話,下面我們也會給出相應解決方案

我們自己進行對bitmap的裁剪來轉換成正方形,就解決了上面提到的拉伸問題,再繪制邊框就實現了一個如下帶邊框的正圓形圖片

RoundedBitmapDrawable 也可以直接設置轉換過程的

這些操作,來更好的工作

到這個里我們就可以把項目中的圓角圖片的控制項更換一下,平時記得多留意一下系統提供的一些API,可能會幫我們節省不少時間。

引用:
★★★ Android一些容易被忽略的類-RoundedBitmapDrawable
★★ Android 必知必會-使用 supportV4 的 RoundedBitmapDrawable 實現圓角

⑵ Android Bitmap詳解

Bitmap是Android系統中圖像處理的最重要類之一。用它可以獲取圖像信息,對圖像進行剪切、旋轉、縮放等操作,並可以指定格式保存圖像文件。

以in開頭的都是設置屬性值,以out開頭的都是獲取屬性值。

Bitmap的載入獲取方式主要有有從Resource資源載入、本地SD卡載入及網路載入等方式。

使用BitmapFactory.decodeResource方式載入圖片如果要經過縮放,該縮放是在java層進行的,效率比較低,會消耗java層的內存,因此如果大量使用會導致OOM。

BitmapFactory.decodeStream一般用於二進制文件圖片的讀取。

從網路載入圖片本質上也是從網路讀取圖片數據流,通過BitmapFactory.decodeStream方式載入圖片。

其他的轉換就不一一列舉了,不能直接轉換的可以間接進行轉換。

在拍照上傳圖片過程中,我們可能會遇到上傳的圖片被旋轉了,需要給他復原進行旋轉。

獲取圖片的旋轉角度:

⑶ Android中怎麼把一張bitmap圖在外圍加上一個圈

你可以去研究下canvas,和paint這兩個類,這里只給出思路。

  1. new一個空白的bitmap對象

  2. 裁剪你需要顯示的圖片,使之為符合要求的園

  3. 畫到空白的bitmap對象上

  4. 再畫外圍的圈

  5. set到imageview裡面進行顯示

⑷ android xml圓型頭像怎麼辦

android生成圓形頭像
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {

Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);

final Paint paint = new Paint();
//保證是方形,並且從中心畫
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int w;
int deltaX = 0;
int deltaY = 0;
if (width <= height) {
w = width;
deltaY = height - w;
} else {
w = height;
deltaX = width - w;
}
final Rect rect = new Rect(deltaX, deltaY, w, w);
final RectF rectF = new RectF(rect);

paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
//圓形,所有隻用一個

int radius = (int) (Math.sqrt(w * w * 2.0d) / 2);
canvas.drawRoundRect(rectF, radius, radius, paint);

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}

⑸ android 如何把正方形圖片顯示圓形

Android應用開發中,很多頭像都要求顯示成圓形的,這就可以使用android的canvas、paint這些類來進行設置圓形,先設置paint的樣式為圓形,然後把你要設置成圓形的圖片重新賦值給paint這個類:canvas.drawBitmap(tempBmp, rect, rect, paint);

核心代碼如下(引用這位前輩:http://blog.sina.com.cn/s/blog_7607703f0101dhlj.html,我增加一些注釋,原來是沒有注釋):

packagecom.liang.round;
importandroid.annotation.SuppressLint;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.Config;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.graphics.PorterDuff;
importandroid.graphics.PorterDuffXfermode;
importandroid.graphics.Rect;
importandroid.view.View;
publicclassMyViewextendsView{
privateBitmapbmp=null;
privatePaintpaint=null;
publicMyView(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
paint=newPaint();//實例化畫筆類
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(context.getResources(),R.drawable.test,options);//獲得你存放在drawable下的正方形圖片
options.inJustDecodeBounds=false;
BitmaptempBmp=BitmapFactory.decodeResource(context.getResources(),R.drawable.test,options);//實例化一個bitmap圖片類
intwidth=options.outWidth;
intheight=options.outHeight;
intsize=width>height?height:width;//邊框
intpos=(int)(size/2);
doubleradius=pos*Math.sin(45*180/Math.PI);//半徑
size=(int)(radius*2);
pos=(int)(size/2);
bmp=Bitmap.createBitmap(size,size,Config.ARGB_8888);
Canvascanvas=newCanvas(bmp);
Rectrect=newRect(0,0,size,size);
paint.setAntiAlias(true);
canvas.drawCircle(pos,pos,(float)radius,paint);
paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(tempBmp,rect,rect,paint);
tempBmp.recycle();
}
@SuppressLint("DrawAllocation")
@Override
protectedvoidonDraw(Canvascanvas){
//TODOAuto-generatedmethodstub
super.onDraw(canvas);
if(bmp!=null){
if(!bmp.isRecycled()){
canvas.drawBitmap(bmp,100,100,paint);
}
}
}
}

⑹ bitmap android怎麼按圓弧剪切

按圓弧剪切,可以用Photoshop。

  1. 打開需要裁剪成圓形的圖片。

  2. 右鍵單擊工具欄第一格,左鍵單擊選擇「橢圓選框工具」。

  3. 按住滑鼠左鍵和鍵盤上的Shift鍵,同時拖動滑鼠,選中需要留下的圓形部分。(註:如果要裁剪成橢圓形,則不需要按住Shift鍵。)

  4. 單擊「選擇」——「反向」。

  5. 不需要的部分被選中。

  6. 按鍵盤上的Del鍵,刪除不需要的部分。

  7. 單擊「選擇」——「反向」,選中需要留下的圓形部分。

  8. 單擊「編輯」——「剪切」。

  9. 單擊「新建」,背景內容選擇「透明」,然後單擊「確定」。

  10. 單擊「編輯」——「粘貼」,圖片就裁剪好了。之後只要單擊「文件」——「存儲」,就可以保存圖片了。

⑺ android swiperefreshlayout 為什麼是圓形的

其實主要靠:paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));這行代碼,為什麼呢,我給大家解釋下,SRC_IN這種模式,兩個繪制的效果疊加後取交集展現後圖,怎麼說呢,咱們第一個繪制的是個圓形,第二個繪制的是個Bitmap,於是交集為圓形,展現的是BItmap,就實現了圓形圖片效果。圓角,其實就是先繪制圓角矩形,是不是很簡單,以後別人再說實現圓角,你就把這一行代碼給他就行了。

從Android的示例中,給大家證明一下:
下面有一張PorterDuff.Mode的16中效果圖,咱們的只是其一:

源碼咱們只關心誰先誰後繪制的:

[java] view plain
canvas.translate(x, y);
canvas.drawBitmap(mDstB, 0, 0, paint);
paint.setXfermode(sModes[i]);
canvas.drawBitmap(mSrcB, 0, 0, paint);
paint.setXfermode(null);
canvas.restoreToCount(sc);
可以看出先繪制的Dst,再繪制的Src,最後的展示是SrcIn那個圖:顯示的區域是二者交集,展示的是Src(後者)。和咱們前面結論一致。效果16種,大家可以自由組合展示不同的效果。

好了,原理和核心代碼解釋完成。下面開始寫自定義View。
1、自定義屬性:

[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<resources>

<attr name="borderRadius" format="dimension" />
<attr name="type">
<enum name="circle" value="0" />
<enum name="round" value="1" />
</attr>
<attr name="src" format="reference"></attr>

<declare-styleable name="CustomImageView">
<attr name="borderRadius" />
<attr name="type" />
<attr name="src" />
</declare-styleable>

</resources>

2、構造中獲取自定義的屬性:

[java] view plain
/**
* TYPE_CIRCLE / TYPE_ROUND
*/
private int type;
private static final int TYPE_CIRCLE = 0;
private static final int TYPE_ROUND = 1;

/**
* 圖片
*/
private Bitmap mSrc;

/**
* 圓角的大小
*/
private int mRadius;

/**
* 控制項的寬度
*/
private int mWidth;
/**
* 控制項的高度
*/
private int mHeight;

public CustomImageView(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}

public CustomImageView(Context context)
{
this(context, null);
}

/**
* 初始化一些自定義的參數
*
* @param context
* @param attrs
* @param defStyle
*/
public CustomImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomImageView, defStyle, 0);

int n = a.getIndexCount();
for (int i = 0; i < n; i++)
{
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.CustomImageView_src:
mSrc = BitmapFactory.decodeResource(getResources(), a.getResourceId(attr, 0));
break;
case R.styleable.CustomImageView_type:
type = a.getInt(attr, 0);// 默認為Circle
break;
case R.styleable.CustomImageView_borderRadius:
mRadius= a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
getResources().getDisplayMetrics()));// 默認為10DP
break;
}
}
a.recycle();
}

3、onMeasure中獲取控制項寬高:

[java] view plain
/**
* 計算控制項的高度和寬度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
/**
* 設置寬度
*/
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);

if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mWidth = specSize;
} else
{
// 由圖片決定的寬
int desireByImg = getPaddingLeft() + getPaddingRight()
+ mSrc.getWidth();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mWidth = Math.min(desireByImg, specSize);
} else

mWidth = desireByImg;
}

/***
* 設置高度
*/

specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mHeight = specSize;
} else
{
int desire = getPaddingTop() + getPaddingBottom()
+ mSrc.getHeight();

if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mHeight = Math.min(desire, specSize);
} else
mHeight = desire;
}

setMeasuredDimension(mWidth, mHeight);

}

4、根據Type繪制:

[java] view plain
/**
* 繪制
*/
@Override
protected void onDraw(Canvas canvas)
{

switch (type)
{
// 如果是TYPE_CIRCLE繪制圓形
case TYPE_CIRCLE:

int min = Math.min(mWidth, mHeight);
/**
* 長度如果不一致,按小的值進行壓縮
*/
mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);

canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null);
break;
case TYPE_ROUND:
canvas.drawBitmap(createRoundConerImage(mSrc), 0, 0, null);
break;

}

}

/**
* 根據原圖和變長繪制圓形圖片
*
* @param source
* @param min
* @return
*/
private Bitmap createCircleImage(Bitmap source, int min)
{
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
/**
* 產生一個同樣大小的畫布
*/
Canvas canvas = new Canvas(target);
/**
* 首先繪制圓形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN,參考上面的說明
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 繪制圖片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target;
}

/**
* 根據原圖添加圓角
*
* @param source
* @return
*/
private Bitmap createRoundConerImage(Bitmap source)
{
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rect = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rect, mRadius, mRadius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return target;
}

好了,我就不解析代碼了,自定義View這是第五篇了,,,,寫得好惡心,,,,

⑻ android 能在bitmap上繪制圓嗎

能,這是往圖片(圖片轉為Bitmap)上寫入文字、圖片,你換成畫圓就是得了。
/**
* 往圖片上寫入文字、圖片等內容
*/
private void drawNewBitmap(String str) {
Bitmap photo = BitmapFactory.decodeResource(this.getResources(),R.drawable.introce_first);

int width = photo.getWidth();
int hight = photo.getHeight();

Bitmap bitmap = Bitmap.createBitmap(width, hight, Bitmap.Config.ARGB_8888); // 建立一個空的BItMap
Canvas canvas = new Canvas(bitmap);// 初始化畫布繪制的圖像到icon上

Paint photoPaint = new Paint(); // 建立畫筆
photoPaint.setDither(true); // 獲取跟清晰的圖像采樣
photoPaint.setFilterBitmap(true);// 過濾一些

Rect src = new Rect(0, 0, photo.getWidth(), photo.getHeight());// 創建一個指定的新矩形的坐標
Rect dst = new Rect(0, 0, width, hight);// 創建一個指定的新矩形的坐標
canvas.drawBitmap(photo, src, dst, photoPaint);// 將photo 縮放或則擴大到
// dst使用的填充區photoPaint

Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);// 設置畫筆
textPaint.setTextSize(30.0f);// 字體大小
textPaint.setTypeface(Typeface.DEFAULT_BOLD);// 採用默認的寬度
textPaint.setColor(Color.BLACK);// 採用的顏色
canvas.drawText(str, 200, 200, textPaint);// 繪制上去字,開始未知x,y採用那隻筆繪制
canvas.drawBitmap(BitmapFactory.decodeResource(this.getResources(),R.drawable.ic_launcher), 100, 100, textPaint);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
iv.setBackgroundDrawable(new BitmapDrawable(this.getResources(), bitmap));
saveMyBitmap(bitmap,"test1");
}

⑼ android中 怎麼顯示一直圖片為圓形圖片

android中的imageview只能顯示矩形的圖片,這樣一來不能滿足我們其他的需求,比如要顯示圓形的圖片,這個時候,我們就需要自定義imageview了,其原理就是首先獲取到圖片的bitmap,然後進行裁剪圓形的bitmap,然後在ondraw()進行繪制圓形圖片輸出。

⑽ Android Bitmap理解

參考:
Android Bitmap 詳解:關於 Bitamp 你所要知道的一切

Android Bitmap(點陣圖)詳解

圖片是由大量且有限個數的像素點組成。把一張圖片通過bitmap的方式創建到內存中,實際上就是在內存中創建了一個叫做Bitmap的對象,然後把 圖片所有像素 解碼後的數據存放在Bitmap對象裡面,Bitmap就擁有了圖片的寬高,透明度,顏色值等數據。所以Bitmap的創建是通過BitmapFactory.decodeXxx()。

Config是Bitmap類中的枚舉類。像素由ARGB四個顏色通道組成。Config描述點陣圖中像素的存儲方式。 這里的存儲方式,無非就是對顏色通道和用多大的容器(bit)來存儲的排列組合。所以config會影響圖片透明度,佔用內存大小,保存成文件的大小,圖片質量。
Config的字母表示該配置存儲的像素的顏色通道,數字表示對應通道的數據用多少位來存儲。

ALPHA_8:表示只存儲alpha通道,使用8bit(1位元組)的內存(容器)來存儲一個像素。
RGB_565:表示存儲RGB三個通道,分別使用5bit,6bit,5bit的內存(容器)來存儲一個像素。
ARGB_4444:表示存儲ARGB四個通道,每個通道都是以4bit的內存(容器)來存儲一個像素。
ARGB_8888:表示存儲ARGB四個通道,每個通道都是以8bit的內存(容器)來存儲一個像素。

所以,ARGB_8888配置佔用內存最大,圖片質量最高。
圖片壓縮的一個思路就是降低圖片的配置。

總內存 = 寬的像素數 × 高的像素數 × 每個像素點佔用的大小
註:
1 byte = 8 bit
1 KB = 1024 byte

熱點內容
伺服器無法通過ip訪問 發布:2025-05-16 14:26:13 瀏覽:539
網吧u盤拒絕訪問 發布:2025-05-16 14:13:50 瀏覽:260
無線網檢查網路配置是怎麼回事 發布:2025-05-16 14:04:03 瀏覽:220
網路爬蟲python代碼 發布:2025-05-16 14:03:26 瀏覽:516
汽車小組件怎麼弄到安卓桌面 發布:2025-05-16 13:51:12 瀏覽:220
linuxg編譯器下載 發布:2025-05-16 13:50:58 瀏覽:776
centosc編譯器 發布:2025-05-16 13:50:17 瀏覽:948
安卓手機如何變換桌面 發布:2025-05-16 13:39:33 瀏覽:515
sql存儲過程命令 發布:2025-05-16 13:17:54 瀏覽:146
用紙做解壓小玩具西瓜 發布:2025-05-16 13:04:09 瀏覽:936