<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Technology – IMG.LY Blog</title><description>Posts tagged Technology on the IMG.LY blog.</description><link>https://img.ly/blog/tag/technology/</link><language>en-us</language><image><url>https://img.ly/apple-touch-icon.png</url><title>Technology – IMG.LY Blog</title><link>https://img.ly/blog/tag/technology/</link></image><atom:link href="https://img.ly/blog/tag/technology/rss.xml" rel="self" type="application/rss+xml"/><generator>Astro</generator><lastBuildDate>Fri, 19 Jun 2026 11:26:06 GMT</lastBuildDate><ttl>60</ttl><item><title>My digital journey to #nfts</title><link>https://img.ly/blog/my-digital-journey-to-nfts/</link><guid isPermaLink="true">https://img.ly/blog/my-digital-journey-to-nfts/</guid><pubDate>Fri, 26 Mar 2021 11:07:26 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-beginning&quot;&gt;&lt;strong&gt;The Beginning&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In my first years as a graphic designer, my world consisted mainly of paper, books and magazines. To give you an example, my bachelor and master thesis were both printed books (Yes - I am that old). So i was born analog, but i wanted to become more digital.&lt;/p&gt;
&lt;p&gt;In the last three years, I have done my own personal digitalization and transformed from the analog design world into a digital one to the point that last weekend I created and launched my first crypto art - an NFT.&lt;/p&gt;
&lt;h2 id=&quot;but-first--what-is-an-nft&quot;&gt;But First – What is an NFT?&lt;/h2&gt;
&lt;p&gt;I have read about NFTs before from time to time. Then, two weeks ago, the internet went wild about the news that a well-known New York gallery sold a digital painting worth $69 million for the first time. And this made me thinking a bit more about the subject again and I decided to join the hype. Let’s get rich!&lt;/p&gt;
&lt;p&gt;But what is a NFT and how does it work? NFT stands for &lt;strong&gt;N&lt;/strong&gt;on-&lt;strong&gt;F&lt;/strong&gt;ungible &lt;strong&gt;T&lt;/strong&gt;oken which is secured by the Ethereum blockchain. 1 ETH is a fungible token – like bitcoin – a digital currency that is exchangeable. However, in contrast to ETH, a NFT can represent ownership of unique items. These unique items can be digital art like an image or a video, or any other digital asset. Within the process of creating an NFT, the digital asset will get connected to the token - which is called “minting”. Even though that image can easily be copied or recreated, the NFT can prove to a third-party that a specific person or entity owns this token. This makes digital art verifiable and unique.&lt;/p&gt;
&lt;p&gt;What excites me so much about NFTs is that they make it possible to give digital art a real value. In addition it gives digital artists the opportunity to be perceived as artists in the same way as their colleagues who paint with brush and paint on canvas. So this means that digital art can finally step up to it’s physical counterpart. The beginning of a whole new era of art.&lt;/p&gt;
&lt;p&gt;Currently it feels like that one can basically mint everything to an NFT and people go crazy about it. Why? Because people always liked to collect special and rare things like stamps, pokemon cards, oil paintings and so on - the list is basically endless.&lt;/p&gt;
&lt;h2 id=&quot;going-digital&quot;&gt;&lt;strong&gt;Going digital&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Circling back to my own story about transforming from an analog world to a digital one, the first step was to make my work more digital. Three years ago I gave up being self-employment and started working as an art director at &lt;a href=&quot;https://img.ly&quot;&gt;IMG.LY&lt;/a&gt;. We do develop software for photo and video editing. Our first product was the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;Photoeditor SDK&lt;/a&gt; later followed by our &lt;a href=&quot;https://img.ly/products/video-sdk/&quot;&gt;Videoeditor SDK&lt;/a&gt;. However, last year we started defining our goals and begin the journey to transform our editor into a completely new tool that combines photo editing with automatic layouting. Automated and simplified processes make it possible for designer to focus more on the development of cool concepts instead of struggling with the technology itself.&lt;/p&gt;
&lt;p&gt;Some time ago - while testing the functions of our tool, I created a series of pixel-art images. In my opinion this pixel-art style fits the topic of NFTs quite well, so that I created a small series with three matching images, which got the name “Life behind Pixels”.&lt;/p&gt;
&lt;p&gt;One of these pictures was supposed to be my first NFT, but I had to realize that my digital transformation still has some gaps that I need to fill. There are various marketplaces that function like galleries, where one can upload their digital art for everyone to see and be verified as an official artist. I chose &lt;a href=&quot;https://rarible.com/&quot;&gt;Rarible&lt;/a&gt; because it has a rather small community compared to the big ones like e.g. &lt;a href=&quot;https://opensea.io/&quot;&gt;OpenSea&lt;/a&gt; and it is possible for everyone to join. Other marketplaces tend to select artists they work with based on the number of followers and how well-known they are in the community.&lt;/p&gt;
&lt;p&gt;If you want to create an NFT –  so called “minting” it, you have to connect your digital wallet to one of these platforms and pay a fee (gas) of about $60 in Ethereum. Unfortunately I don’t have a wallet or even digital money, so what can I do? I asked my boyfriend who works as firmware engineer in the &lt;a href=&quot;https://9elements.com/&quot;&gt;9elements&lt;/a&gt; cyber security department and who was of course already deep in the crypto universe and bang: My first NFT was minted. Now I’m even more fired up.&lt;/p&gt;
&lt;p&gt;And although this NFT topic is on everyone’s lips in the digital scene right now, I recently noticed in a clubhouse talk with other designers that this hasn’t arrived everywhere yet.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;here can you find our latest NFT art on &amp;quot;Rarible&amp;quot;: https://rarible.com/ellly&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1184px) 1184px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1184&quot; height=&quot;1120&quot; src=&quot;https://img.ly/_astro/rarible_screenshot_Z1O12ww.webp&quot; srcset=&quot;/_astro/rarible_screenshot_Z2ncPiV.webp 640w, /_astro/rarible_screenshot_3tJNG.webp 750w, /_astro/rarible_screenshot_Z1MBnja.webp 828w, /_astro/rarible_screenshot_Z2fYRIY.webp 1080w, /_astro/rarible_screenshot_Z1O12ww.webp 1184w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;and-now-what&quot;&gt;And now what?&lt;/h2&gt;
&lt;p&gt;First we are curious to see what happens with our first NFT and we are trying to find out what else is possible with it. Instead of attaching unique information to a simple image file and making it unique, there is a way more potential behind it: NFTs can be minted in a way that allows them to react to their environment using their integrated code. For example they can show a different state in the morning, at noon and in the evening or their appearance changes due to the number of attached wallets.&lt;/p&gt;
&lt;p&gt;Right now we’re looking at everything there is to know about NFT and blockchain to develop more crypto art and be part of the new era. Our plan is to create a new piece of crypto art every month. I’m trying to figure out what’s hot in crypto design right now. What do we need to stand out and be visually and technically unique?&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;OpenSea Marketplace&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1631px) 1631px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1631&quot; height=&quot;1152&quot; src=&quot;https://img.ly/_astro/opensa_screenshot_GfjqP.webp&quot; srcset=&quot;/_astro/opensa_screenshot_1ByYTL.webp 640w, /_astro/opensa_screenshot_Z1dpIHX.webp 750w, /_astro/opensa_screenshot_97NoO.webp 828w, /_astro/opensa_screenshot_Z1HIrX8.webp 1080w, /_astro/opensa_screenshot_1MY9dU.webp 1280w, /_astro/opensa_screenshot_GfjqP.webp 1631w&quot;&gt;&lt;/p&gt;
&lt;p&gt;And what are the options if you don’t have a friend working in the tech area?I think besides a monthly NFT, there could also be a monthly blogpost ;)&lt;/p&gt;
&lt;p&gt;Also check out Instagram and Twitter for daily updates!&lt;br&gt;
&lt;a href=&quot;https://www.instagram.com/ellly_pix&quot;&gt;https://www.instagram.com/ellly_pix&lt;/a&gt;  &lt;a href=&quot;https://twitter.com/ellly_pix&quot;&gt;https://twitter.com/ellly_pix&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A more technical deep dive can be found &lt;a href=&quot;https://ethereum.org/en/nft/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Despite the fact that I am super thrilled about NFTs and that I finally generated my own, there is also a lot of controversial discussion going on about the climate impact of NFTs and the energy consumed to mint digital assets. If you like to follow up with this discussion, I put together some interesting links where you can also find some alternatives to the “minting” process:&lt;/p&gt;
&lt;p&gt;Calculate the CO2 Footprint of your Ethereum address: &lt;a href=&quot;https://carbon.fyi/&quot;&gt;https://carbon.fyi/&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://www.greenpeace.org.uk/news/the-biggest-problem-with-carbon-offsetting-is-that-it-doesnt-really-work/&quot;&gt;h&lt;/a&gt;&lt;a href=&quot;https://www.greenpeace.org.uk/news/the-biggest-problem-with-carbon-offsetting-is-that-it-doesnt-really-work/&quot;&gt;ttps://www.greenpeace.org.uk/news/the-biggest-problem-with-carbon-offsetting-is-that-it-doesnt-really-work/&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://memoakten.medium.com/the-unreasonable-ecological-cost-of-cryptoart-2221d3eb2053&quot;&gt;https://memoakten.medium.com/the-unreasonable-ecological-cost-of-cryptoart-2221d3eb2053&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://www.hicetnunc.xyz/&quot;&gt;https://www.hicetnunc.xyz/&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://xtz.news/latest-tezos-news/getting-started-as-an-nft-artist-on-tezos-using-hicetnunc/&quot;&gt;https://xtz.news/latest-tezos-news/getting-started-as-an-nft-artist-on-tezos-using-hicetnunc/&lt;/a&gt;&lt;/p&gt;</content:encoded><dc:creator>Vanessa</dc:creator><media:content url="https://blog.img.ly/2021/03/ellly_blog_Zeichenfla-che-1.png" medium="image"/><category>Design</category><category>Creativity</category><category>Code</category><category>Technology</category><category>Insights</category></item><item><title>How to integrate a Photo Editor into your iOS App</title><link>https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-ios-app-ced008a7088b/</link><guid isPermaLink="true">https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-ios-app-ced008a7088b/</guid><description>7-minute Video Tutorial</description><pubDate>Wed, 10 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;This tutorial is going to walk you through the integration process of the PhotoEditor SDK for iOS. You’ll learn how to setup the editor in seven minutes using CocoaPods. We created similar tutorials for &lt;a href=&quot;https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-android-app-ee4148816e25/&quot;&gt;Android&lt;/a&gt; and &lt;a href=&quot;https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-website-4578cc6ef6f3/&quot;&gt;HTML5&lt;/a&gt;, so make sure to check those out as well.(Please make sure to get a trial license for the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; before integrating it.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/AHzD4Mnm-NA?feature=oembed&quot;&gt;https://www.youtube.com/embed/AHzD4Mnm-NA?feature=oembed&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;transcript&quot;&gt;&lt;strong&gt;Transcript&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;In this tutorial, we’re going to show you how to integrate the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; into your iOS app. We’re going to use Xcode and the &lt;a href=&quot;https://img.ly/docs/pesdk/&quot;&gt;PhotoEditor SDK’s documentation&lt;/a&gt;. So, first of all, we navigate to the “Getting Started” guide for iOS. We’re going to install the SDK using CocoaPods, because it is the recommended way to initialize this dependency.&lt;/p&gt;
&lt;p&gt;We create a new Xcode project and select the “Single View App” template. Then, we assign a name to our project. For this tutorial, we’ll go with “PhotoEditorApp.” Here, it is essential that the given bundle identifier is identical to the one you used to request your license with. We decide to save our project files to the documents folder and create the new project.&lt;/p&gt;
&lt;p&gt;Now, we change the iOS Deployment Target to version 9.0 as the SDK supports all iOS versions from 9.0 upwards, and thus, our app will be available for the highest possible number of devices. After that, we insert our previously downloaded license file into our app by simply dragging and dropping the file into our app’s folder. Here, it’s important that “Copy items if needed” is checked so that our license file will be copied to the appropriate place in our project instead of just being referenced.&lt;/p&gt;
&lt;p&gt;Now, we can close our Xcode project. We open our folder structure and see that our project has been created in the documents folder. Now, we need the terminal to install the PhotoEditor SDK via CocoaPods. We type &lt;code&gt;cd&lt;/code&gt; which is short for “change directory”, to change the directory of our source files. We can copy the project’s path via drag and drop. We now instruct CocoaPods to prepare Xcode for the use with CocoaPods by typing &lt;code&gt;pod init&lt;/code&gt;. After that, CocoaPods creates the file “podfile.” We open the podfile in a text editor by double-clicking.&lt;/p&gt;
&lt;p&gt;Here, we uncomment the second line and thus define that our project shall run from iOS version 9.0 upwards. Next, we copy this line (&lt;code&gt;pod &apos;PhotoEditorSDK&apos;&lt;/code&gt;) from the &lt;a href=&quot;https://img.ly/docs/pesdk/&quot;&gt;PhotoEditor SDK’s documentation&lt;/a&gt; and paste it under &lt;code&gt;# Pods for PhotoEditorApp&lt;/code&gt; to create a dependency between our project and the PhotoEditor SDK. We save the podfile and close the text editor. Now, we return to the terminal and instruct CocoaPods to install all dependencies by typing &lt;code&gt;pod install&lt;/code&gt; and executing our command with the return key.&lt;/p&gt;
&lt;p&gt;Here we can see that CocoaPods advises us to open our Xcode project with the xcworkspace file only. Furthermore, we see that there’s now a new folder called “pods.” Ideally, you wouldn’t check that folder into your source control system as it potentially contains large files, which can result in some issues. Github, for example, has a limit for the maximum file size, which the PhotoEditor SDK would exceed. So, it would be best if every user that works on the project activates &lt;code&gt;pod install&lt;/code&gt; to install the dependencies for each processing machine.&lt;/p&gt;
&lt;p&gt;Now, we can open the project file to incorporate our license into the file &lt;code&gt;AppDelegate.swift&lt;/code&gt;. We copy this line from our documentation and paste it under the method &lt;code&gt;UIApplication, didfinishLaunchingWithOptions&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;if let licenseURL = Bundle.main.url(forResource: &quot;license&quot;, withExtension: &quot;&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    PESDK.unlockWithLicense(at: licenseURL)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is important that we name our license file exactly like we did when we incorporated it into our project. In our case, that would be “ios_license” instead of “license.” Also, we can see that there is an error message, because we haven’t imported the PhotoEditor SDK yet. We simply type &lt;code&gt;**import** PhotoEditorSDK&lt;/code&gt;, and the issue is resolved. Now our project is prepared so that we can use the PhotoEditor SDK with an active license.&lt;/p&gt;
&lt;p&gt;Next, we’re going to prepare our app, so that it actually uses the PESDK. We configure our app with the &lt;code&gt;Main.storyboard&lt;/code&gt; by opening the &lt;code&gt;assistantview&lt;/code&gt; and creating a new button by just dragging and dropping it on the canvas. We’re going to use Alignment Constraints so that the button will always be displayed in the middle of the screen no matter the form factor of the device in use.&lt;/p&gt;
&lt;p&gt;We’re going to name our button after our app and link it from our storyboard with our source code on the right-hand side via drag and drop. Now, we’re going to set a name for our method that is going to be called once the button is pressed. For this tutorial, we’ll go with &lt;code&gt;startPhotoEditor&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We’ve decided that we want to start the PhotoEditor SDK with a CameraViewController. So, we copy the respective code from our documentation and paste it in the body of our method under &lt;code&gt;startPhotoEditor&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;let cameraViewController = CameraViewController()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;present(cameraViewController, animated: true, completion: nil)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When we save the file, we get yet another error message that the camera can’t be found because we haven’t imported the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; for this source file either. Once we’ve done that, the error message disappears.&lt;/p&gt;
&lt;p&gt;As we want our editor to start in camera mode, we have to create some entries in the Info.plist file that will allow us to use our device’s camera and grant access to our device’s image library. That is a restriction by Apple. If we didn’t create these entries, we wouldn’t be able to use our app as it would crash as soon as we open the camera. All necessary entries can be found under “Privacy.” First, we need “Camera Usage Description.” Here, we have to give a reason why we want access to our user’s camera. Said reason should be as meaningful as possible. For this tutorial, we’ll go with “We use your camera to take photos for editing.” We also want to allow the import of photos from the device’s library, so we add the identifier “Photo Library Usage Description” and type “We use your photos so that you can edit them” as description.&lt;/p&gt;
&lt;p&gt;Now, we can run the app in the simulator. If we wanted to run the app on a physical device, we’d have to provide an Apple iOS developer account under “Team” so that the app can be signed because only registered developers are allowed to install apps on physical devices. However, we’ll go with the simulator.&lt;/p&gt;
&lt;p&gt;*&lt;strong&gt;*Thanks for reading! To stay in the loop, subscribe to our&lt;/strong&gt; &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.**&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Felix</dc:creator><media:content url="https://blog.img.ly/2020/04/image-32.png" medium="image"/><category>iOS</category><category>App Development</category><category>CocoaPods</category><category>Tutorial</category><category>Technology</category><category>Tech</category><category>How-To</category><category>Learning</category></item><item><title>How to integrate a Photo Editor into your Website</title><link>https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-website-4578cc6ef6f3/</link><guid isPermaLink="true">https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-website-4578cc6ef6f3/</guid><description>4-minute Video Tutorial </description><pubDate>Wed, 10 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;This tutorial is going to walk you through the integration process of the PhotoEditor SDK into your website. You’ll learn how to setup the HTML5 editor in four minutes. We created similar tutorials for &lt;a href=&quot;https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-ios-app-ced008a7088b/&quot;&gt;iOS&lt;/a&gt; and &lt;a href=&quot;https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-android-app-ee4148816e25/&quot;&gt;Android&lt;/a&gt;, so make sure to check those out as well.(Please make sure to get a trial license for the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; before integrating it.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/9ZfEN3LMJU8?feature=oembed&quot;&gt;https://www.youtube.com/embed/9ZfEN3LMJU8?feature=oembed&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;transcript&quot;&gt;Transcript&lt;/h3&gt;
&lt;p&gt;In this tutorial, we’re going to show you how to integrate the PhotoEditor SDK for HTML5 into your website. We’re going to use Visual Studio Code and the &lt;a href=&quot;https://img.ly/docs/pesdk/&quot;&gt;PhotoEditor SDK’s documentation&lt;/a&gt;. So let’s get to it.&lt;/p&gt;
&lt;p&gt;We unzip the file and copy the &lt;code&gt;assets&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt; and &lt;code&gt;js&lt;/code&gt; folder. Those contain all the elements our editor needs to run properly. We paste the folders into our project folder. For this demo, we want to open a sample image with the editor, so we copy that into our folder as well.&lt;/p&gt;
&lt;p&gt;Here, we already opened our project’s folder with Visual Studio Code. Next, we’re going to create an HTML file that we’re going to use to build our site. We copy this code for the &lt;code&gt;&amp;#x3C;head&gt;&lt;/code&gt; section and paste it into our &lt;code&gt;index.html&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;!-- React Dependencies for the SDK UI --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;script src=&quot;js/vendor/react.production.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;script src=&quot;js/vendor/react-dom.production.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;!-- PhotoEditor SDK--&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;script src=&quot;js/PhotoEditorSDK.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;!-- PhotoEditor SDK UI --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;script src=&quot;js/PhotoEditorSDK.UI.DesktopUI.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;link rel=&quot;stylesheet&quot; href=&quot;css/PhotoEditorSDK.UI.DesktopUI.min.css&quot; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;/head&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here’s where we link to the JavaScript files from our &lt;code&gt;js&lt;/code&gt; folder. Please note that if you store the folder somewhere else, you have to adjust these paths accordingly. Also, this is where the css file for our desktop UI is loaded.&lt;/p&gt;
&lt;p&gt;Next, we’re going to add a &lt;code&gt;&amp;#x3C;body&gt;&lt;/code&gt; to our site. Then we’ll need a &lt;code&gt;&amp;#x3C;div&gt;&lt;/code&gt; where our editor is going to be displayed. For that, we can simply copy the snippet from the documentation.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;div id=&quot;editor&quot;&gt;&amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;&amp;#x3C;div&gt;&lt;/code&gt;’s ID is set to &lt;code&gt;editor&lt;/code&gt; so we can address it via JavaScript. Now, we copy this JavaScript snippet from the documentation so that the editor loads properly.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  window.onload = function () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    var image = new Image()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    image.onload = function () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        var container = document.getElementById(&apos;editor&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        var editor = new PhotoEditorSDK.UI.DesktopUI({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        container: container,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Please replace this with your license: https://www.photoeditorsdk.com/dashboard/subscriptions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        license: &apos;{&quot;owner&quot;:&quot;Imgly Inc.&quot;,&quot;version&quot;:&quot;2.1&quot;, ...}&apos;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        editor: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          image: image&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        assets: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          // This should be the absolute path to your `assets` directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          baseUrl: &apos;/assets&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // image.crossOrigin = &apos;Anonymous&apos;  // Setup CORS accordingly if needed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    image.src = &apos;./example.jpg&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We have already prepared our license file here. It is important to copy the entire content of the license file and paste it after &lt;code&gt;license&lt;/code&gt;. Also, it is important to insert the license as a string and not as a JavaScript object.&lt;/p&gt;
&lt;p&gt;Please make sure that under &lt;code&gt;baseUrl&lt;/code&gt; you have entered the correct path to your assets folder.&lt;/p&gt;
&lt;p&gt;Under &lt;code&gt;image.src&lt;/code&gt; we load our image. Please note that if you don’t load the image locally but from another source, say a server like an AWS S3 bucket, you have to setup CORS properly. We dedicated a whole section in our documentation to this issue, so make sure to check that out. However, as we’re going to load the image locally, we don’t have to mind that line.&lt;/p&gt;
&lt;p&gt;Finally, it is important that we create the editor after the image is loaded so that we can pass the image to the editor.&lt;/p&gt;
&lt;p&gt;Alright, we’re set. Now we can test everything by running a server. We’ll go with the SimpleHTTPServer.&lt;/p&gt;
&lt;p&gt;As we can see, everything runs properly. Thanks a lot for watching and see you next time.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That was all that is necessary to get the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; up and running. For your convenience, here’s the whole source code of the HTML file:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;!DOCTYPE html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;!-- React Dependencies for the SDK UI --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;script src=&quot;js/vendor/react.production.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;script src=&quot;js/vendor/react-dom.production.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;!-- PhotoEditor SDK--&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;script src=&quot;js/PhotoEditorSDK.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;!-- PhotoEditor SDK UI --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;script src=&quot;js/PhotoEditorSDK.UI.DesktopUI.min.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;link rel=&quot;stylesheet&quot; href=&quot;css/PhotoEditorSDK.UI.DesktopUI.min.css&quot; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;/head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;div id=&quot;editor&quot;&gt;&amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      window.onload = function () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        var image = new Image()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        image.onload = function () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            var container = document.getElementById(&apos;editor&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            var editor = new PhotoEditorSDK.UI.DesktopUI({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            container: container,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            // Please replace this with your license: https://www.photoeditorsdk.com/dashboard/subscriptions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            license: &apos;{&quot;owner&quot;:&quot;Imgly Inc.&quot;,&quot;version&quot;:&quot;2.1&quot;, ...}&apos;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            editor: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              image: image&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            assets: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              // This should be the absolute path to your `assets` directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              baseUrl: &apos;/assets&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // image.crossOrigin = &apos;Anonymous&apos;  // Setup CORS accordingly if needed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        image.src = &apos;./example.jpg&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;/body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;/html&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;*&lt;strong&gt;*Thanks for reading! To stay in the loop, subscribe to our&lt;/strong&gt; &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.**&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Felix</dc:creator><media:content url="https://blog.img.ly/2020/04/image-31.png" medium="image"/><category>JavaScript</category><category>HTML5</category><category>Web Development</category><category>Tutorial</category><category>Technology</category><category>Tech</category><category>How-To</category><category>Learning</category></item><item><title>How to integrate a Photo Editor into your Android app</title><link>https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-android-app-ee4148816e25/</link><guid isPermaLink="true">https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-android-app-ee4148816e25/</guid><description>6-minute Video Tutorial </description><pubDate>Tue, 11 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;As developer friendliness is paramount to us, we created a short video tutorial to guide you through our integration process. We created similar tutorials for &lt;a href=&quot;https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-ios-app-ced008a7088b/&quot;&gt;iOS&lt;/a&gt; and &lt;a href=&quot;https://img.ly/blog/how-to-integrate-a-photo-editor-into-your-website-4578cc6ef6f3/&quot;&gt;HTML5&lt;/a&gt;, so make sure to check those out as well.(Please make sure to get a trial license for the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; before integrating it.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/FpmASFvgUdM?feature=oembed&quot;&gt;https://www.youtube.com/embed/FpmASFvgUdM?feature=oembed&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;video-transcript&quot;&gt;Video Transcript&lt;/h3&gt;
&lt;p&gt;Today we’re going to show you how to integrate the PhotoEditor SDK into your Android app. We’re going to need Android Studio and the PhotoEditor SDK’s &lt;a href=&quot;https://img.ly/docs/pesdk/android/getting-started/integration/&quot;&gt;documentation&lt;/a&gt; to do so.&lt;/p&gt;
&lt;p&gt;First, we’re going to launch a new Android Studio project. Here, we can choose a name for our application. Then, we’re going to insert our company domain and our package name. Inserting a package name is very important as you need a license that is issued for your specific package name to run the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’re also going to include Kotlin support, as every modern Android app should do that.&lt;/p&gt;
&lt;p&gt;We then choose Phone and Tablet and API 16 because this is the oldest API that the SDK currently supports. Please note, that this is eventually going to change.&lt;/p&gt;
&lt;p&gt;We then choose Empty Activity. Here you can set a name. For this tutorial, however, we’re going to leave it as it is.&lt;/p&gt;
&lt;p&gt;Now, a new Android Studio project is created.&lt;/p&gt;
&lt;p&gt;For the sake of clarity, we’re going to use the project view.&lt;/p&gt;
&lt;p&gt;First, we have to include the license. To do so, we open the &lt;code&gt;PhotoeditorApp&lt;/code&gt; folder and navigate through the subfolders &lt;code&gt;app&lt;/code&gt;, &lt;code&gt;src&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt;. In this subfolder, we create yet another folder called &lt;code&gt;assets&lt;/code&gt;. We then simply paste our license into it.&lt;/p&gt;
&lt;p&gt;We head over to the documentation, find the section for Android and make sure that the latest version is selected. As of the time of this recording that is version 6 or V6. Then we navigate to the “Getting Started” section. Here you can also look up how to include the license. We head over to the project’s &lt;code&gt;build.gradle&lt;/code&gt; file and paste this line which is the path to our SDK repository under &lt;code&gt;buildscript&lt;/code&gt; and &lt;code&gt;repositories&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;maven { url &apos;https://artifactory.img.ly/artifactory/imgly&apos; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We then copy this line and paste it under dependencies, and thus, we have linked the SDK.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;classpath &apos;ly.img.android.pesdk:plugin:6.0.8&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, we’re going to apply the PESDK plugin. So, we find the app’s build.gradle folder and paste this line under the other plugins.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apply plugin: &apos;ly.img.android.pesdk&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, we’re going to insert the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt;’s configuration that contains all tools. We copy this block and paste it under the PESDK plugin. It is important that the license naming here matches the name of the license file we previously imported.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pesdkConfig {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    licencePath &quot;LICENSE&quot; // Name of the Licence file in the asset folder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // If you use another supportLibVersion (&apos;com.android.support&apos;), change this version here to update your own supportLibVersion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    supportLibVersion &quot;27.1.1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Define the modules you need&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    modules {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Add all the backend modules you need&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:text&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:frame&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:focus&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:brush&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:camera&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:filter&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:sticker&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:overlay&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:adjustment&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:text-design&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.operation:abstract-sticker&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Add all the UI modules you need&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:core&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:text&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:focus&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:frame&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:brush&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:filter&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:camera&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:sticker&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:overlay&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:transform&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:adjustment&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.ui.mobile_ui:text-design&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Add the serializer if you want&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk:serializer&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Add asset packs if you want&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.assets:font-basic&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.assets:font-text-design&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.assets:frame-basic&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.assets:filter-basic&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.assets:overlay-basic&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.assets:sticker-shapes&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        include &apos;ly.img.android.pesdk.assets:sticker-emoticons&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, we copy the &lt;code&gt;buildToolsVersion&lt;/code&gt; und paste it in the &lt;code&gt;android&lt;/code&gt; category. And for the app to compile in the correct Java version, we copy this code block and paste it at the end of the &lt;code&gt;android&lt;/code&gt; category.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;compileOptions {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        sourceCompatibility JavaVersion.VERSION_1_8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        targetCompatibility JavaVersion.VERSION_1_8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We hit “Sync Now” to save our settings. That often takes a while, so we sped it up for you.&lt;/p&gt;
&lt;p&gt;We want to build a simple application that just consists of a single button that starts the photo editor. So first, we create a button. To do so, we navigate to the &lt;code&gt;app&lt;/code&gt; folder and open the subfolders &lt;code&gt;src&lt;/code&gt;, &lt;code&gt;res&lt;/code&gt; and &lt;code&gt;layout&lt;/code&gt; to find the &lt;code&gt;activity_main&lt;/code&gt; (or whichever way you decided to name it). We click on “Text” to edit the file and add a button. For height and width, we enter &lt;code&gt;wrap_content&lt;/code&gt;. Now, we set an ID for the button and call it &lt;code&gt;sdk_button&lt;/code&gt;. We then set a display text for the button. For this tutorial, we’ll use the string &lt;code&gt;app_name&lt;/code&gt;, but you, of course, can choose whichever string you like.&lt;/p&gt;
&lt;p&gt;We return to the &lt;code&gt;app&lt;/code&gt; folder and find the &lt;code&gt;MainActivity&lt;/code&gt; in the subfolders &lt;code&gt;src&lt;/code&gt; and &lt;code&gt;java&lt;/code&gt;. We head over to the documentation, where we are presented with two options. We can either start the editor in camera mode or in the device’s gallery. We’ll go with the camera mode. As we’re writing our &lt;code&gt;MainActivity&lt;/code&gt; in Kotlin, we choose the Kotlin code example and paste it in the &lt;code&gt;MainActivity&lt;/code&gt;. We can overwrite the &lt;code&gt;onCreate&lt;/code&gt; as it is also included in the code example.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;companion object {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const val PESDK_RESULT = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Important permission request for Android 6.0 and above, don&apos;t forget to add this!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array&amp;#x3C;String&gt;, grantResults: IntArray) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        PermissionRequest.onRequestPermissionsResult(requestCode, permissions, grantResults)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        super.onRequestPermissionsResult(requestCode, permissions, grantResults)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    override fun permissionGranted() {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    override fun permissionDenied() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        /* TODO: The Permission was rejected by the user. The Editor was not opened,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         * Show a hint to the user and try again. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Create an empty new SettingsList and apply the changes on this reference.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    private fun createPesdkSettingsList() = SettingsList().apply {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // If you include our asset packs and use our UI you also have to add them to the UI,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // otherwise, they are only available for the backend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // See the specific feature sections of our guides if you want to know how to add your own Assets.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        getSettingsModel(UiConfigFilter::class.java).apply {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setFilterList(FilterPackBasic.getFilterPack())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        getSettingsModel(UiConfigText::class.java).apply {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setFontList(FontPackBasic.getFontPack())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        getSettingsModel(UiConfigFrame::class.java).apply {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setFrameList(FramePackBasic.getFramePack())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        getSettingsModel(UiConfigOverlay::class.java).apply {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setOverlayList(OverlayPackBasic.getOverlayPack())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        getSettingsModel(UiConfigSticker::class.java).apply {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setStickerLists(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              StickerPackEmoticons.getStickerCategory(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              StickerPackShapes.getStickerCategory()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Set custom camera image export settings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        getSettingsModel(CameraSettings::class.java).apply {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setExportDir(Directory.DCIM, &quot;SomeFolderName&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setExportPrefix(&quot;camera_&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Set custom editor image export settings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        getSettingsModel(EditorSaveSettings::class.java).apply{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setExportDir(Directory.DCIM, &quot;SomeFolderName&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            setExportPrefix(&quot;result_&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            savePolicy = EditorSaveSettings.SavePolicy.RETURN_ALWAYS_ONLY_OUTPUT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    override fun onCreate(savedInstanceState: Bundle?) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        super.onCreate(savedInstanceState)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        setContentView(R.layout.activity_main)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        openCamera()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    private fun openCamera() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        val settingsList = createPesdkSettingsList()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        CameraPreviewBuilder(this)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          .setSettingsList(settingsList)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          .startActivityForResult(this, PESDK_RESULT)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    override fun onActivityResult(requestCode: Int, resultCode: Int, data: android.content.Intent) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        super.onActivityResult(requestCode, resultCode, data)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        if (resultCode == Activity.RESULT_OK &amp;#x26;&amp;#x26; requestCode == PESDK_RESULT) { // Editor has saved an Image.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            val resultURI = data.getParcelableExtra&amp;#x3C;Uri?&gt;(ImgLyIntent.RESULT_IMAGE_URI)?.also {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                // Scan result uri to show it up in the Gallery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE).setData(it))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            val sourceURI = data.getParcelableExtra&amp;#x3C;Uri?&gt;(ImgLyIntent.SOURCE_IMAGE_URI)?.also {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                // Scan source uri to show it up in the Gallery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE).setData(it))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            Log.i(&quot;PESDK&quot;, &quot;Source image is located here $sourceURI&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            Log.i(&quot;PESDK&quot;, &quot;Result image is located here $resultURI&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            // TODO: Do something with the result image&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            // OPTIONAL: read the latest state to save it as a serialisation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            val lastState = data.getParcelableExtra&amp;#x3C;SettingsList&gt;(ImgLyIntent.SETTINGS_LIST)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                PESDKFileWriter(lastState).writeJson(File(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  Environment.getExternalStorageDirectory(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  &quot;serialisationReadyToReadWithPESDKFileReader.json&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                ))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            } catch (e: IOException) { e.printStackTrace() }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        } else if (resultCode == Activity.RESULT_CANCELED &amp;#x26;&amp;#x26; requestCode == PESDK_RESULT) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            // Editor was canceled&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            val sourceURI = data.getParcelableExtra&amp;#x3C;Uri?&gt;(ImgLyIntent.SOURCE_IMAGE_URI)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            // TODO: Do something...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Right now, we are presented with quite some error warnings, but that’s no problem at all because we still need to implement the interface, as you can see here: &lt;code&gt;PermissionRequest.Response&lt;/code&gt;. Here, we must choose the dedicated &lt;code&gt;ly.img.android.pesdk.ui.utils&lt;/code&gt; and add &lt;code&gt;.response&lt;/code&gt; at the end.&lt;/p&gt;
&lt;p&gt;After that, we’re down to only two errors because we still need to integrate the correct directory. Again, we choose the dedicated &lt;code&gt;ly.img.android.pesdk.backend.model.constant&lt;/code&gt;. And thus all errors are resolved.&lt;/p&gt;
&lt;p&gt;If we were to start the app now it would automatically run the editor in camera mode. But we don’t want the editor to start automatically, hence the button we previously added. So, in order to change that, we scroll to the onCreate method and as you can see here, the app would instantly open the camera.&lt;/p&gt;
&lt;p&gt;We create a new variable that we’re going to call &lt;code&gt;sdkButton&lt;/code&gt; and set it equal with &lt;code&gt;findViewbyId&lt;/code&gt;. We then set the ID to &lt;code&gt;sdk_button&lt;/code&gt;, set an &lt;code&gt;OnClickListener&lt;/code&gt; and paste &lt;code&gt;openCamera&lt;/code&gt; beneath it.&lt;/p&gt;
&lt;p&gt;And, we have a working little app that contains the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt;. You could take a deeper dive into PhotoEditor SDK integration in other environments and frameworks in the official &lt;a href=&quot;https://img.ly/docs/pesdk/&quot;&gt;documentation&lt;/a&gt; put together by developers themselves.&lt;/p&gt;
&lt;p&gt;*&lt;strong&gt;*Thanks for reading! To stay in the loop, subscribe to our&lt;/strong&gt; &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.**&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Felix</dc:creator><media:content url="https://blog.img.ly/2020/04/image-33.png" medium="image"/><category>App Development</category><category>Android</category><category>Tutorial</category><category>Technology</category><category>Photo Editing</category><category>Tech</category><category>How-To</category><category>Learning</category></item><item><title>From 2D to 3D Photo Editing</title><link>https://img.ly/blog/from-2d-to-3d-photo-editing-948690b7b45e/</link><guid isPermaLink="true">https://img.ly/blog/from-2d-to-3d-photo-editing-948690b7b45e/</guid><pubDate>Tue, 26 Jun 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last November, we released Portrait, an iOS app that helps create amazing, stylized selfies and portraits instantly.&lt;/p&gt;
&lt;p&gt;With over a million downloads and many more portrait images created, we feel that the idea and vision of Portrait was more than confirmed. The central component of Portrait is an AI that is trained to clip portraits from the background, a technique we are eager to further improve and refine. In fact, Portrait helped us to explore a novel technique for image editing, as we were able to leverage a new powerful data set in photography: depth data.&lt;/p&gt;
&lt;p&gt;We began feeding our AI models with the depth data from the iPhone Xs TrueDepth camera and had one goal in mind: to infer depth information for portrait imagery, or bringing three-dimensionality into a two-dimensional photo. Along the way, we created a new architecture concept, that allows performance and memory improvements through modularizing and reusing neural networks.&lt;/p&gt;
&lt;p&gt;In the following article, we’d like to present some of our results along with the insights we made.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;An image and it’s corresponding depth map. (Source)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 600px) 600px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;600&quot; height=&quot;801&quot; src=&quot;https://img.ly/_astro/1-r23YFAfXu_OHchBqd4plKw_Z1KsEdA.webp&quot; srcset=&quot;/_astro/1-r23YFAfXu_OHchBqd4plKw_Z1KsEdA.webp 600w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-new-cool-depthdata&quot;&gt;The New Cool: Depth Data&lt;/h2&gt;
&lt;p&gt;The usage of depth data in image editing initially became available with the iPhone 7 Plus when Apple introduced ‘Portrait Mode’. By combining a depth map and face detection, the devices are able to blur our distant objects and backgrounds, mimicking a ‘bokeh’ or depth of field effect, which is well known from DSLRs cameras.&lt;/p&gt;
&lt;p&gt;While the actual implementation varies, all major manufacturers nowadays offer a similar mode by incorporating depth data into their image editing pipeline. This is either achieved through the conventional dual or even triple camera on the back of a phone, dual-pixel offset calculations combined with machine learning or dedicated sensors like Apples TrueDepth module. In fact, for a modern flagship phone, some sort of depth based portrait mode is almost a commodity.&lt;/p&gt;
&lt;p&gt;From a developers perspective, things look a little different: Depth data became a first-class citizen throughout the iOS APIs in iOS 11 and such data is now easily accessible on supported devices. Android users obviously have access to depth data as well, either by utilizing multiple cameras or by Googles dual-pixel based machine learning approach, seen in the newer Pixel 2 phones. But contrary to iOS, Android doesn’t yet offer a common developer interface to access such data. In fact, developers aren’t able to access any of the depth information Google or other manufacturers collected within their camera apps. This means developers would either need to implement the algorithm to infer depth from two images themselves or try to rebuild Googles sophisticated machine learning powered system. Neither of these options is practical and probably not even possible given the usual limitations to camera APIs.&lt;/p&gt;
&lt;p&gt;So although being quite common, depth data isn’t as easily accessible for developers as one might think. Right now you’re out of luck on Android, dependent on hardware on iOS and even then limited to the 1.000$ flagship if you’re interested in depth for images taken with the front camera. And last but not least, across all devices and platforms, there is no way for you to generate a depth map for an existing image.&lt;/p&gt;
&lt;h2 id=&quot;deep-possibilities&quot;&gt;Deep Possibilities&lt;/h2&gt;
&lt;p&gt;Despite the restrictions, we decided to first explore the power of depth for image editing, as depth data provides many new exciting creative possibilities:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A depth map visualized in 3D space. (Source)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1000px) 1000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1000&quot; height=&quot;433&quot; src=&quot;https://img.ly/_astro/1-UyLhWSDUQdKU-0wfKcYPgg_2cc62N.webp&quot; srcset=&quot;/_astro/1-UyLhWSDUQdKU-0wfKcYPgg_1RzFAE.webp 640w, /_astro/1-UyLhWSDUQdKU-0wfKcYPgg_1jHR91.webp 750w, /_astro/1-UyLhWSDUQdKU-0wfKcYPgg_1y3t3X.webp 828w, /_astro/1-UyLhWSDUQdKU-0wfKcYPgg_2cc62N.webp 1000w&quot;&gt;&lt;/p&gt;
&lt;p&gt;If we have a depth map for a given image, our editing possibilities are increased dramatically. Instead of a 2D image, a flat plane of color values, we suddenly have a depth value for each individual pixel, which translates into a 3D landscape highlighting distinct objects in the foreground and a clear indication of background.&lt;/p&gt;
&lt;h3 id=&quot;depth-aware-editing&quot;&gt;Depth-aware Editing&lt;/h3&gt;
&lt;p&gt;Instead of relying on color and texture differences to determine fore- and background, one could literally edit these regions individually. This allows adjustments like darkening the background while lightening the foreground, which makes portraits ‘pop’. If we’d be able to generate a high-resolution depth map, we could easily replace the AI currently used in Portrait and would allow even more sophisticated creatives. Thanks to the new APIs, there are already some awesome iOS apps available that specialize in depth based editing. One famous example is Darkroom with their “depth-aware filters”:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Darkrooms ‘depth-aware’ filters. (Source)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1000px) 1000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1000&quot; height=&quot;450&quot; src=&quot;https://img.ly/_astro/1-RP-bR21xfOyDciBNgiQovQ_e4d4z.webp&quot; srcset=&quot;/_astro/1-RP-bR21xfOyDciBNgiQovQ_1k66MV.webp 640w, /_astro/1-RP-bR21xfOyDciBNgiQovQ_H7L4v.webp 750w, /_astro/1-RP-bR21xfOyDciBNgiQovQ_chxWN.webp 828w, /_astro/1-RP-bR21xfOyDciBNgiQovQ_e4d4z.webp 1000w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;depth-of-fieldeffects&quot;&gt;Depth of Field Effects&lt;/h3&gt;
&lt;p&gt;As a depth of field or bokeh effect was the initial motivation for Apple to incorporate depth sensing technology, it is one of the most obvious applications. Depth is crucial for such an effect, as the amount of bluriness of any given region directly depends on its distance to the camera lens.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 450px) 450px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;450&quot; height=&quot;600&quot; src=&quot;https://img.ly/_astro/1-t-iuevsvhcRZK1krCv4GVw_wkaR3.webp&quot; srcset=&quot;/_astro/1-t-iuevsvhcRZK1krCv4GVw_wkaR3.webp 450w&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Artificial Depth of Field (Source) and 3D asset placement examples.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 800px) 800px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;800&quot; height=&quot;599&quot; src=&quot;https://img.ly/_astro/1-Uj0A37iDdBj7qljbO8tKEA_1bOpp5.webp&quot; srcset=&quot;/_astro/1-Uj0A37iDdBj7qljbO8tKEA_Blyk2.webp 640w, /_astro/1-Uj0A37iDdBj7qljbO8tKEA_Z1oLE5s.webp 750w, /_astro/1-Uj0A37iDdBj7qljbO8tKEA_1bOpp5.webp 800w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;3d-asset-placement&quot;&gt;3D Asset Placement&lt;/h3&gt;
&lt;p&gt;As mentioned above, a depth map gives us a 3D understanding of the image. We’re able to tell if subject A is positioned in front of or behind subject B. This allows placement of digital assets like stickers or text in a ‘depth-aware’ fashion, but could also be used to apply ‘intelligent’ depth of field, e.g. a bokeh effect that ensures all faces are in focus.&lt;/p&gt;
&lt;h2 id=&quot;enter-deeplearning&quot;&gt;Enter Deep Learning&lt;/h2&gt;
&lt;p&gt;Motivated by the possibilities enabled by depth maps, we were wondering if we could bring this magic to any type of portrait image. We consulted existing literature on depth inference and found various papers¹ and articles on the topic, some of which even presented results that seemed sufficient for our use cases. In our case, we didn’t need accurate, as in ‘this pixel is 30cm in front of the camera’, results, but we were only interested in getting the general distance relations correct. For us, knowing that region A was slightly behind but definitely way in front of region B was enough to generate a visually pleasing effect and by constraining our domain to portrait imagery, we were able to further reduce the tasks complexity.&lt;/p&gt;
&lt;p&gt;Given our experience with deep learning and our current focus on introducing machine learning powered features to the &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt;, we immediately decided to tackle the new challenge with deep learning or more specifically convolutional neural networks. Having a huge dataset of image and depth map pairs available, made this choice even easier. We stuck to a system similar to our previous segmentation model but decided to put more emphasis on allowing the reuse of individual parts, as this would come in handy when adding additional features in the future. To achieve this, we created a new modularized neural network approach named Hydra, which will be presented in an upcoming blog post.&lt;/p&gt;
&lt;p&gt;During development, we followed our tried and tested workflow of starting with a complex custom model, which is then tweaked and refined to match our performance requirements while maintaining the prediction quality we need. Once that was done, we had a fast and small model, trained on thousands of iPhone front camera selfies and capable of inferring high fidelity depth maps from a plain RGB image in under a second.&lt;/p&gt;
&lt;h2 id=&quot;the-prototype&quot;&gt;The Prototype&lt;/h2&gt;
&lt;p&gt;After creating a small model capable of inferring depth maps for any given portrait image, we immediately wanted to evaluate its performance in a ‘real-world’ environment. We decided to build a prototype that applies a depth of field effect to a portrait image, by using the model and its outputs. With our long-term goal of deploying the model to iOS, Android and the web in mind, we built the prototype using TensorFlowJS to explore this newly released library. Our browser demo consists of a minimal ‘Hydra’ implementation with individual modules, one for extracting features and one for the actual depth inference, which can both be executed individually.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Our demo web app in action.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1200&quot; height=&quot;442&quot; src=&quot;https://img.ly/_astro/1-rVZLH5Tsq0bBKjFNSlKYlA_Z23OWO9.webp&quot; srcset=&quot;/_astro/1-rVZLH5Tsq0bBKjFNSlKYlA_Z1dWDjs.webp 640w, /_astro/1-rVZLH5Tsq0bBKjFNSlKYlA_KKQvH.webp 750w, /_astro/1-rVZLH5Tsq0bBKjFNSlKYlA_ZoEQaL.webp 828w, /_astro/1-rVZLH5Tsq0bBKjFNSlKYlA_25hiok.webp 1080w, /_astro/1-rVZLH5Tsq0bBKjFNSlKYlA_Z23OWO9.webp 1200w&quot;&gt;&lt;/p&gt;
&lt;p&gt;While being optimized for performance and memory footprint, the trained weights of the model still add up to ~18MB, which we will improve by further fine-tuning or even applying pruning or quantization. Once the models are loaded, all further processing happens on the device though, so you may try out all the samples without worrying about your data plan.&lt;/p&gt;
&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;
&lt;p&gt;Seeing our vision come to life was quite a stunning experience. Suddenly our browser was able to perform a complex depth of field effect without the need for special hardware, manual annotations or anything else apart from our image. And the best part was manually moving the focal plane through the image, either by sliding or tapping on different regions. Although being trained on ‘just’ selfies the model handles turned heads, silhouettes and multiple people pretty well and isn’t as restricted to its domain as we initially expected.&lt;/p&gt;
&lt;p&gt;And while our initial prototype is still weighing in at ~18MB, we’re certain to slim that down further in order to use the model in production. Performance wise we were very impressed with the TensorFlowJS inference speed. Even though everything is happening on the client side and is therefore dependent on the clients hardware, we saw inference speed below one second right of the bat and those greatly improved after the initial run, as the resources were already allocated. While not being immediately helpful for the depth inference part, this allowed us to further confirm our theory behind Hydra: Re-running inference once the necessary resources on the machine have been allocated greatly increases performance and might even allow real-time performance after an initial setup-time.&lt;/p&gt;
&lt;p&gt;To summarise, we’re definitely eager to further explore the use of depth data in image editing and think we have found a way to overcome the access restrictions on different platforms and hardware with our custom model. Combined with our new Hydra approach we can see lots of potential features that will delight both our users and customers and we will keep you updated right here.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;(1)&lt;/strong&gt; &lt;br&gt;
The papers we extracted most knowledge for our use case from were:&lt;br&gt;
“Depth Map Prediction from a Single Image using a Multi-Scale Deep Network” (&lt;a href=&quot;https://arxiv.org/abs/1406.2283&quot;&gt;arXiv&lt;/a&gt;)&lt;br&gt;
“Deeper Depth Prediction with Fully Convolutional Residual Networks” (&lt;a href=&quot;https://arxiv.org/abs/1606.00373&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;*&lt;strong&gt;*Thanks for reading! To stay in the loop, subscribe to our&lt;/strong&gt; &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.**&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Malte</dc:creator><dc:creator>Eray</dc:creator><media:content url="https://blog.img.ly/2020/03/1-Rd4wX6T9PmoXZA56yVLgCQ-1.png" medium="image"/><category>Machine Learning</category><category>Photography</category><category>Deep Learning</category><category>Photos</category><category>Technology</category><category>AI</category></item><item><title>The Photograph that Will Not Vanish.</title><link>https://img.ly/blog/the-photograph-that-will-not-vanish-2a9960b6bf4a/</link><guid isPermaLink="true">https://img.ly/blog/the-photograph-that-will-not-vanish-2a9960b6bf4a/</guid><description>Why HP teamed up with us to create memories that will last a lifetime </description><pubDate>Mon, 22 May 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;The &lt;a href=&quot;https://www.hp.com/us-en/shop/pdp/hp-sprocket-photo-printer&quot;&gt;HP Sprocket&lt;/a&gt; paves the way for a whole new way of experiencing mobile photography. While pictures nowadays are either ephemeral or get stored away in digital vaults, HP breathes new life into material photographs by making mobile printing available to anyone. For this piece, we sat together with Carem Pereira, SCRUM Master for the sprocket Android team in Brazil, to recap the development of HP’s portable gem.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The HP Sprocket is a beautifully small and portable printer that instantly prints two by three-inch color photos — no cartridge or ink required. Peel the back of the photos and you can even stick them onto anything you like. “Our message is that printing can be easy and fun on the go. Snap, print, and play. You can take the sprocket anywhere, easily print photos on the spot and share them with your friends” says Carem Pereira. But creating a straightforward printing experience was only half the battle for the sprocket team, as Pereira explains: “From the first day on, editing features were planned to be a central part of the sprocket’s core experience. We wanted to give our users the ability to personalize and customize their snapshots before printing or sharing them.”&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;“The &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; absolutely saved us a lot of time.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&quot;From the left: Sascha Schwabbauer, yours truly, Malte Baumann&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2000px) 2000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2000&quot; height=&quot;643&quot; src=&quot;https://img.ly/_astro/image-43_ZfI6JA.webp&quot; srcset=&quot;/_astro/image-43_ZhiMDh.webp 640w, /_astro/image-43_hTfv4.webp 750w, /_astro/image-43_Z1xSaD4.webp 828w, /_astro/image-43_Z2wRItY.webp 1080w, /_astro/image-43_FBY7.webp 1280w, /_astro/image-43_29tmIU.webp 1668w, /_astro/image-43_ZfI6JA.webp 2000w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Consequently, HP wanted to incorporate these essential features into their free sprocket companion app that connects the user’s mobile device to the printer via Bluetooth and allows for the management and printing of the pictures. “We’ve been working on a very tight schedule and had only three months until the release of our first MVP mid-September 2016”, Pereira explains, “in the beginning, we wanted to implement the editing features ourselves, but by the time we started the estimates, we realized that we’d eventually not be able to meet our goals. So, we were looking for a third-party solution.”&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 600px) 600px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;600&quot; height=&quot;978&quot; src=&quot;https://img.ly/_astro/1-N9tXV3b7KosKu4bSuUyobw_YACug.webp&quot; srcset=&quot;/_astro/1-N9tXV3b7KosKu4bSuUyobw_YACug.webp 600w&quot;&gt;&lt;/p&gt;
&lt;p&gt;“One of our team members was already working with the SDK for another project, the HP Print Bot,” Pereira continues, “so, we compared &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;PhotoEditor SDK&lt;/a&gt; with other solutions and found that it would be the best fit for us since it provides all the features that are crucial for our use case and we were already familiar with it. Also, it was of great importance to us that the look of the editor in sprocket matched the rest of the app and we saw that it would be very easy to accomplish that with the PhotoEditor SDK.”&lt;/p&gt;
&lt;p&gt;The PhotoEditor SDK also leaves full control over content assets like stickers, fonts and filters, a feature critical to the HP team: “We want to stay relevant to our customers and one of the examples where we accomplish that is with our assets, like Stickers and Frames that are tailored for specific times and holidays. We have releases every two weeks that contain a new set of assets,” Pereira explains.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;“It’s amazing how just a little gesture like a photograph can make such a difference in someone’s life!”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&quot;Office Decorations&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 600px) 600px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;600&quot; height=&quot;341&quot; src=&quot;https://img.ly/_astro/1--Q5TiPhnK9RHwSltlifupQ_17qvyK.webp&quot; srcset=&quot;/_astro/1--Q5TiPhnK9RHwSltlifupQ_17qvyK.webp 600w&quot;&gt;&lt;/p&gt;
&lt;p&gt;The HP Sprocket became an instant success. “The sprocket continues to be one of the great highlights for HP in consumer printing this year. The customers love using the printer, and we are already in millions of prints, we even sold out worldwide during the holidays last year, which was a great surprise for us,” says Carem Pereira.&lt;/p&gt;
&lt;p&gt;But it’s not only sales figures that define its impact, as the story of Dom Russell and Seb Trevaskis exemplifies: The two Physiotherapy graduates brought the HP Sprocket to a Vietnamese orphanage where they educated, designed and implemented individualized rehabilitation programs for children who suffered from mental and physical disabilities due to the Vietnam War herbicide Agent Orange. The sprocket brought happiness to the orphanage and created everlasting memories for the children, as Dom Russell explains: “The sprocket was awesome, and the kids loved it! They would stick the photos on all their favorite possessions. Some would even just stare at them for hours as it may have been the first time they’d seen a physical copy of themselves. I think those photos will stay with them for life seeing the way they reacted when it got printed and the way they treated them as well. It’s amazing how just a little gesture like a photograph can make such a difference in someone’s life!”&lt;/p&gt;
&lt;p&gt;Needless to say that sprocket was also an instant hit at our office. Playing around with the app that contains our editor was truly amazing and really let us grasp its potential. Using the sprocket on many different occasions gave us not only a hands-on experience of what our SDK is capable of but also of what needs further improvement or even what’s missing. Meanwhile our office is plastered with sprocket prints.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;“PhotoEditor SDK was an essential asset for making things work with a top-notch standard.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;“We continue to get great feedback from our users on how straightforward and easy our experience is. And again, easy, that is the key,” Pereira says, “the PhotoEditor SDK was a vital and essential asset for making things work on time and with a top-notch standard. That was paramount to us,” Carem Pereira concludes. &lt;strong&gt;We couldn’t be happier about this.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading! To stay in the loop, subscribe to our &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;Newsletter&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Felix</dc:creator><media:content url="https://blog.img.ly/2020/04/image-42.png" medium="image"/><category>Technology</category><category>Photography</category><category>Case Study</category><category>Photos</category><category>Product Development</category><category>Case Studies</category></item></channel></rss>