(TIỂU LUẬN) đề tài xây dựng ứng dụng chỉnh sửa ảnh

19 9 0
(TIỂU LUẬN) đề tài xây dựng ứng dụng chỉnh sửa ảnh

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Báo cáo đồ án tin học: Xây dựng phần mềm Đề tài: Xây dựng ứng dụng chỉnh sửa ảnh Thực bởi: Trần Minh Hải - 20161327 (trưởng nhóm) Bế Trần Văn - 20164603 Mục lục Lời mở đầu…………………………………………………………3 I Giới thiệu nhóm……………………………………………3-5 Giới thiệu chung…………………………………………… Mục tiêu, khó khăn cách tiếp cận…………………………4 Cách thức hoạt động………………………………………….4-5 a) Cách lam việc nhóm………………………………….4 b) Cách làm việc thành viên………………………… 4-5 c) Phân chia công việc cụ thể………………………………… d) Báo cáo tiến độ công việc theo tuần……………………… Những học sau dự án……………………………… 5 Kết làm việc đánh giá…………………………………5 II Hướng dẫn sử dụng……………………………………………6-16 Đối với người sử dụng……………………………………… 6-8 Đối với người phát triển………………………………………8-16 a) Thiết kế hệ thống…………………………………………… b) Thiết kế giao diện……………………………………………9-11 i Phác thảo logo công cụ vẽ máy tính…………9-10 ii Thiết kế giao diện android studio……………… 10-11 iii Sử dụng resources…………………………………… 11 c) Lập trình cho hệ thống……………………………………… 12-15 i Các class có hệ thống……………………………… 1214 ii Các bẫy lỗi sử dụng………………………………… 15 d) Đánh giá…………………………………………………….15 e) Định hướng phát triển……………………………………… 1516 III Thảo luận………………………………………………………1617 IV Kết luận……………………………………………………… 17 Lời mở đầu Chụp ảnh nhu cầu cần thiết sống Để có ảnh đẹp, ghi lại khoảnh khắc đáng nhớ, thiếu ứng dụng chỉnh sửa ảnh Chính điều này, nhóm V_CH group định làm ứng dụng chỉnh sửa ảnh có tính cạnh tranh Ứng dụng cần đảm bảo yếu tố: đủ số công cụ chỉnh sửa màu sắc, tốc độ nhanh dung lượng thấp Từ đó, ứng dụng tin tưởng người dùng Sau tháng triển khai, nhóm V_CH group phần hồn thành tiêu Chúng em xin phép cảm ơn thầy Vũ Hải, người hướng dẫn chúng em thực dự án Trưởng nhóm V_CH group, Trần Minh Hải I Giới thiệu nhóm 1.Giới thiệu chung Nhóm có tên VCH_Group, với VCH lấy theo ba chữ đầu tronng tên ba thành viên ban đầu nhóm gồm Văn , Hải Cường Nhóm thành lập nhằm phát triển ứng dụng chỉnh sửa ảnh có đầy đủ cơng cụ hoạt động tảng android 4.0 trở nên Hiện nhiều nguyên nhân khách quan VCH_Group có hai thành viên hoạt động thường xuyên gồm: - Trần Minh Hải (trưởng nhóm) - Bế Trần Văn Ngồi ra, khơng thể khơng kể đến hỗ trợ đắc lực, với lời nhận xét thẳng thắn khách quan đến từ thầy Vũ Hải với tập thể bạn lớp CLC_THCN K61 2.Mục tiêu, khó khăn cách tiếp cận  Mục tiêu bắt đầu dự án:  Ra ứng dụng chỉnh sửa ảnh điện thoại với công cụ  Các thành viên thực dự án, hiểu dự án có khả thuyết trình cơng việc dự án kết thúc  Ứng dụng có tốc độ nhanh dung lượng nhẹ  Khó khăn: Chun mơn thành viên chưa đồng đều, chưa sử dụng phần mềm android studio thành thục Kỹ làm việc nhóm cịn Chưa có kinh nghiệm thiết kế app tảng di động Thời gian làm việc hạn chế  Cách tiếp cận: Mơ hình thác nước Chun mơn hóa thành viên 3.Cách thức hoạt động a Cách làm việc nhóm Phân chia cơng việc sau báo cáo vào buổi chiều thứ hàng tuần Họp online qua facebook giải khó khăn b Cách àm việc thành viên Nhận công việc phù hợp với khả cá nhân Có trách nhiệm với công việc thân, giúp đỡ thành viên khác Mỗi thành viên người giám sát với thành viên khác nhóm c Phân chia công việc cụ thể Trần Minh Hải: Hồn thành cơng cụ cho app chỉnh sửa ảnh, thư kí nhóm Bế Trần Văn: Thiết kế tạo thành giao diện cho app Tạo quản lí blog để phân chia cơng việc cho cá nhân theo tuần d.Báo cáo tiến độ theo tuần 4.Những học sau dự án Làm việc: - Cách làm việc nhóm: Phân chia cơng việc - Vai trị làm việc có chiến lược(thác nước) - Tạo quản lí blogger Thuyết trình viết báo cáo đồ án Kĩ thuật: - Làm việc android studio: biết cách thiết kế user interface lập trình java cho ứng dụng - Xây dựng ứng dụng dễ đọc cho người phát triển sau(resources) 5.Kết làm đánh giá Nhóm phát triển thành công ứng dụng chỉnh sửa ảnh tảng android phù hợp với tiêu chí ứng dụng nhanh gọn Mặc dù ứng dụng có cơng cụ filter color ảnh hạn chế mặt thời gian có biến động số lượng thành viên nhóm, thành cơng bước đầu tảng vững để nhóm tiếp tục phát triển ứng dụng , ứng dụng khác tảng android tương lai Định hướng phát triển ứng dụng: - Thêm công cụ crop, add text, emoji… - Hoàn thiện chức load ảnh - Hoàn thiện chức cài đặt II Hướng dẫn sử dụng Đối với người sử dụng Để sử dụng ứng dụng chỉnh sửa ảnh này, người sử dụng cần cung cấp cho quyền truy cập vào nhớ thiết bị Ứng dụng chỉnh sửa ảnh gồm hoạt động chính:  Phần mở đầu ứng dụng: Trong hoạt động này, người sử dụng có lựa chọn sau:  Nhấn vào hình ảnh đại diện lớn nhóm hình để tới hoạt động tải ảnh lên sửa  Nhấn vào dòng chữ:”For more information about us”, hộp tin nhắn lên sau:”If you keep this action, the editor application will be paused” Tới đây, người dùng có lựa chọn Nếu ấn cancel, người dùng trở lại hình mở đầu ứng dụng Nếu ấn OK, người dùng di chuyển tới blogger nhóm  Màn hình tải ảnh để chỉnh sửa: Trong hoạt động này, người dùng nhìn thấy ảnh lớn với dịng chữ:”Chọn ảnh đi” Người dùng ấn vào ảnh này, có hộp tin nhắn lên, yêu cầu người dùng sử dụng thực thao tác chọn gallery Cuối người dùng chọn ảnh  Màn hình chỉnh sửa ảnh: Trong hoạt động chỉnh sửa ảnh, chúng tơi có cung cấp 17 mẫu lọc màu cho ảnh: Normal, Struck, Clarendon, OldMan, Mars, Rise, April, Amazon, Starlit, Whisper, Lime, Haan, BlueMess, Adele, Cruz, Metropolis, Audrey Sau chọn lọc màu sắc trên, người dùng lưu trữ lại ảnh cách ấn vào nút SAVE bên góc phải (Người dùng cần ý, ảnh lưu trữ vào ảnh ban đầu) Nếu ảnh save được, có dịng chữ lên phía cuối hình:”Image saved to gallery” Bên cạnh dịng chữ này, có chữ OPEN màu đỏ Nhấn vào nút để tới gallery, nơi ảnh vừa sửa lưu trữ Nếu ảnh khơng thể lưu trữ, có dịng chữ lên phía cuối hình là:”Unable to save image!” Sau đó, người dùng tiếp tục hoạt động chỉnh sửa ảnh cách ấn vào ảnh to hình để load ảnh khác Đối với người phát triển Ứng dụng chỉnh sửa ảnh V_CH group xây dựng phát triển tảng phần mềm Android Studio Ngơn ngữ sử dụng JAVA Chính người phát triển cần cài đặt phần mềm Android Studio máy tính Link tải phần mềm đính kèm sau đây: https://developer.android.com/studio Sau đó, cần tải cài đặt JDK máy tính từ trang web sau: https://www.oracle.com/technetwork/java/javase/downloads/index h tml Về phần thiết bị để chạy ứng dụng, người dùng có lựa chọn Lựa chọn sử dụng Virtual device Để cài đặt Virtual device, người phát triền tham khảo cách cài đặt sau đây: https://www.youtube.com/watch?v=Wx4KWPZhSHc Lựa chọn sử dụng thiết bị di động người phát triển Người phát triển lựa chọn cách tham khảo link đây: https://www.youtube.com/watch?v=p2oHD-06YcM Mỗi ứng dụng android gồm phần chính: user interface hay UI (được hiển thị file.xml) code cho user interface Trong ứng dụng chỉnh sửa ảnh này, sử dụng ngơn ngữ JAVA Chính vậy, để hiểu phần lập trình cho ứng dụng này, người đọc cần có hiểu biết ngơn ngữ lập trình JAVA ngơn ngữ xml Về ngơn ngữ xml cho thiết kế giao diện, tham khảo nhiều trang web: https://www.tutorialspoint.com/android/index.htm Về ngôn ngữ JAVA, người phát triển đọc qua sách: Beginning Android® Programming with Android Studio 4th Edition (J.F.DiMarzio) Để lập trình thiết kế cho hệ thống này, cần thêm vào dependencies thuộc build.gradle (Module app): implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:design:28.0.0' implementation 'com.karumi:dexter:4.1.0' implementation 'info.androidhive:imagefilters:1.0.7' Imagefilter, chỉnh sửa từ thư viện AndroidHive, ứng dụng này, sử dụng để sử dụng công cụ color filters Dexter dùng để request runtime permission tải ảnh, lưu ảnh dễ dàng a) Thiết kế hệ thống b)Thiết kế giao diện i Phác thảo logo cơng cụ vẽ máy tính Logo app nhóm: ii Thiết kế giao diện android studio  Các view sử dụng app: - TextView: nhiệm vụ TextView hiển thị dịng văn hình dung nhằm cung cấp thơng tin cho người dùng Người lập trình thay đổi nội dung dịng văn cách sử dụng câu lệnh android:text= “information” - ImageView: view dùng để thị hình ảnh lên hình sử dụng Các hình ảnh tài nguyên lưu trữ app hay hình ảnh tải xuống từ nhớ máy hay internet - Button: button tiếp nhận hành động click người dùng thực thao tác lập trình từ trước - Các View Group: Recyclerview, Toolbar, LinearLayout, ConstraintLayout, RelativeLayout, CoordinatorLayout  Layout: Các layout View (cụ thể kế thừa thừa ViewGroup) thiết kế với mục đích chứa View điều khiển, xếp vị trí View hình, layout có chế điều khiển vị trí View riêng Các layout thiết kế app: Activity_starting.xml: ConstraintLayout cho phép điều chỉnh vị trí ứng sử view 10 cách dàng buộc đơn giản vào view Trong activity_starting.xml thiết kế view textview imageview Textview dùng để hiển thị dòng văn bản: “for more information about us” Imageview dùng để hiển thị logo app - Activity_loading.xml: CoordinatorLayout thiết kế nhằm mục đích có tương tác view Trong activity_loading.xml có chứa layout appbarlayout layout_content Trong appbarlayout sử dụng toolbar có chứa button textview, button với chức điều hướng button lại thực chức save ảnh, textview hiển thị dòng văn VCH_Filter - Layout_content.xml: RelativeLayout cho phép xếp view vị trí mà người thiết kế muốn Như nói lay_content layout activity_loading.xml có chứa view imageview, NonSwipeableViewPager tablayout - Fragment_filter_list.xml: FrameLayout cung cấp vùng hình hiển thị view Recyclerview Recyclerview hiển thị tập item gồm màu sắc khác lọc ảnh Nó cho phép thao tác scroll hình theo chiều ngang Thumbnail_item.xml: LinearLayout cho phép view xếp nối cột Nó gồm view textview dùng để hiển thị dòng text: “filter name” imageview iii Sử dụng values resources Việc sử dụng Values thiết kế giao diện ứng dụng tất yếu Việc sử dụng Resources làm cho việc thiết kế trở nên rõ ràng cho người phát triển Chính vậy, để có phần thiết kế hoàn chỉnh, người thiết kế cần sử dụng mục: colors, strings, styles Các màu sắc, dòng chữ styles dùng thiết kế cần lưu trữ mục tên Chẳng hạn, dự án có dịng chữ:”For more information about us”, cần lưu trữ vào mục Strings, để người phát triển sau nắm rõ dịng chữ hiển thị giao diện người dùng c)Lập trình cho hệ thống i Các class có hệ thống Hệ thống xây dựng lớp chính: 11  Starting Activity: Trong lớp xử lý nút startingButton informationButton Núi startingButton sử dụng Intent để dẫn sang LoadingActivity Nút informationButton, sử dụng Intent, chuyển người dùng đến blogger nhóm Bên cạnh đó, sau người dùng nhấn vào nút informationButton này, có dịng gạch chân dịng chữ “For more information about us” Để thực điều này, sử dụng phương thúc TextView setPaintFlags Thêm nữa, informationButton, AlertDialog.Builder thêm vào, nhằm mục đích mở tin nhắn cho người dùng: tiếp tục dừng lại ứng dụng Khi đoạn nhắn lên, để có lựa chọn “OK” “Cancel” cho người sử dụng, cần dùng đến setPositiveButton setNegativeButton AlertDialog.Builder Cuối cùng, tạo AlertDialog dùng hàm show() AlertDialog để thị hộp thoại  Loading Activity: nơi xử lý phần tải ảnh để chỉnh sửa, chỉnh sửa ảnh lưu trữ lại ảnh sau chỉnh sửa - Tải ảnh lên để chỉnh sửa: Chúng không sử dụng cách thông thường dùng button để tải ảnh lên, thay vào đó, sử dụng “ImageView” Để truyền ảnh với dịng chữ: “Chọn ảnh đi” (loading_image) vào ImageView, chúng tơi viết hàm loadImage() Trong hàm này, sử dụng thuộc tính kiểu trả Bitmap: originalBitmap, filterBitmap, finalBitmap Thuộc tính giá trị originalBitmap (để tránh trường hợp loading_image khơng bị crash q trình tải lên, chúng tơi có viết lớp BitmapUtils với phương thức getBitmapFromAssets Asset nơi chứa loading_image Phương thức cho phép lấy ảnh, crop theo độ dài độ rộng cho trước) truyền vào thuộc tính img_preview, sử dụng nút để tải ảnh thuộc tính kiểu trả Bitmap cịn lại dùng trường hợp người dùng lưu trữ loading_image Khi đó, khơng có lỗi xảy Sau truyền ảnh loading_image vào img_preview, tiến tới truyền khả tải ảnh vào img_preview Các hàm cần viết thêm BitmapUtils (sử dụng phương thức getBitmapFromGallery) Trong lớp LoadingActivity, có phương thức loadImage Đây phương thức xử lí “onClick” image_preview layout_content.xml Để load ảnh, cần phương thức openImageFromGallery hàm tên Hàm xử 12 dụng thư viện Dexter để dễ dàng tải ảnh lên Để tải ảnh lên, cần quyền truy cập vào nhớ thiết bị: READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE Nếu người dùng không cấp quyền truy cập, dòng text, nội dung Permission, lên nhờ sử dụng Toast.makeText Ngược lại, Intent giúp tải ảnh lên sử dụng startActivityForResult Sau đó, phương thức onActivityResult, originalBitmap, filterBitmap, finalBitmap, cập nhật bitmap ảnh vừa tải cuối cùng, img_preview nhận ảnh này: img_preview.setImageBitmap(originalBitmap) trước ảnh filter màu sắc đồng loạt update lại ảnh - Chỉnh sửa ảnh: phục vụ cho chỉnh sửa ảnh, viết interface: FilterListFragmentListener lớp: ThumbnailAdapter, ViewPageAdapter FilterListFragment ViewPageAdapter giới thiệu mục b) thiết kế giao diện cho hệ thống Tại lớp FilterListFragment, phương thức setListener sử dụng phương thức interface FilterListFragmentListener để tạo default cho filter màu sắc, sau người dùng vào hoạt động chỉnh sửa ảnh Bên cạnh đó, phương thức onCreateView tạo Khi biến kiểu trả FilterListFragment tạo LoadingActivity (setupViewPager), onCreateView chạy, truyền filter màu sắc thư viện AndroidHive với hỗ trợ phương thức DisplayThumbnail lớp lớp ThumbnailAdapter Sau đó, ảnh vừa tải lên truyền vào ảnh filter Nếu ảnh tải lên có giá trị Bitmap null loading_image thay Trong lớp LoadingActivity, phương thức onFilterSelected, filter màu sắc chọn, thuộc tính filterBitmap thay đổi màu sắc: filterBitmap= originalBitmap.copy(Bitmap.Config.ARGB_8888, true) img_preview finalBitmap cập nhật thay đổi - Lưu trữ ảnh: Chúng thực việc lưu trữ ảnh nhờ vào thư viện Dexter Trước đó, chúng tơi có u cầu người dùng cho quyền đọc viết vào nhớ thiết bị: Dexter.withActivity(this) withPermissions(Manifest.permission.READ_E XTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE) 13 Nếu người dùng khơng cấp quyền truy cập, dịng text, nội dung Permission, lên nhờ sử dụng Toast.makeText Bắt đầu lớp LoadingActivity, phương thức onOptionsItemSelected, sau người dùng ấn vào nút save, phương thức saveImage() gọi Sau quyền truy cập vào nhwos thiết bị đáp ứng, với trợ giúp phương thức insertImage hàm BitmapUtils đề cập bên trên, ảnh lưu lại: final String path = BitmapUtils.insertImage(getContentResolver(), finalBitmap, System.currentTimeMillis() + "_profile.jpg", null); Tuy nhiên, có trường hợp xảy ra: ảnh lưu lại khơng thể lưu lại ảnh Trường hợp lưu lại ảnh xảy nhớ thiết bị đầy Chính vậy, cần có báo hiệu cho người dùng: Snackbar snackbar = Snackbar.make(coordinatorLayout, "Unable to save image!", Snackbar.LENGTH_LONG); Trường hợp lại, ảnh lưu lại, có dịng text thể ảnh lưu lại: Snackbar snackbar = Snackbar.make(coordinatorLayout, "Image saved to gallery!", Snackbar.LENGTH_LONG).setAction("OPEN", new View.OnClickListener(){ @Override public void onClick(View v) { openImage(path); } }); Bên cạnh dòng chữ này, để có link dẫn đến ảnh vừa lưu, viết thêm phương thức openImage Tại phương thức này, sử dụng intent để đến nơi lưu trữ ảnh ii Các bẫy lỗi sử dụng Trong trình xây dựng ứng dụng này, nhóm V_CH group chủ yếu đặt bẫy lỗi truyền ảnh loading_image vào image_preview, tải ảnh lên lưu trữ ảnh sau chỉnh sửa Bẫy lỗi truyền ảnh loading_image vào image_preview Dạng bẫy lỗi sử dụng: IOException Bẫy lỗi đặt phịng trường hợp người phát triển qn khơng đưa loading_image vào assets file Khi ấy, hệ thống in chỗ bị sai e.printStackTrace(); 14 Bẫy lỗi tải ảnh chỉnh sửa Lỗi xảy người dùng không cung cấp quyền truy cập vào nhớ thiết bị Ở đây, sử dụng bẫy lỗi dạng mệnh đề if else Khi lỗi xảy ra, hệ thống in báo hiệu: Toast.makeText(LoadingActivity.this, "Permission", Toast.LENGTH_SHORT).show(); Bẫy lỗi lưu trữ ảnh sau chỉnh sửa Tương tự tải ảnh lên, người dùng không cung cấp quyền truy cập hệ thống in cảnh báo tương tự Bên cạnh đó, cịn có lỗi nhớ thiết bị đầy, khơng cịn chỗ trống để lưu trữ ảnh chỉnh sửa d)Đánh giá Như đề cập phần mục tiêu, khó khăn cách tiếp cận, ban đầu, chúng tơi đề mục tiêu cần phải thực hiện:  Ra ứng dụng chỉnh sửa ảnh điện thoại với công cụ  Ứng dụng có tốc độ nhanh dung lượng nhẹ  Các thành viên thực dự án, hiểu dự án có khả trình bày cơng việc dự án kết thúc Hiện nay, chúng tơi hồn thành mục tiêu 3, tương ứng với 66% mục tiêu đề Nhóm hồn thành cơng cụ chỉnh sửa ảnh điện thoại demo buổi trình bày cuối Cũng buổi này, thành viên hoạt động hiểu trình bày rõ ràng phần cơng việc mà nhận hồn thành Mục tiêu thứ xây dựng ứng dụng có tốc độ nhanh dung lượng nhẹ, nhóm tiếp tục hồn thiện thời gian tới e)Định hướng phát triển Trong thời gian tới, mục tiêu nhóm tối ưu hóa tốc độ phần mềm cải thiện tốc độ Bên cạnh đó, q trình tháng vừa rồi, nhóm nghiên cứu cơng cụ chỉnh sửa ảnh crop, rotate phần setting cho ứng dụng Chính vậy, việc tích hợp công cụ nằm phần phát triển thời gian tới Tách hoạt động chỉnh sửa ảnh khỏi hoạt động tải ảnh lên trăn trở người xây dựng công cụ Đây mục tiêu quan trọng thời gina tới Không giúp ứng dụng trở nên chuyên nghiệp hơn, việc tách hoạt động làm tăng hiểu biết lớp Bitmap, cơng cụ đắc lực Android Studio Hồn thành công việc chuyên môn đề phần đòi hỏi cải thiện cách làm việc thành viên Trong đó, cần phân chia cơng việc phù hợp với khả người Thêm nữa, thành viên cần có trách nhiệm với phần việc mà nhận, hồn thành hạn Tuy vậy, cần tránh trường 15 hợp làm việc qua loa, đối phó để hồn thành hạn Nếu khơng thể hoàn thành hạn, cần báo cáo lại với nhóm trước ngày định trước để nhóm sớm giải trục trặc Cuối cùng, cần đẩy mạnh cập nhật tiến độ làm việc mục tiêu blogger nhóm Bởi lẽ, có cơng việc mà nhóm khơng thể làm Khi ấy, để giải thắc mắc, giáo viên hướng dẫn cần biết tiến độ, chỗ vướng mắc, mà đây, blogger công cụ hiệu để cập nhật cho người ngồi khơng nằm nhóm III Thảo luận 1) Cách làm việc nhóm - Trong q trình làm việc, thấy, xếp thời gian để gặp gỡ trao đổi với thành viên nhóm trước sau buổi báo cáo định kì thúc đẩy tính gắn kết thành viên Thêm nữa, buổi họp làm cho thành viên nhóm hiểu dự án, tiến độ công vệc, khúc mắc thành viên có với cơng việc Đây tiền đề cho cách giải đến với vấn đề va chạm phải trình làm việc - Làm việc qua mạng giải pháp để giải vấn đề xếp thời gian, thành viên đến buổi họp - Khi có mâu thuẫn xảy thành viên, cần trao đổi trực tiếp với nhau, tránh tình trạng giữ bực bội người mà làm ảnh hưởng đến kết công việc Chẳng hạn, việc so bì khối lượng cơng việc người với người khác mẫu thuẫn thường xảy làm việc nhóm Khi ấy, cần trao đổi trực tiếp để thành viên cảm thấy cơng hài lịng với phần việc nhận 2) Phát triển hệ thống Để phục vụ cho mục tiêu ban đầu tốc độ dung lượng ứng dụng, cần thiết thiết kế thư viện riêng, bao gồm công cụ sử dụng ứng dụng Trong ứng dụng chúng tơi hồn thiện, thư viện androidHive đưa vào Bên cạnh công cụ chỉnh sửa ảnh hữu hiệu thư viện đưa vào dự án, có cơng cụ khơng sử dụng crop, add image,… Chính điều làm tăng dung lượng ứng dụng Hay việc để nhiều phương thức lớp lớp loadingActivity làm làm giảm tốc độ activity chạy Để giải việc này, thiết cần tách hoạt động chỉnh sửa ảnh hoạt động tải ảnh cần chỉnh sửa IV Kết Luận 16 Sau tháng hoạt động, ứng dụng xây dựng phát triển gần kì vọng Tuy vậy, chúng tơi cần nỗ lực nhiều để hoàn thiện ứng dụng chỉnh sửa ảnh này, phục vụ tốt cho người dùng Cuối cùng, xin lần cảm ơn thành viên nhóm cống hiến suốt thời gian Xin phép cảm ơn thầy giáo Vũ Hải giúp đỡ chúng em trình xây dựng ứng dụng Main: package com.example.v_chproject; import import import import import android.Manifest; android.content.Intent; android.graphics.Bitmap; android.net.Uri; android.support.annotation.Nullable; import import import import import import import import import import import android.support.v4.view.ViewPager; android.support.v7.app.AppCompatActivity; android.os.Bundle; android.support.v7.widget.Toolbar; android.text.TextUtils; android.view.Menu; android.view.MenuItem; android.view.View; android.widget.Button; android.widget.ImageView; android.widget.Toast; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import com.example.v_chproject.Adapter.ViewPageAdapter; import com.example.v_chproject.Interface.FilterListFragmentListener; import com.example.v_chproject.Utils.BitmapUtils; import com.karumi.dexter.Dexter; import com.karumi.dexter.MultiplePermissionsReport; import com.karumi.dexter.PermissionToken; import com.karumi.dexter.listener.PermissionRequest; import com.karumi.dexter.listener.multi.MultiplePermissionsListener; import com.zomato.photofilters.imageprocessors.Filter; import com.zomato.photofilters.imageprocessors.subfilters.BrightnessSubFilter; import com.zomato.photofilters.imageprocessors.subfilters.ContrastSubFilter; import com.zomato.photofilters.imageprocessors.subfilters.SaturationSubfilter; import java.io.IOException; import java.util.List; public class LoadingActivity extends AppCompatActivity implements FilterListFragmentListener{ public static final String pictureName = "loading_image.png"; public static final int PERMISSION_PICK_IMAGE = 1000; ImageView img_preview; TabLayout tabLayout; ViewPager viewPager; CoordinatorLayout coordinatorLayout; Bitmap originalBitmap, filterBitmap, finalBitmap; FilterListFragment filterListFragment; /* load native image filters library */ static { System.loadLibrary("NativeImageProcessor"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loading); Toolbar toolbar = findViewById(R.id.toolBar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle("V_CH Filter"); img_preview = (ImageView) findViewById(R.id.image_preview); 17 tabLayout = (TabLayout) findViewById(R.id.tabs); viewPager = (ViewPager) findViewById(R.id.viewPager); coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator); loadImage(); setupViewPager(viewPager); tabLayout.setupWithViewPager(viewPager); } private void loadImage() { originalBitmap = BitmapUtils.getBitmapFromAssets(this, pictureName, 300, 300); filterBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true); finalBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true); img_preview.setImageBitmap(originalBitmap); } private void setupViewPager(ViewPager viewPager) { ViewPageAdapter adapter = new ViewPageAdapter(getSupportFragmentManager()); filterListFragment = new FilterListFragment(); filterListFragment.setListener(this); adapter.addFragment(filterListFragment, "Filters"); } viewPager.setAdapter(adapter); @Override public void onFilterSelected(Filter filter) { filterBitmap= originalBitmap.copy(Bitmap.Config.ARGB_8888, true); img_preview.setImageBitmap(filter.processFilter(filterBitmap)); finalBitmap = filterBitmap.copy(Bitmap.Config.ARGB_8888, true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_save) { saveImage(); return true; } return super.onOptionsItemSelected(item); } private void saveImage() { Dexter.withActivity(this) withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE) withListener(new MultiplePermissionsListener() { @Override public void onPermissionsChecked(MultiplePermissionsReport report) { if (report.areAllPermissionsGranted()) { try { final String path = BitmapUtils.insertImage(getContentResolver(), finalBitmap, System.currentTimeMillis() + "_profile.jpg", null); if (!TextUtils.isEmpty(path)) { Snackbar snackbar = Snackbar.make(coordinatorLayout, "Image saved to gallery!", Snackbar.LENGTH_LONG).setAction("OPEN", new View.OnClickListener() { @Override public void onClick(View v) { openImage(path); } }); snackbar.show(); } else { Snackbar snackbar = Snackbar.make(coordinatorLayout, "Unable to save image!", Snackbar.LENGTH_LONG); snackbar.show(); } } catch (IOException e) { e.printStackTrace(); } } else { Toast.makeText(LoadingActivity.this, "Permission", Toast.LENGTH_SHORT).show(); } } 18 @Override public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { token.continuePermissionRequest(); } }).check(); } private void openImage(String path) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(path), "image/*"); startActivity(intent); } private void openImageFromGallery() { Dexter.withActivity(this) withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE) withListener(new MultiplePermissionsListener() { @Override public void onPermissionsChecked(MultiplePermissionsReport report) { if (report.areAllPermissionsGranted()) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, PERMISSION_PICK_IMAGE); } else { Toast.makeText(LoadingActivity.this, "Permission", Toast.LENGTH_SHORT).show(); } } @Override public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { token.continuePermissionRequest(); } }).check(); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (resultCode == RESULT_OK && requestCode == PERMISSION_PICK_IMAGE) { Bitmap bitmap = BitmapUtils.getBitmapFromGallery(this, data.getData(), 800, 800); originalBitmap.recycle(); finalBitmap.recycle(); filterBitmap.recycle(); originalBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); finalBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true); filterBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true); img_preview.setImageBitmap(originalBitmap); bitmap.recycle(); filterListFragment.displayThumbnail(originalBitmap); } } public void loadingImage(View view) { openImageFromGallery(); } } 19 ... Chụp ảnh nhu cầu cần thiết sống Để có ảnh đẹp, ghi lại khoảnh khắc đáng nhớ, thiếu ứng dụng chỉnh sửa ảnh Chính điều này, nhóm V_CH group định làm ứng dụng chỉnh sửa ảnh có tính cạnh tranh Ứng dụng. .. tải ảnh để chỉnh sửa, chỉnh sửa ảnh lưu trữ lại ảnh sau chỉnh sửa - Tải ảnh lên để chỉnh sửa: Chúng không sử dụng cách thông thường dùng button để tải ảnh lên, thay vào đó, chúng tơi sử dụng “ImageView”... động chỉnh sửa ảnh hoạt động tải ảnh cần chỉnh sửa IV Kết Luận 16 Sau tháng hoạt động, ứng dụng xây dựng phát triển gần kì vọng Tuy vậy, chúng tơi cần nỗ lực nhiều để hồn thiện ứng dụng chỉnh sửa

Ngày đăng: 08/12/2022, 03:36

Tài liệu cùng người dùng

Tài liệu liên quan