{"id":1223,"url":"https://github.com/Yummypets/YPImagePicker","last_synced_at":"2025-08-06T13:32:42.225Z","repository":{"id":37733324,"uuid":"97729528","full_name":"Yummypets/YPImagePicker","owner":"Yummypets","description":"📸 Instagram-like image picker \u0026 filters for iOS","archived":false,"fork":false,"pushed_at":"2025-07-14T14:01:23.000Z","size":537009,"stargazers_count":4412,"open_issues_count":152,"forks_count":990,"subscribers_count":66,"default_branch":"master","last_synced_at":"2025-08-04T07:38:57.121Z","etag":null,"topics":["camera","filter","gallery","image-picker","imagepicker","instagram","ios","library","photo","picker","picture","swift","video","ypimagepicker"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Yummypets.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":"freshos","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null}},"created_at":"2017-07-19T15:00:05.000Z","updated_at":"2025-07-31T19:14:10.000Z","dependencies_parsed_at":"2023-02-16T06:15:57.423Z","dependency_job_id":"87a304ca-eecd-4823-a597-85098bfd7460","html_url":"https://github.com/Yummypets/YPImagePicker","commit_stats":{"total_commits":692,"total_committers":85,"mean_commits":8.141176470588235,"dds":0.4624277456647399,"last_synced_commit":"2db04eb020e3ef03828d3207d85250e110fa5919"},"previous_names":[],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/Yummypets/YPImagePicker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yummypets%2FYPImagePicker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yummypets%2FYPImagePicker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yummypets%2FYPImagePicker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yummypets%2FYPImagePicker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Yummypets","download_url":"https://codeload.github.com/Yummypets/YPImagePicker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yummypets%2FYPImagePicker/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268866561,"owners_count":24320277,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-05T02:00:12.334Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["camera","filter","gallery","image-picker","imagepicker","instagram","ios","library","photo","picker","picture","swift","video","ypimagepicker"],"created_at":"2024-01-05T20:15:41.627Z","updated_at":"2025-08-06T13:32:42.212Z","avatar_url":"https://github.com/Yummypets.png","language":"Swift","funding_links":["https://opencollective.com/freshos"],"categories":["Hardware","Libs","Swift","Images [🔝](#readme)","OOM-Leaks-Crash"],"sub_categories":["Camera","Images","Other free courses","PhotoViewer"],"readme":"\u003ch1 align=\"center\"\u003e \u003cbr\u003e\u003cimg src=\"Images/logo/logotype_horizontal.png?raw=true\" alt=\"ypimagepicker\" width=\"512\"\u003e \u003cbr\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/Yummypets/YPImagePicker/master/Images/visual.jpg\" width=\"400px\" \u003e\n\n## YPImagePicker\n\nYPImagePicker is an instagram-like photo/video picker for iOS written in pure Swift. It is feature-rich and highly customizable to match your App's requirements.\n\n[![Language: Swift 5](https://img.shields.io/badge/language-swift%205-f48041.svg?style=flat)](https://developer.apple.com/swift)\n[![Version](https://img.shields.io/cocoapods/v/YPImagePicker.svg?style=flat)](http://cocoapods.org/pods/YPImagePicker)\n[![Platform](https://img.shields.io/cocoapods/p/YPImagePicker.svg?style=flat)](http://cocoapods.org/pods/YPImagePicker)\n[![SPM compatible](https://img.shields.io/badge/SPM-compatible-4BC51D.svg?style=flat)](https://swift.org/package-manager/)\n[![codebeat badge](https://codebeat.co/badges/9710a89d-b1e2-4e55-a4a2-3ae1f98f4c53)](https://codebeat.co/projects/github-com-yummypets-ypimagepicker-master)\n[![License: MIT](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat)](https://github.com/Yummypets/YPImagePicker/blob/master/LICENSE)\n[![GitHub tag](https://img.shields.io/github/release/Yummypets/YPImagePicker.svg)]()\n\n\n[Installation](#installation) - [Configuration](#configuration) - [Usage](#usage) - [Languages](#languages) - [UI Customization](#ui-customization)\n\n\nGive it a quick try :\n`pod repo update` then `pod try YPImagePicker`\n\n\u003cimg src=\"https://raw.githubusercontent.com/Yummypets/YPImagePicker/master/Images/library.PNG\" width=\"200px\" \u003e \u003cimg src=\"https://raw.githubusercontent.com/Yummypets/YPImagePicker/master/Images/photo.PNG\" width=\"200px\" \u003e \u003cimg src=\"https://raw.githubusercontent.com/Yummypets/YPImagePicker/master/Images/video.PNG\" width=\"200px\" \u003e \u003cimg src=\"https://raw.githubusercontent.com/Yummypets/YPImagePicker/master/Images/filters.PNG\" width=\"200px\" \u003e\n\nThose features are available just with a few lines of code!\n\n## Notable Features\n\n🌅 Library  \n📷 Photo  \n🎥 Video  \n✂️ Crop  \n⚡️ Flash  \n🖼 Filters  \n📁 Albums  \n🔢 Multiple Selection  \n📏 Video Trimming \u0026 Cover selection  \n📐 Output image size  \nAnd many more...\n\n## Installation\n\n#### Using [CocoaPods](http://cocoapods.org/)\n\nFirst, be sure to run `pod repo update` to get the latest version available.\n\nAdd `pod 'YPImagePicker'` to your `Podfile` and run `pod install`. Also, add `use_frameworks!` to the `Podfile`.\n\n```\ntarget 'MyApp'\npod 'YPImagePicker'\nuse_frameworks!\n```\n\n#### Using [Swift Package Manager](https://swift.org/package-manager/)\n\nOpen SPM dependency manager through `File \u003e Swift Packages \u003e Add Package Dependency...`.\n\nand insert repository URL:\n\n``https://github.com/Yummypets/YPImagePicker.git``\n\nTo add dependency in your own package, just specify a package in dependencies of your `Package.swift`:\n```swift\n.package(\nname: \"YPImagePicker\",\nurl: \"https://github.com/Yummypets/YPImagePicker.git\",\n.upToNextMajor(from: \"5.0.0\")\n)\n```\nNote: This has a minimum target iOS version of `12.0`.\n\n## Plist entries\n\nIn order for your app to access camera and photo libraries,\nyou'll need to add these `plist entries` :\n\n- Privacy - Camera Usage Description (photo/videos)\n- Privacy - Photo Library Usage Description (library)\n- Privacy - Microphone Usage Description (videos)\n\n```xml\n\u003ckey\u003eNSCameraUsageDescription\u003c/key\u003e\n\u003cstring\u003eyourWording\u003c/string\u003e\n\u003ckey\u003eNSPhotoLibraryUsageDescription\u003c/key\u003e\n\u003cstring\u003eyourWording\u003c/string\u003e\n\u003ckey\u003eNSMicrophoneUsageDescription\u003c/key\u003e\n\u003cstring\u003eyourWording\u003c/string\u003e\n```\n\n## Configuration\n\nAll the configuration endpoints are in the [YPImagePickerConfiguration](https://github.com/Yummypets/YPImagePicker/blob/master/Source/Configuration/YPImagePickerConfiguration.swift) struct.\nBelow are the default value for reference, feel free to play around :)\n\n```swift\nvar config = YPImagePickerConfiguration()\n// [Edit configuration here ...]\n// Build a picker with your configuration\nlet picker = YPImagePicker(configuration: config)\n```\n\n### General\n```Swift\nconfig.isScrollToChangeModesEnabled = true\nconfig.onlySquareImagesFromCamera = true\nconfig.usesFrontCamera = false\nconfig.showsPhotoFilters = true\nconfig.showsVideoTrimmer = true\nconfig.shouldSaveNewPicturesToAlbum = true\nconfig.albumName = \"DefaultYPImagePickerAlbumName\"\nconfig.startOnScreen = YPPickerScreen.photo\nconfig.screens = [.library, .photo]\nconfig.showsCrop = .none\nconfig.targetImageSize = YPImageSize.original\nconfig.overlayView = UIView()\nconfig.hidesStatusBar = true\nconfig.hidesBottomBar = false\nconfig.hidesCancelButton = false\nconfig.silentMode = true\nconfig.preferredStatusBarStyle = UIStatusBarStyle.default\nconfig.bottomMenuItemSelectedColour = UIColor(r: 38, g: 38, b: 38)\nconfig.bottomMenuItemUnSelectedColour = UIColor(r: 153, g: 153, b: 153)\nconfig.filters = [DefaultYPFilters...]\nconfig.maxCameraZoomFactor = 1.0\nconfig.fonts..\n```\n\n### Library\n```swift\nconfig.library.options = nil\nconfig.library.onlySquare = false\nconfig.library.isSquareByDefault = true\nconfig.library.minWidthForItem = nil\nconfig.library.mediaType = YPlibraryMediaType.photo\nconfig.library.defaultMultipleSelection = false\nconfig.library.maxNumberOfItems = 1\nconfig.library.minNumberOfItems = 1\nconfig.library.numberOfItemsInRow = 4\nconfig.library.spacingBetweenItems = 1.0\nconfig.library.skipSelectionsGallery = false\nconfig.library.preselectedItems = nil\nconfig.library.preSelectItemOnMultipleSelection = true\n```\n\n### Video\n```swift\nconfig.video.compression = AVAssetExportPresetHighestQuality\nconfig.video.fileType = .mov\nconfig.video.recordingTimeLimit = 60.0\nconfig.video.libraryTimeLimit = 60.0\nconfig.video.minimumTimeLimit = 3.0\nconfig.video.trimmerMaxDuration = 60.0\nconfig.video.trimmerMinDuration = 3.0\n```\n\n### Gallery\n```swift\nconfig.gallery.hidesRemoveButton = false\n```\n\n## Default Configuration\n\n```swift\n// Set the default configuration for all pickers\nYPImagePickerConfiguration.shared = config\n\n// And then use the default configuration like so:\nlet picker = YPImagePicker()\n```\n\nWhen displaying picker on iPad, picker will support one size only you should set it before displaying it: \n```\nlet preferredContentSize = CGSize(width: 500, height: 600);\nYPImagePickerConfiguration.widthOniPad = preferredContentSize.width;\n\n// Now you can Display the picker with preferred size in dialog, popup etc\n\n```\n\n## Usage\n\nFirst things first `import YPImagePicker`.  \n\nThe picker only has one callback `didFinishPicking` enabling you to handle all the cases. Let's see some typical use cases 🤓\n\n### Single Photo\n```swift\nlet picker = YPImagePicker()\npicker.didFinishPicking { [unowned picker] items, _ in\n    if let photo = items.singlePhoto {\n        print(photo.fromCamera) // Image source (camera or library)\n        print(photo.image) // Final image selected by the user\n        print(photo.originalImage) // original image selected by the user, unfiltered\n        print(photo.modifiedImage) // Transformed image, can be nil\n        print(photo.exifMeta) // Print exif meta data of original image.\n    }\n    picker.dismiss(animated: true, completion: nil)\n}\npresent(picker, animated: true, completion: nil)\n```\n\n### Single video\n```swift\n// Here we configure the picker to only show videos, no photos.\nvar config = YPImagePickerConfiguration()\nconfig.screens = [.library, .video]\nconfig.library.mediaType = .video\n\nlet picker = YPImagePicker(configuration: config)\npicker.didFinishPicking { [unowned picker] items, _ in\n    if let video = items.singleVideo {\n        print(video.fromCamera)\n        print(video.thumbnail)\n        print(video.url)\n    }\n    picker.dismiss(animated: true, completion: nil)\n}\npresent(picker, animated: true, completion: nil)\n```\n\nAs you can see `singlePhoto` and `singleVideo` helpers are here to help you handle single media which are very common, while using the same callback for all your use-cases \\o/\n\n### Multiple selection\nTo enable multiple selection make sure to set `library.maxNumberOfItems` in the configuration like so:\n```swift\nvar config = YPImagePickerConfiguration()\nconfig.library.maxNumberOfItems = 3\nlet picker = YPImagePicker(configuration: config)\n```\nThen you can handle multiple selection in the same callback you know and love :\n```swift\npicker.didFinishPicking { [unowned picker] items, cancelled in\n    for item in items {\n        switch item {\n        case .photo(let photo):\n            print(photo)\n        case .video(let video):\n            print(video)\n        }\n    }\n    picker.dismiss(animated: true, completion: nil)\n}\n```\n\n### Handle Cancel event (if needed)\n```swift\npicker.didFinishPicking { [unowned picker] items, cancelled in\n    if cancelled {\n        print(\"Picker was canceled\")\n    }\n    picker.dismiss(animated: true, completion: nil)\n}\n```\nThat's it !\n\n## Languages\n🇺🇸 English, 🇪🇸 Spanish, 🇫🇷 French 🇷🇺 Russian, 🇵🇱 Polish, 🇳🇱 Dutch, 🇧🇷 Brazilian, 🇹🇷 Turkish, 🇸🇾 Arabic, 🇩🇪 German, 🇮🇹 Italian, 🇯🇵 Japanese, 🇨🇳 Chinese, 🇮🇩 Indonesian, 🇰🇷 Korean, 🇹🇼 Traditional Chinese（Taiwan), 🇻🇳 Vietnamese, 🇹🇭 Thai, 🇨🇿 Czech, 🇮🇷 Farsi. \n\nIf your language is not supported, you can still customize the wordings via the `configuration.wordings` api:\n\n```swift\nconfig.wordings.libraryTitle = \"Gallery\"\nconfig.wordings.cameraTitle = \"Camera\"\nconfig.wordings.next = \"OK\"\n```\nBetter yet you can submit an issue or pull request with your `Localizable.strings` file to add a new language !\n\n## UI Customization\nWe tried to keep things as native as possible, so this is done mostly through native Apis.\n\n### Navigation bar color\n```swift\nlet coloredImage = UIImage(color: .red)\nUINavigationBar.appearance().setBackgroundImage(coloredImage, for: UIBarMetrics.default)\n// UIImage+color helper https://stackoverflow.com/questions/26542035/create-uiimage-with-solid-color-in-swift\n```\n\n### Navigation bar fonts\n```swift\nlet attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 30, weight: .bold) ]\nUINavigationBar.appearance().titleTextAttributes = attributes // Title fonts\nUIBarButtonItem.appearance().setTitleTextAttributes(attributes, for: .normal) // Bar Button fonts\n```\n\n### Navigation bar Text colors\n```swift\nUINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.yellow ] // Title color\nUINavigationBar.appearance().tintColor = .red // Left. bar buttons\nconfig.colors.tintColor = .green // Right bar buttons (actions)\n```\n\n## Original Project \u0026 Author\n\nThis project has been first inspired by [Fusuma](https://github.com/ytakzk/Fusuma)\nConsidering the big code, design changes, and all the additional features added along the way, this moved from a fork to a standalone separate repo, also for discoverability purposes.\nOriginal Fusuma author is [ytakz](http://ytakzk.me)\n\n## Core Team\n\u003ca href=\"https://github.com/S4cha\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Yummypets/YPImagePicker/master/Images/coreTeam1.png\" width=\"70px\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://github.com/NikKovIos\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Yummypets/YPImagePicker/master/Images/coreTeam2.png\" width=\"70px\"\u003e\n\u003c/a\u003e\n\n## Contributors 🙏\n[ezisazis](https://github.com/ezisazis),\n[hanikeddah](https://github.com/hanikeddah),\n[tahaburak](https://github.com/tahaburak),\n[ajkolean](https://github.com/ajkolean),\n[Anarchoschnitzel](https://github.com/Anarchoschnitzel),\n[Emil](https://github.com/heitara),\n[Rafael Damasceno](https://github.com/DamascenoRafael),\n[cenkingunlugu](https://github.com/https://github.com/cenkingunlugu)\n[heitara](https://github.com/heitara)\n[portellaa](https://github.com/portellaa)\n[Romixery](https://github.com/romixery)\n[shotat](https://github.com/shotat)\n[shalamowww](https://github.com/shalamowww)\n\nSpecial thanks to [ihtiht](https://github.com/ihtiht) for the cool looking logo!\n\n## They helped us one way or another 👏\n[userdar](https://github.com/userdar),\n[Evgeniy](https://github.com/Ewg777),\n[MehdiMahdloo](https://github.com/MehdiMahdloo),\n[om-ha](https://github.com/om-ha),\n[userdar](https://github.com/userdar),\n[ChintanWeapp](https://github.com/ChintanWeapp),\n[eddieespinal](https://github.com/eddieespinal),\n[viktorgardart](https://github.com/viktorgardart),\n[gdelarosa](https://github.com/gdelarosa),\n[cwestMobile](https://github.com/cwestMobile),\n[Tinyik](https://github.com/Tinyik),\n[Vivekthakur647](https://github.com/Vivekthakur647),\n[tomasbykowski](https://github.com/tomasbykowski),\n[artemsmikh](https://github.com/artemsmikh),\n[theolof](https://github.com/theolof),\n[dongdong3344](https://github.com/dongdong3344),\n[MHX792](https://github.com/MHX792),\n[CIronfounderson](https://github.com/CIronfounderson),\n[Guerrix](https://github.com/Guerrix),\n[Zedd0202](https://github.com/Zedd0202),\n[mohammadZ74](https://github.com/mohammadZ74),\n[SalmanGhumsani](https://github.com/SalmanGhumsani),\n[wegweiser6](https://github.com/wegweiser6),\n[BilalAkram](https://github.com/BilalAkram),\n[KazimAhmad](https://github.com/KazimAhmad),\n[JustinBeBoy](https://github.com/JustinBeBoy),\n[SashaMeyer](https://github.com/SashaMeyer),\n[GShushanik](https://github.com/GShushanik),\n[Cez95](https://github.com/Cez95),\n[Palando](https://github.com/Palando),\n[sebastienboulogne](https://github.com/sebastienboulogne),\n[JigneshParekh7165](https://github.com/JigneshParekh7165),\n[Deepakepaisa](https://github.com/Deepakepaisa),\n[AndreiBoariu](https://github.com/AndreiBoariu),\n[nathankonrad1](https://github.com/nathankonrad1),\n[wawilliams003](https://github.com/wawilliams003),\n[pngo-hypewell](https://github.com/pngo-hypewell),\n[PawanManjani](https://github.com/PawanManjani),\n[devender54321](https://github.com/devender54321),\n[Didar1994](https://github.com/Didar1994),\n[relaxsus](https://github.com/relaxsus)\n[restoflash](https://github.com/restoflash)\n\n## Dependency\nYPImagePicker relies on [prynt/PryntTrimmerView](https://github.com/prynt/PryntTrimmerView) for provide video trimming and cover features. Big thanks to @HHK1 for making this open source :)\n\n## Obj-C support\nObjective-C is not supported and this is not on our roadmap.\nSwift is the future and dropping Obj-C is the price to pay to keep our velocity on this library :)\n\n## License\nYPImagePicker is released under the MIT license.  \nSee [LICENSE](LICENSE) for details.\n\n## Swift Version\n\n- Swift 3 -\u003e version [**1.2.0**](https://github.com/Yummypets/YPImagePicker/releases/tag/1.2.0)\n- Swift 4.1 -\u003e version [**3.4.1**](https://github.com/Yummypets/YPImagePicker/releases/tag/3.4.0)\n- Swift 4.2 -\u003e version [**3.5.2**](https://github.com/Yummypets/YPImagePicker/releases/tag/3.5.2)\nreleases/tag/3.4.0)\n- Swift 5.0 -\u003e version [**4.0.0**](https://github.com/Yummypets/YPImagePicker/releases/tag/4.0.0)\n- Swift 5.1 -\u003e version [**4.1.2**](https://github.com/Yummypets/YPImagePicker/releases/tag/4.1.2)\n- Swift 5.3 -\u003e version [**4.5.0**](https://github.com/Yummypets/YPImagePicker/releases/tag/4.5.0)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FYummypets%2FYPImagePicker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FYummypets%2FYPImagePicker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FYummypets%2FYPImagePicker/lists"}