【问题标题】:Crop Image as circle in Android在Android中将图像裁剪为圆形
【发布时间】:2012-10-08 07:10:10
【问题描述】:

有人知道如何将图像\位图裁剪为圆形吗? 我找不到任何解决方案,对不起..

【问题讨论】:

标签: android crop android-image


【解决方案1】:

对于 ImageView 的圆角,将您的图像转换为位图,然后尝试以下代码:

private Bitmap getRoundedCroppedBitmap(Bitmap bitmap) {
    int widthLight = bitmap.getWidth();
    int heightLight = bitmap.getHeight();
    
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
            Config.ARGB_8888);
        
    Canvas canvas = new Canvas(output);
    Paint paintColor = new Paint();
    paintColor.setFlags(Paint.ANTI_ALIAS_FLAG);
        
    RectF rectF = new RectF(new Rect(0, 0, widthLight, heightLight));
        
    canvas.drawRoundRect(rectF, widthLight / 2, heightLight / 2, paintColor);
        
    Paint paintImage = new Paint();
    paintImage.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP));
    canvas.drawBitmap(bitmap, 0, 0, paintImage);
        
    return output;
}

【讨论】:

  • 感谢这篇文章。帮了我很多!
【解决方案2】:

Romain Guy 曾是 Google 的 Android 团队工程师,他在 drawing images with rounded corners 上发表了一篇精彩的文章。这个想法可以很容易地扩展到一个圆,例如,通过改变圆角矩形的半径来创建一个完整的圆。

来自文章:

为了生成圆形图像,我只是编写了一个自定义Drawable 使用Canvas.drawRoundRect() 绘制一个圆角矩形。诀窍是 使用 PaintBitmapShader 来填充圆角矩形 纹理而不是简单的颜色。下面是代码的样子:

BitmapShader shader; shader = new BitmapShader(bitmap,
Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

Paint paint = new Paint(); paint.setAntiAlias(true);
paint.setShader(shader);

RectF rect = new RectF(0.0f, 0.0f, width, height);

// rect contains the bounds of the shape
// radius is the radius in pixels of the rounded corners
// paint contains the shader that will texture the shape
canvas.drawRoundRect(rect, radius, radius, paint);

【讨论】:

  • Canvas 还公开了一个drawCircle 方法,它可能更适合这种情况。
【解决方案3】:

Wiseman Designs,有一个可以使用的开源 Circular ImageView

https://github.com/wisemandesigns/CircularImageView

这在您的布局中使用 XML,这让生活更轻松。您可以在 XML 中设置源,或者稍作修改就可以轻松使用位图。

免责声明:我为 Wiseman Designs 工作

【讨论】:

    【解决方案4】:

    类:

      public Bitmap getRoundedShape(Bitmap scaleBitmapImage) {
    
        int targetWidth = 50;
        int targetHeight = 50;
        Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
                            targetHeight,Bitmap.Config.ARGB_8888);
                            canvas = new Canvas(targetBitmap);
        Path path = new Path();
        path.addCircle(((float) targetWidth - 1) / 2,
        ((float) targetHeight - 1) / 2,
        (Math.min(((float) targetWidth), 
                ((float) targetHeight)) / 2),
          Path.Direction.CCW);
    
        canvas.clipPath(path);
        Bitmap sourceBitmap = scaleBitmapImage;
        canvas.drawBitmap(sourceBitmap, 
                                new Rect(0, 0, sourceBitmap.getWidth(),
          sourceBitmap.getHeight()), 
                                new Rect(0, 0, targetWidth,
          targetHeight), null);
        return targetBitmap;
       }
    

    查看:

    <ImageView
            android:id="@+id/imgView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/btnEdit"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="40dp"
            android:background="@drawable/rounded"
            android:adjustViewBounds="true"
            android:gravity="center"
            android:src="@drawable/happy"/>
    

    其他样式:

     <?xml version="1.0" encoding="utf-8"?>
     <shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <solid android:color="@android:color/white" />
    
    <stroke
        android:width="3dip"
        android:color="#FF0000" />
    
    <corners android:radius="10dp" />
    
    <padding
        android:bottom="0dp"
        android:left="0dp"
        android:right="0dp"
        android:top="0dp" />
    

    【讨论】:

      【解决方案5】:

      试试下面的代码:

      public Bitmap getRoundedShape(Bitmap scaleBitmapImage) {
        // TODO Auto-generated method stub
        int targetWidth = 50;
        int targetHeight = 50;
        Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
                                  targetHeight,Bitmap.Config.ARGB_8888);
      
                      Canvas canvas = new Canvas(targetBitmap);
        Path path = new Path();
        path.addCircle(((float) targetWidth - 1) / 2,
        ((float) targetHeight - 1) / 2,
        (Math.min(((float) targetWidth), 
                      ((float) targetHeight)) / 2),
                Path.Direction.CCW);
      
                      canvas.clipPath(path);
        Bitmap sourceBitmap = scaleBitmapImage;
        canvas.drawBitmap(sourceBitmap, 
                                      new Rect(0, 0, sourceBitmap.getWidth(),
          sourceBitmap.getHeight()), 
                                      new Rect(0, 0, targetWidth,
          targetHeight), null);
        return targetBitmap;
       }
      

      【讨论】:

      • 不工作。请给我建议。
      【解决方案6】:
      finalBitmapShader shader = newBitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
      mPaint.setShader(shader);
      mBitmapWidth=mBitmap.getWidth();
      mBitmapHeight=mBitmap.getHeight();
      }
      @Override
      public void draw(Canvas canvas{ 
        canvas.drawOval(mRectF,mPaint);
      }
      @Override
      protected void onBoundsChange(Rect bounds) {
        super.onBoundsChange(bounds);
        mRectF.set(bounds);
      }
      

      我在这里找到了它的示例教程 http://androidgreeve.blogspot.in/2014/09/facebook-messanger-like-profile-image.html?m=1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多