It is common to see secondary processing of images in Android, such as rounding corners or displaying round images

The effect of the implementation:

Method one:

The picture shows rounded corners through the third party framework Glide. There are three ways to write it as follows:

1.1. The first implementation:

RequestOptions options = new RequestOptions().error(R.drawable.img_load_failure).bitmapTransform(new RoundedCorners(30)); With (this).load(URL) // Image address.apply(options).into(ImagView);Copy the code

1.2. The second realization:

RequestOptions requestOptions = new RequestOptions(); requestOptions.placeholder(R.drawable.ic_launcher_background); requestOptions.circleCropTransform(); requestOptions.transforms( new RoundedCorners(30)); Glide. With (this).load(URL) // Image address.apply(options).into(ImagView);Copy the code

1.3. The third implementation:

RequestOptions options = new RequestOptions().centerCrop() .transform(new RoundTransform(this,30)); Glide. With (this).load(URL) // Image address.apply(options).into(ImagView);Copy the code
public class RoundTransform extends BitmapTransformation { 
    private static float radius = 0f; 
    public RoundTransform(Context context) { 
        this(context, 4); 
    } 
   
    public RoundTransform(Context context, int dp) { 
        super(context); 
        this.radius = Resources.getSystem().getDisplayMetrics().density * dp; 
    } 
   
    @Override 
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { 
        Bitmap bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight); 
        return roundCrop(pool, bitmap); 
    } 
   
    private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { 
        if (source == null) return null; 
        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); 
        if (result == null) { 
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); 
        } 
   
        Canvas canvas = new Canvas(result); 
        Paint paint = new Paint(); 
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); 
        paint.setAntiAlias(true); 
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); 
        canvas.drawRoundRect(rectF, radius, radius, paint); 
        return result; 
    } 
   
    public String getId() { 
        return getClass().getName() + Math.round(radius); 
    } 
   
    @Override 
    public void updateDiskCacheKey(MessageDigest messageDigest) { 
   
    }
}
Copy the code

Method 2:

Custom ImageView:

<ImageView
        android:id="@+id/iv"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerHorizontal="true"
        />
Copy the code
ImageView iv = findViewById(R.id.iv); Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.fengjing); OutBitmap =getRoundBitmapByShader(Bitmap, 500,300,20, 3); iv.setImageBitmap(outBitmap);Copy the code
public class RoundRectImageView extends ImageView{ private Paint paint; public RoundRectImageView(Context context) { this(context,null); } public RoundRectImageView(Context context, AttributeSet attrs) { this(context, attrs,0); } public RoundRectImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); paint = new Paint(); } @author caizhiming */ @override protected void onDraw(Canvas Canvas) {Drawable Drawable = getDrawable(); if (null ! = drawable) { Bitmap bitmap = getBitmapFromDrawable(drawable); // Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); GetRoundBitmapByShader (Bitmap,getWidth(),getHeight(), 50,0); final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight()); Final Rect rectDest = new Rect(0,0,getWidth(),getHeight()); paint.reset(); canvas.drawBitmap(b, rectSrc, rectDest, paint); } else { super.onDraw(canvas); }} public static Bitmap getBitmapFromDrawable(drawable) public static Bitmap getBitmapFromDrawable(drawable drawable) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, drawable .getOpacity() ! = PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); //drawable.setBounds(-4, -4, width + 4, height + 4); drawable.draw(canvas); return bitmap; } public static Bitmap getRoundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius, int boarder) { if (bitmap == null) { return null; } int width = bitmap.getWidth(); int height = bitmap.getHeight(); float widthScale = outWidth * 1f / width; float heightScale = outHeight * 1f / height; Matrix matrix = new Matrix(); matrix.setScale(widthScale, heightScale); DesBitmap = bitmap.createBitMap (outWidth, outHeight, bitmap.config. ARGB_8888); Canvas = new Canvas(desBitmap); // Create canvas and pass in desBitmap. Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); BitmapShader = new BitmapShader(bitmap, shader.tilemode.CLAMP, shader.tilemode.CLAMP); / / to the shader configuration matrix bitmapShader. SetLocalMatrix (matrix); paint.setShader(bitmapShader); Border RectF rect = new RectF(boarder, boarder, outwidth-boarder, outHeight - boarder); border RectF rect = new RectF(boarder, boarder, outwidth-boarder, outHeight - boarder); // Draw the incoming bitmap to canvas. DrawRoundRect (rect, radius, radius, paint); If (boarder > 0) {// Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); boarderPaint.setColor(Color.GREEN); boarderPaint.setStyle(Paint.Style.STROKE); boarderPaint.setStrokeWidth(boarder); canvas.drawRoundRect(rect, radius, radius, boarderPaint); } return desBitmap; }}Copy the code

Method 3:

To process an image, this method can also add borders

/** * The width of the output image * @param outHeight * @param RADIUS size * Public static Bitmap getRoundBitmapByShader(Bitmap Bitmap, int outWidth, int outHeight, int radius, int boarder) { if (bitmap == null) { return null; } int height = bitmap.getHeight(); int width = bitmap.getWidth(); float widthScale = outWidth * 1f / width; float heightScale = outHeight * 1f / height; Matrix matrix = new Matrix(); matrix.setScale(widthScale, heightScale); DesBitmap = bitmap.createBitMap (outWidth, outHeight, bitmap.config. ARGB_8888); Canvas = new Canvas(desBitmap); // Create canvas and pass in desBitmap. Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); BitmapShader = new BitmapShader(bitmap, shader.tilemode.CLAMP, shader.tilemode.CLAMP); / / to the shader configuration matrix bitmapShader. SetLocalMatrix (matrix); paint.setShader(bitmapShader); Border RectF rect = new RectF(boarder, boarder, outwidth-boarder, outHeight - boarder); border RectF rect = new RectF(boarder, boarder, outwidth-boarder, outHeight - boarder); // Draw the incoming bitmap to canvas. DrawRoundRect (rect, radius, radius, paint); If (boarder > 0) {// Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); boarderPaint.setColor(Color.GREEN); boarderPaint.setStyle(Paint.Style.STROKE); boarderPaint.setStrokeWidth(boarder); canvas.drawRoundRect(rect, radius, radius, boarderPaint); } return desBitmap; }Copy the code

Implement circles and borders:

@param outHeight @param outHeight @param boarder border size */  public static Bitmap getCircleBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int boarder) { int radius; int width = bitmap.getWidth(); int height = bitmap.getHeight(); float widthScale = outWidth * 1f / width; float heightScale = outHeight * 1f / height; Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888); if (outHeight > outWidth) { radius = outWidth / 2; } else { radius = outHeight / 2; } // create canvas canvas = new canvas (desBitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); Matrix matrix = new Matrix(); matrix.setScale(widthScale, heightScale); bitmapShader.setLocalMatrix(matrix); paint.setShader(bitmapShader); canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, paint); If (boarder > 0) {// Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); boarderPaint.setColor(Color.GREEN); boarderPaint.setStyle(Paint.Style.STROKE); boarderPaint.setStrokeWidth(boarder); canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, boarderPaint); } return desBitmap; }Copy the code

 

If it will help you

Might as well add a concern, a point of praise ha, your every small move is a great support to me!