رفتن به مطلب

ارسال‌های توصیه شده

🔥 یک قابلیت کاربردی برای پروژه‌های B4A!

📸 تا حالا خواستی داخل برنامه‌ی Basic4Android به کاربر اجازه بدی یک عکس را انتخاب کنه و خودش قسمت موردنظر تصویر را دقیق برش بده؟

دیگه لازم نیست این قابلیت رو از صفر پیاده‌سازی کنی! 😎

🚀 سورس آماده برش عکس در B4A

این سورس دارای یک ماژول آماده است و استفاده از آن بسیار ساده است.

✅ انتخاب تصویر
✅ برش دقیق عکس
✅ رابط کاربری آماده برای Crop
✅ ذخیره تصویر برش‌خورده در گوشی
✅ قابل استفاده در پروژه‌های مختلف B4A

💡 فقط سورس را به پروژه اضافه کن، ماژول را وارد کن و از قابلیت برش تصویر استفاده کن!

📥 اگر با B4A کار می‌کنی، این سورس می‌تونه یکی از ابزارهای کاربردی پروژه‌هات باشه.

سورس

ابتدا این ماژول را به پروژت اضافه کن

#DesignerProperty: Key: SelectionColor, DisplayName: Selection Color, FieldType: Color, DefaultValue: 0xFF0066FF
#Event: CropCompleted
Sub Class_Globals
	Private mEventName As String 'ignore
	Private mCallBack As Object 'ignore
	Private mBase As B4XView 'ignore
	Private xui As XUI 'ignore
	Private ImageView As B4XView
	Private ColorBC, GreyBC, TargetBC As BitmapCreator
	Private OriginalBmp As B4XBitmap
	Private SelectionRect As B4XRect
	Private pnl As B4XView
	Private sx, sy As Int
	Private clr As Int
	Private OffsetX, OffsetY As Int
End Sub

Public Sub Initialize (Callback As Object, EventName As String)
	mEventName = EventName
	mCallBack = Callback
	SelectionRect.Initialize(0, 0, 0, 0)
End Sub

'Base type must be Object
Public Sub DesignerCreateView (Base As Object, Lbl As Label, Props As Map)
	mBase = Base
	clr = xui.PaintOrColorToColor(Props.Get("SelectionColor"))
	Dim iv As ImageView
	iv.Initialize("")
	ImageView = iv
	mBase.AddView(ImageView, 0, 0, 0, 0)
	pnl = xui.CreatePanel("pnl")
	mBase.AddView(pnl, 0, 0, 0, 0)
	Base_Resize(mBase.Width, mBase.Height)
End Sub

Private Sub Base_Resize (Width As Double, Height As Double)
	pnl.SetLayoutAnimated(0, 0, 0, Width, Height)
End Sub

Private Sub pnl_Touch (Action As Int, X As Float, Y As Float)
	x = (x - OffsetX)/ xui.Scale
	y = (y - OffsetY) / xui.Scale
	x = Max(0, Min(ColorBC.mWidth - 1, X))
	y = Max(0, Min(ColorBC.mHeight - 1, Y))
	Select Action
		Case pnl.TOUCH_ACTION_DOWN
			SelectionRect.Left = 0
			SelectionRect.Top = 0
			SelectionRect.Right = 0
			SelectionRect.Bottom = 0
			sx = X
			sy = Y
		Case pnl.TOUCH_ACTION_MOVE
			SelectionRect.Left = Min(sx, X)
			SelectionRect.Top = Min(sy, Y)
			SelectionRect.Right = Max(sx, X)
			SelectionRect.Bottom = Max(sy, Y)
		Case pnl.TOUCH_ACTION_UP
			If IsValidSelection Then
				CallSubDelayed(mCallBack, mEventName & "_CropCompleted")
			End If
	End Select
	UpdateTarget
End Sub

