بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

برش( Crop ) عکس و نمایش آن به شکل دایره ای

مدیریت گفتگو
iSheykhi 12 سال پیش
آخرین تغییر: 12 سال پیش

باسلام خدمت استاد گرامی:

قصد نوشتن برنامه ای رو دارم که از گالری گوشی کاربر، عکس دریافت میکنه و بعداز برش عکس با ضلع برابر(عکس پروفایل) در یک قاب دایره  ای تصویر را به نمایش در بیاورده.

بنده تخصص بالای در زمینه برنامه نویسی و اعمال کد های آماده ندارم. لطفا کمکم کنید..

منابع جستجو شده:

http://stackoverflow.com/questions/11932805/cropping-circular-area-from-bitmap-in-android

http://stackoverflow.com/questions/18641362/how-to-create-a-circle-clippath-from-an-image

 

 

نظرات

مجتبی یگانه 12 سال پیش
راستش کسی حسشو نداره تست کن ! ، خودت لینک رو پیدا کردی تست کن دیگه ، مطمئنا stack که تیک خورده و رای مثبت گرفته ، نشد نداره !
uncocoder 12 سال پیش
شما یک Custom Control مثل آموزش باران بساز و تو قسمت onDraw کد موجود در لینک دومی که پیدا کردید رو بنویسید. اگر مشکل حل نشد اطلاع بدید تا به عنوان یک بخش تدوین کنم.
iSheykhi 12 سال پیش
دقیقا نمی دونم به کدوم بخش اشاره دارید از اونجایی که سوال دیگران هم هست ممنون می شم توضیح بدین
uncocoder 12 سال پیش
در آموزشهای «کنترل های سفارشی» مخصوصاً «باران» در این خصوص آموزشهایی ارائه شده که کاملاً خواسته شما را برآورده می کند. در واقع ترسیم بر روی Canvas است.
amir Alu 12 سال پیش
iSheykhi من دیدم شما داخل برنامه ی جدیدتون از این قابلیت استفاده کردین.پس لطف کنین روش کارتون اینجا بزارین تا همه بچه ها ببینن
سپهر 12 سال پیش
شما مشکلتون حل شد ؟میشه توضیح بدید چطور ؟

پاسخ‌ها 3

MiRHaDi 12 سال پیش

مطلب قدیمی شده و تا الآن حتما حل شده ، ولی چند نکته :

یک راه برای اینکه هر شکلی بخواید در بیارید استفاده از Mask هست. برای شبیه سازیش میتونید 2 تا عکس را روی هم بگذارید که عکس بالایی دارای یک محوطه خالی (شفاف) میباشد و عکس پایین همان عکس معمولی است. با این ترفند هم دایره هم ستاره و هر شکل دیگه ای را میشه تولید کرد

<FrameLayout>
    <ImageView />  put a image which has a transparent circle in it
    <ImageView />  your image 
</FrameLayout>

و سورس کامل :

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:foreground="@drawable/overlay"
android:foregroundGravity="center"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/avatar"
/>
</FrameLayout>
 
</FrameLayout>

خوبی این روش اینه که هیچ پردازش و کدی نداره و سمت xml کار انجام میشه

نظرات

سپهر 12 سال پیش
در این کد overly چه شکلی هست ؟
سپهر 12 سال پیش
این کد شما خیلی خوبه اما یک مشکلی هست و اون این که هرچی که رنگ زمینه باشه باید اون ماسک هم به همون رنگ باشه و اگر رنگ زمینه متفاوت باشه با رنگ ماسک ، تابلو میشه
MiRHaDi 12 سال پیش

واین هم سورس برای تبدیل :

import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
 
/**
* A Drawable that draws an oval with given {@link Bitmap}
*/
public class RoundedAvatarDrawable extends Drawable {
private final Bitmap mBitmap;
private final Paint mPaint;
private final RectF mRectF;
private final int mBitmapWidth;
private final int mBitmapHeight;
 
public RoundedAvatarDrawable(Bitmap bitmap) {
mBitmap = bitmap;
mRectF = new RectF();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
final BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(shader);
 
// NOTE: we assume bitmap is properly scaled to current density
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);
}
 
@Override
public void setAlpha(int alpha) {
if (mPaint.getAlpha() != alpha) {
mPaint.setAlpha(alpha);
invalidateSelf();
}
}
 
@Override
public void setColorFilter(ColorFilter cf) {
mPaint.setColorFilter(cf);
}
 
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
 
@Override
public int getIntrinsicWidth() {
return mBitmapWidth;
}
 
@Override
public int getIntrinsicHeight() {
return mBitmapHeight;
}
 
public void setAntiAlias(boolean aa) {
mPaint.setAntiAlias(aa);
invalidateSelf();
}
 
@Override
public void setFilterBitmap(boolean filter) {
mPaint.setFilterBitmap(filter);
invalidateSelf();
}
 
@Override
public void setDither(boolean dither) {
mPaint.setDither(dither);
invalidateSelf();
}
 
public Bitmap getBitmap() {
return mBitmap;
}
 
// TODO allow set and use target density, mutate, constant state, changing configurations, etc.

نظرات

سپهر 12 سال پیش
این کد دقیقا چیکار میکنه ؟
MiRHaDi 12 سال پیش

یک راه دیگه استفاده از webView برای قرار دادن تصاویر و استفاده از svg درون آن است که بکگراند را عکس قرار میدهیم و خودش دایره ای شکل باشد.

از طریق css هم میتوانیم عکس را به صورت دایره ای نمایش دهیم و در وب ویو نشان دهیم

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .