redondas redonda recortar para online imagenes imagen gratis fotos forma convertir circulo android image android-canvas crop

android - redonda - Recortar imagen cuadrada a círculo-Programáticamente



recortar imagen en circulo online (6)

Esto se puede hacer simplemente en xml. Por favor vea mi respuesta aquí: https://stackoverflow.com/a/18287979/665930

<RelativeLayout android:id="@+id/icon_layout" android:layout_width="@dimen/icon_mask" android:layout_height="@dimen/icon_mask" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > <ImageView android:id="@+id/icon" android:layout_width="@dimen/icon" android:layout_height="@dimen/icon" android:layout_centerInParent="true" android:scaleType="fitXY" > </ImageView> <ImageView android:id="@+id/icon_mask" android:layout_width="@dimen/icon_mask" android:layout_height="@dimen/icon_mask" android:layout_centerInParent="true" android:background="@drawable/circle" android:scaleType="fitXY" > </ImageView> </RelativeLayout> <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <gradient android:startColor="#00FFFFFF" android:endColor="#00FFFFFF" android:angle="270"/> <stroke android:width="10dp" android:color="#FFAAAAAA"/>

Estaba buscando el pasado un día y no tuve éxito.

Obtengo la imagen de la API y la descargo en un archivo de mapa de bits con el siguiente código.

private Bitmap DownloadImage(String URL) { Bitmap bitmap = null; InputStream in = null; try { in = OpenHttpConnection(URL); bitmap = BitmapFactory.decodeStream(in); in.close(); } catch (IOException e1) { e1.printStackTrace(); } return bitmap; } private InputStream OpenHttpConnection(String urlString) throws IOException { InputStream in = null; int response = -1; URL url = new URL(urlString); URLConnection conn = url.openConnection(); if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection"); try { HttpURLConnection httpConn = (HttpURLConnection) conn; httpConn.setAllowUserInteraction(false); httpConn.setInstanceFollowRedirects(true); httpConn.setRequestMethod("GET"); httpConn.connect(); response = httpConn.getResponseCode(); if (response == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); } } catch (Exception ex) { throw new IOException("Error connecting"); } return in; }

Y obtengo la imagen como un cuadrado y quiero recortar las cuatro esquinas y hacer una imagen circular. ¿Hay alguna forma posible de lograr?

Cualquier respuesta relacionada es bienvenida. Gracias por adelantado .


Probé las soluciones anteriores, pero ninguna funcionó bien para mí. Esto se debe a que la cámara de mi teléfono no toma imágenes cuadradas sino imágenes rectangulares. Entonces, hago algunos cambios en la solución @actsai para tomar siempre la dimensión menor y luego recortar la imagen en un círculo:

public static Bitmap getBitmapClip(Bitmap bitmap) { int maxLenth = bitmap.getWidth() <= bitmap.getHeight() ? bitmap.getWidth() : bitmap.getHeight(); Bitmap output = Bitmap.createBitmap(maxLenth, maxLenth, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, maxLenth, maxLenth); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); canvas.drawCircle(maxLenth / 2, maxLenth / 2, maxLenth / 2, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; }

Usé la siguiente propiedad de escala para llenar mi ImageView con el nuevo mapa de bits:

<ImageView android:id="@+id/iv_photo" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:scaleType="fitXY" />


Roman Nurik propone un uso muy directo de los sombreadores para hacer cosas así, con un dibujo personalizable.

Cambié un poco el código para hacer una imagen ovalada y me puse a prueba. El efecto y el rendimiento son realmente buenos:

public class StreamDrawable extends Drawable { private static final boolean USE_VIGNETTE = true; private final RectF mRect = new RectF(); private final BitmapShader mBitmapShader; private final Paint mPaint; private final int mMargin; public StreamDrawable(Bitmap bitmap, int margin) { mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setShader(mBitmapShader); mMargin = margin; } @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin); if (USE_VIGNETTE) { RadialGradient vignette = new RadialGradient( mRect.centerX(), mRect.centerY() * 1.0f / 0.7f, mRect.centerX() * 1.3f, new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f }, Shader.TileMode.CLAMP); Matrix oval = new Matrix(); oval.setScale(1.0f, 0.7f); vignette.setLocalMatrix(oval); mPaint.setShader( new ComposeShader(mBitmapShader, vignette, PorterDuff.Mode.SRC_OVER)); } } @Override public void draw(Canvas canvas) { canvas.drawOval(mRect, mPaint); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } }


Una vez que se recupera el mapa de bits, se puede utilizar RoundedBitmapDrawable para generar un RoundedBitmapDrawable desde la biblioteca de soporte de v4 . Ese Drawable se puede aplicar a un ImageView o directamente a un Canvas .

// Create the RoundedBitmapDrawable. RoundedBitmapDrawable roundDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap); roundDrawable.setCircular(true); // Apply it to an ImageView. ImageView imageView = (ImageView)findViewById(R.id.imageView); imageView.setImageDrawable(roundDrawable); // Alternatively, draw it to an canvas (e.g. in onDraw where a Canvas is available). // setBounds since there''s no View handling size and positioning. roundDrawable.setBounds(left, top, right, bottom); roundDrawable.draw(canvas);


use la función de golpe para dibujar un círculo en el mapa de bits y luego establezca el mapa de bits dentro de un círculo en vista de imagen

public static Bitmap getclip(Bitmap bitmap) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; }


public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); DrawingView dv = new DrawingView(this); setContentView(dv); } class DrawingView extends View { Bitmap bitmap; public DrawingView(Context context) { super(context); bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.glossy_overlay); } @Override public void onDraw(Canvas canvas) { Paint paint = new Paint(); // paint.setColor(Color.CYAN); canvas.drawBitmap(getclip(), 30, 20, paint); } public Bitmap getclip() { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); // paint.setColor(color); canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } } }