The customizable mobile photo and video editor for your iOS and Android App

Provide a perfectly balanced UX your users are going to love - with our native editor solutions.

Supporting the great frameworks

Simplified implementation through your favorite frameworks.

import PhotoEditorSDK

let image = UIImage(named: "example")!
let photo = Photo(image: image)

let photoEditViewController = PhotoEditViewController(photoAsset: photo)
photoEditViewController.delegate = self

present(photoEditViewController, animated: true, completion: nil)

class KEditorDemoActivity : Activity(), PermissionRequest.Response {
  companion object {
    const val PESDK_RESULT = 1
    const val GALLERY_RESULT = 2
  }
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    openSystemGalleryToSelectAnImage()
  }
  private fun createPesdkSettingsList() = PhotoEditorSettingsList()
    .configure { it.setFontList(FontPackBasic.getFontPack()) }
    .configure { it.setFrameList(FramePackBasic.getFramePack()) }
    .configure { it.setFilterList(FilterPackBasic.getFilterPack()) }
    .configure { it.setOverlayList(OverlayPackBasic.getOverlayPack()) }
    .configure { it.setStickerLists(
      StickerPackEmoticons.getStickerCategory(),
      StickerPackShapes.getStickerCategory()
    )}
  fun openEditor(inputImage: Uri?) {
    val settingsList = createPesdkSettingsList().configure {
      it.source = inputImage
    }
    PhotoEditorBuilder(this)
      .setSettingsList(settingsList)
      .startActivityForResult(this, PESDK_RESULT)
  }
  override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent) {
    super.onActivityResult(requestCode, resultCode, intent)
    if (resultCode == RESULT_OK && requestCode == GALLERY_RESULT) {
      openEditor(intent.data)
    } else if (resultCode == RESULT_OK && requestCode == PESDK_RESULT) {
      val data = EditorSDKResult(intent)
      data.notifyGallery(EditorSDKResult.UPDATE_RESULT and EditorSDKResult.UPDATE_SOURCE)
      Log.i("PESDK", "Result image is located here ${data.resultUri}")
    }
  }
  fun openSystemGalleryToSelectAnImage() {
    val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    if (intent.resolveActivity(packageManager) != null) {
      startActivityForResult(intent, GALLERY_RESULT)
    }
  }
  override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, 
  grantResults: IntArray) {
    PermissionRequest.onRequestPermissionsResult(requestCode, permissions, grantResults)
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  }
  override fun permissionGranted() {}
  override fun permissionDenied() {}
}


import React, { Component } from "react";
import { PhotoEditorModal } from "react-native-photoeditorsdk";

export default class App extends Component {
  render() {
    return (
      <PhotoEditorModal
        visible={true}
        image={require('./example.jpg')}
        onExport={(result) => {
          console.log(result);
        }}
      />
    );
  }
} 


@Component({
  selector: "app-photo-editor",
  templateUrl: "./photo-editor.component.html",
})
export class PhotoEditorComponent implements AfterViewInit {
  constructor() {}

  @Input() src: string;
  @ViewChild("psdkContainer", { static: false }) container;

  editor;

  ngAfterViewInit() {
    this.instantiateEditor();
  }

  async instantiateEditor() {
    try {
      this.editor = await PhotoEditorSDKUI.init({
        // Please replace this with your license 
      	// https://account.photoeditorsdk.com/dashboard/subscriptions
        license: '{"owner":"Img.ly GmbH","version":"2.1", ...}',
        //The Container where PhotoEditorSDKUI should be rendered
        container: this.container.nativeElement,
        image: this.src,
        assetBaseUrl: "/assets/photoeditorsdk",
      });
    } catch (error) {
      console.log(error);
    }
  }
}


import { PhotoEditorSDKUI } from 'photoeditorsdk'

window.onload = function () {
    var container = document.getElementById('pesdk')
    var editor = new PhotoEditorSDKUI({
      // Please replace this with your license 
      // https://account.photoeditorsdk.com/dashboard/subscriptions
      license: '{"owner":"Img.ly GmbH","version":"2.1", ...}',
      //The Container where PhotoEditorSDKUI should be rendered
      container: container,
      image: './example.jpg'
    })
}

Make it seamless –
Customize our editor to fit your app’s design

Smart Designs

Attention-grabbing and precise visual communication is key to engaging your target audience. Making good design more accessible via our Text Design tool.

Moving pictures

VideoEditor SDK expands the toolkit of PhotoEditor SDK into the realm of mobile video creation. Empower your users to create engaging and professional-looking videos on the fly.

Packed with tons of features

View Documentation
Define Filter Presets
Define Filter Presets
Ultra High-Res Editing
Ultra High-Res Editing
Define Image Output SIze
Define Image Output SIze
Placing Stickers and Texts made easy with the Snapping Tool
Placing Stickers and Texts made easy with the Snapping Tool
Tablet Support
Tablet Support
Adjusting the editors language through Localization
Adjusting the editors language through Localization
Accessibility
Accessibility
Client-sided Rendering
Client-sided Rendering
Define Image Output Formats
Define Image Output Formats
Fast Image Export
Fast Image Export
Low Memory Footprint
Low Memory Footprint
Store EXIF data in outputs
Store EXIF data in outputs

Implement the editor and join the ranks of

Ready to get started?

Start your free trial or get in touch.
Start TrialGet License