Public Sub SetBitmap (bmp As B4XBitmap)
	OriginalBmp = bmp
	Dim FitBitmap As B4XBitmap = bmp.Resize(pnl.Width, pnl.Height, True)
	OffsetX = (pnl.Width - FitBitmap.Width) / 2
	OffsetY = (pnl.Height - FitBitmap.Height) / 2
	ImageView.SetLayoutAnimated(0, OffsetX, OffsetY, FitBitmap.Width, FitBitmap.Height)
	ColorBC.Initialize(FitBitmap.Width / FitBitmap.Scale, FitBitmap.Height / FitBitmap.Scale)
	ColorBC.CopyPixelsFromBitmap(FitBitmap)
	GreyBC.Initialize(ColorBC.mWidth, ColorBC.mHeight)
	TargetBC.Initialize(ColorBC.mWidth, ColorBC.mHeight)
	'greyscale
	Dim argb As ARGBColor
	For x = 0 To ColorBC.mWidth - 1
		For y = 0 To ColorBC.mHeight - 1
			ColorBC.GetARGB(x, y, argb)
			Dim c As Int = argb.r * 0.21 + argb.g * 0.72 + 0.07 * argb.b
			argb.r = c
			argb.g = c
			argb.b = c
			GreyBC.SetARGB(x, y, argb)
		Next
	Next
	UpdateTarget
End Sub

Private Sub UpdateTarget
	TargetBC.DrawBitmapCreator(GreyBC, GreyBC.TargetRect, 0, 0, True)
	TargetBC.DrawBitmapCreator(ColorBC, SelectionRect, SelectionRect.Left, SelectionRect.Top, True)
	DrawRect
	ImageView.SetBitmap(TargetBC.Bitmap)
End Sub

Private Sub DrawRect
	'no bounds checks
	Dim a As ARGBColor
	TargetBC.ColorToARGB(clr, a)
	For y = SelectionRect.Top To SelectionRect.Bottom - 1
		TargetBC.SetARGB(SelectionRect.Left, y, a)
		TargetBC.SetARGB(SelectionRect.Right - 1, y, a)
	Next
	For x = SelectionRect.Left To SelectionRect.Right - 1
		TargetBC.SetARGB(x, SelectionRect.Top, a)
		TargetBC.SetARGB(x, SelectionRect.Bottom - 1, a)
	Next
End Sub

Public Sub IsValidSelection As Boolean
	Return SelectionRect.Width > 5 And SelectionRect.Height > 5
End Sub

Public Sub GetCroppedBitmap As B4XBitmap
	Dim fx As Float = OriginalBmp.Width / TargetBC.mWidth
	Dim fy As Float = OriginalBmp.Height / TargetBC.mHeight
	Return OriginalBmp.Crop(SelectionRect.Left * fx, SelectionRect.Top * fy, SelectionRect.Width * fx, SelectionRect.Height * fy)
End Sub

سپس در اکتیویتی اصلی این کدها را بنویسید

Sub Globals
	Private CropView1 As CropView
	Private xui As XUI
	Private run As RuntimePermissions
	
	Private out As OutputStream
	
	Private ImageView1 As ImageView
	Private Label2 As Label
	Private ImageView3 As ImageView
	Private ImageView2 As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("1")
	
End Sub

Sub CropView1_CropCompleted
	ImageView2.SetBackgroundImage(CropView1.GetCroppedBitmap)
End Sub
'وقتی برش عکس کامل میشه، این ساب اجرا میشه و برش در یک ایمیج ویو قرار میگیره

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Private Sub btn_save_Click
	out = File.OpenOutput(run.GetSafeDirDefaultExternal(""),DateTime.Now&".png",False)
	Dim bit1 As Bitmap
	bit1.Initialize3(ImageView1.Bitmap)
	bit1.WriteToStream(out,100,"PNG")
	out.Close
	
	ToastMessageShow("تصویر ذخیره شد",False)
End Sub
'ذخیره تصویر برش خورده در این بخش انجام میشه
'تصویر در پوشه امن اندروید ذخیره میشه
'در سورس های قبلی آموزش دادم که چگونه عکس رو در مثلا پوشه دانلود اندروید ذخیره کنید

Private Sub Button1_Click
	ImageView3.Visible=False
	
	CropView1.SetBitmap(xui.LoadBitmap(File.DirAssets, "pic.png"))
	
	Label2.Visible=True
	
	MsgboxAsync("تصویر پیشفرض انتخاب شد","")
End Sub
'در این ساب عکس اصلی حهت برش انتخاب میشه

نا ماژول را CropView بگذارید.

طراح و نویسنده
مرتضی صباغی
MR.B4A
https://eitaa.com/basic4androidlan
https://t.me/programmingwithb4a

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .
توجه: مطلب ارسالی شما پس از تایید مدیریت برای همه قابل رویت خواهد بود.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
  • اضافه کردن...