View in English

  • Apple Developer
    • Get Started

    Explore Get Started

    • Overview
    • Learn
    • Apple Developer Program

    Stay Updated

    • Latest News
    • Hello Developer
    • Platforms

    Explore Platforms

    • Apple Platforms
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    Featured

    • Design
    • Distribution
    • Games
    • Accessories
    • Web
    • Home
    • CarPlay
    • Technologies

    Explore Technologies

    • Overview
    • Xcode
    • Swift
    • SwiftUI

    Featured

    • Accessibility
    • App Intents
    • Apple Intelligence
    • Games
    • Machine Learning & AI
    • Security
    • Xcode Cloud
    • Community

    Explore Community

    • Overview
    • Meet with Apple events
    • Community-driven events
    • Developer Forums
    • Open Source

    Featured

    • WWDC
    • Swift Student Challenge
    • Developer Stories
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Centers
    • Documentation

    Explore Documentation

    • Documentation Library
    • Technology Overviews
    • Sample Code
    • Human Interface Guidelines
    • Videos

    Release Notes

    • Featured Updates
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • Downloads

    Explore Downloads

    • All Downloads
    • Operating Systems
    • Applications
    • Design Resources

    Featured

    • Xcode
    • TestFlight
    • Fonts
    • SF Symbols
    • Icon Composer
    • Support

    Explore Support

    • Overview
    • Help Guides
    • Developer Forums
    • Feedback Assistant
    • Contact Us

    Featured

    • Account Help
    • App Review Guidelines
    • App Store Connect Help
    • Upcoming Requirements
    • Agreements and Guidelines
    • System Status
  • Quick Links

    • Events
    • News
    • Forums
    • Sample Code
    • Videos
 

Videos

Open Menu Close Menu
  • Collections
  • All Videos
  • About

Back to WWDC26

  • About
  • Summary
  • Transcript
  • Code
  • Implement high resolution photo capture

    Capture super high resolution photos in your app using AVFoundation. Learn when to use the three different options to capture images — RAW, exposure-bracketed, and fully processed. Walk through configuring photo capture for 24MP and 48MP images across the Main, Tele, and Ultra Wide cameras. And discover how deferred photo processing keeps your app responsive as more photos are taken.

    Chapters

    • 0:00 - Introduction
    • 0:52 - High-resolution photos
    • 4:07 - Types of captures
    • 5:20 - Configure a capture session
    • 9:41 - Responsive capture best practices

    Resources

    • Capturing photos in RAW and Apple ProRAW formats
    • AVCam: Building a camera app
      • HD Video
      • SD Video

    Related Videos

    WWDC26

    • Build a responsive camera app that launches quickly
    • Support the Center Stage front camera in your iOS app

    WWDC23

    • Create a more responsive camera experience

    WWDC21

    • Capture and process ProRAW images
    • Capture high-quality photos using video formats
  • Search this video…

    Hi, I am Mohit Setia - I'm an engineer on the Camera Software team. Welcome to: "Implement high resolution photo capture." Advancements in camera hardware and computational photography make high-resolution captures possible. But taking full advantage of that quality means managing tradeoffs particularly between processing time and final image quality. I'll go over high-quality photo processing and how to manage those tradeoffs for your app. First, I will cover different types of high-resolution photos.

    Then, how to configure and capture them.

    And finally, I'll discuss how to keep your app responsive throughout the process.

    First up: high-resolution photos. The preview stream gives you a screen-resolution image, suitable for showing the camera's view. But in photography use cases higher level of detail and low noise is expected.

    Also, high resolution image is required for photo cropping, zooming in on details, or image analysis.

    High resolution captures address this. Let me define what they are. A high-resolution photo — typically 12 megapixels captures the scene at a higher resolution than the preview stream.

    24 megapixels and 48 megapixels takes it a step further. The camera captures it at an even larger resolution. That means significantly more detail and clarity.

    Starting with iPhone 14 Pro and iPhone 14 Pro Max, the camera system features of 48 megapixel Quad sensor.

    A quad-pixel sensor design allows capturing photos at full resolution with the highest level of details or group pixels in two by two clusters of the same color to capture more light.

    This is a 48 megapixel photo captured on an iPhone! It shows a sweeping coastal landscape cliffs, beach, and ocean stretching to the horizon.

    It is four times the resolution of a standard photo, and it is captured using a single frame from the sensor.

    Notice the fine rocks on 100% crop of the coast.

    Clearly visible in incredible detail. And the intricate patterns on the side of the mountain.

    This is the power of 48 megapixels: more detail, more clarity, more to explore.

    Starting with iPhone 15, the camera supports 24 megapixel photos. A 24 megapixel photo capture consists of multiple steps. First, the camera uses combined pixels on the Quad sensor to generate a 12 megapixel, multi-frame fused, high dynamic range image.

    Then, the computational image processing pipeline, called photonic engine, combines that with a high resolution 48MP image captured at a full sensor resolution for rich details.

    Resulting in a 24MP image with incredible quality double the resolution of a 12MP image with only about 50% increase in the file size.

    It balances light and detail while keeping file size manageable for storing and sharing.

    Starting with iPhone 15, the Camera app defaults to this capture mode. 24MP and 48MP capture support has been extended to the telephoto camera on iPhone 16 Pro, and the ultra wide camera on iPhone 17. So these are the types of high resolution photos available across iPhone cameras. Now that I've defined the high-resolution photos available on iPhone, here are the types of high resolution captures that you can request in your app. First, the most common case — the fully processed photo.

    This is a multi-frame fused image. It goes through Photonic Engine, that extends dynamic range and improves fine details.

    Second, Exposure brackets multiple exposure frames of the same scene. This is useful for creating high dynamic range photo capture and scenarios where a selection from multiple exposures is required.

    Third, Bayer RAW photos. RAW gives you minimally processed data straight from the sensor. This is ideal for post-processing and editing use cases. And fourth, Apple's ProRAW. ProRAW combines the flexibility of RAW with iPhone's image processing.

    It gives more flexibility when editing exposure, color, and detail. To learn more about RAW format, watch "Capture and process ProRAW images" from WWDC 2021. Next, let me share how to configure the capture session for high-resolution photo. I'll start by creating an AVCaptureSession and then configure the session.

    Note - only the photo preset supports 24 and 48 megapixel photos. Other presets do not support it.

    Next, I will pick the right prioritization for my app.

    A speed capture delivers fastest, with the least processing. A balanced capture gives medium delivery speed and good quality. A quality capture takes the longest, but delivers the best quality.

    This is covered in more detail in "Capture High-Quality Photos Using Video Formats." from WWDC 2021. So while configuring the AVCapturePhotoOutput. I'll set maxPhotoQualityPrioritization to quality for demonstration of a high res capture.

    This tells the session to prepare resources for all three prioritization levels speed, balanced, and quality.

    The availability of some high resolution depends on this setting and I'll cover that little later in this video. Next, I will select the largest dimensions that I would request in this session.

    Starting from iOS 16, you can check the supported max photo dimensions on the active format of the device.

    supportedMaxPhotoDimensions lists all possible photo dimensions on the current format. Here, I'm selecting the largest available dimensions for demonstration but you should pick the dimensions that fit your use case.

    Complete photo output configuration before committing the session configuration.

    Changing these settings after commit triggers a lengthy pipeline reconfiguration.

    When ready to capture, set maxPhotoDimensions and photoQualityPrioritization on AVCapturePhotoSettings for the current capture.

    And then set up the delegate to capture the photo.

    Setting maxPhotoDimensions is a request, not a guarantee.

    The system looks at light level, scene, and available processing, and picks the best path it can. The actual dimensions come back to your delegate inside AVCaptureResolvedSettings, which also notifies the delegate when the capture is complete. You can customize quality prioritization and maxPhotoDimensions on each capture. That means you can support multiple quality levels and dimensions in the same session no lengthy reconfiguration between captures.

    High resolution captures require specific resource allocations based on photoQualityPrioritization and maxPhotoDimensions.

    If the system has not preallocated these resources, the allocation happens at capture time - which can slow things down.

    To avoid this slow down, use the method setPreparedPhotoSettingsArray on AVCapturePhotoOutput to signal how you plan to capture future photos.

    For example, if the app features of 48 megapixel mode, call setPreparedPhotoSettingsArray as soon as that mode is activated so resources are ready before the capture happens. Here is how you can implement this. As early as possible, create a prepareSettings object.

    Set the appropriate maxPhotoDimensions and photoQualityPrioritization.

    Then call setPreparedPhotoSettingsArray.

    Later, when ready to capture, create a new captureSettings object that matches the prepareSettings configuration.

    Keep in mind, you cannot reuse the prepareSettings object for the actual capture.

    Create a new settings object, but make sure its configuration matches, so the capture aligns with the preallocated resources. Capturing high resolution photos requires processing of a large number of pixels.

    This processing can take several seconds.

    I'll now provide some best practices to ensure that the app remains fast and responsive during this process. When a photo is requested, it first goes through a capture stage then moves to a processing stage. AVCapturePhotoCaptureDelegate receives notifications throughout this process. For example, didCapturePhotoFor resolvedSettings and didFinishCaptureFor resolvedSettings keep the app up to date as processing continues. Processing can take a different amount of time based on selected photo quality prioritization. A photo with quality prioritization is delivered with the best image by utilizing longer processing time. A photo with Balance prioritization delivers optimal quality with appropriate processing time for common cases. A photo with Speed prioritization is the fastest way to get a photo capture but without the improved quality that comes with longer processing.

    You can capture 12 megapixel across all three prioritization levels.

    48 megapixel images, because they're only a single frame as covered earlier, are available with either balanced, or quality prioritization.

    18 megapixel and 24 megapixel are multi-frame fused images and take longer to process that only quality prioritization allows. The 18 megapixel in this table, is only available on the Center stage front camera on iPhone 17. To learn more about the Center stage front camera Check out the "Support Center Stage front camera in your iOS app" from WWDC 2026. AVCaptureResolvedSettings has a photoProcessingTimeRange property. It tells you how long to expect before the photo is delivered to your delegate.

    The next photo can only be captured once the previous photo finishes processing. This delay between the two captures is referred to as shot to shot delay.

    Enabling responsive capture on AVCapturePhotoOutput allows overlapping captures.

    A new capture can begin once the capture stage of the previous photo finishes, no need to wait for processing. Observe the captureReadiness property on AVCapturePhotoOutput to know when the next photo can be captured. This reduces the shot to shot delay for the second photo. It helps you avoid missing the moment.

    But keep in mind, each photo still takes the same processing time as before. To reduce shot-to-shot delay even further on high-quality captures, adopt deferred photo processing. When you enable deferred processing, the system delivers a lightly processed proxy photo immediately after capture. You receive it via the didFinishCapturingDeferredPhotoProxy delegate callback. Final photo processing happens in one of two ways. On demand, when you request the final photo through the photo library, or in the background, when the system decides that the conditions are favorable, such as the device being idle.

    Watch "Create a More Responsive Camera Experience" from WWDC23 for deep dive into deferred photo processing. Enabling deferred photo processing significantly improves responsiveness by reducing the processing time blocking the next capture.

    This further reduces the shot to shot delay for all the subsequent photos.

    You can now capture more high quality photos in less time.

    With this approach, time spent on the processing stage shrinks significantly while the capture stage remains the same.

    Deferred processing lets the system take longer to finish processing a photo without blocking the next capture.

    And because that work happens in the background, it doesn't share memory with the capture session.

    That's what makes multi-frame fusion captures possible, like 18 and 24 megapixel.

    To prioritize responsiveness even further, turn on the fast capture prioritization property on AVCapturePhotoOutput. When you turn on fast capture prioritization on photoOutput, the system detects when someone takes multiple captures in quick succession.

    It then adapts the photo quality from the highest quality setting to a balanced quality setting.

    So in the photo capture timeline, as someone requests rapid captures, the system dynamically adjusts photo quality prioritization to balanced. Balanced captures require less time for both capture and processing.

    The result is a speed boost when rapid captures are happening.

    Starting with iOS 27 on iPhone 16 and iPhone 17, the system also processes balanced fast captures later using deferred processing.

    This further minimizes processing time, giving a faster capture experience for much longer. To illustrate this, I am out covering a very intense ball game between camera team members. On screen, a basketball court where the action unfolds. At first I start, without Deferred Processing, Responsive shutter or Fast capture prioritization.

    Notice the capture button as I try to take photos of the basketball shot.

    It keeps spinning while processing the photo, preventing me from taking another shot. I end up with a single photo of the shot. But I can do better to capture the moment I want, using the APIs, to manage responsiveness.

    I enable Deferred Processing, Responsive Shutter and Fast capture for the next shot.

    This time the capture button stays responsive while I capture the best moment.

    As I press the capture button, AVCaptureSession starts capturing Quality photos. But as I continue, it detects fast captures and intelligently transitions into Balanced captures.

    The difference is noticeable: one blocked capture versus five responsive shots of the same moment.

    This made for a much more responsive capture experience. In this video, I shared best practices for building a responsive photo capture app that captures photos with highest quality and resolution.

    If you are building a photo capture app, identify the resolution you want. Higher resolutions like 24 and 48 megapixels give people more detail to crop, zoom, and explore but they need more memory and processing time.

    Pick the quality prioritization that fits your needs. Speed, balanced, and quality each trade off delivery time against image fidelity. Match the level to what your app demands. And if you need the highest quality captures, turn on deferred processing and responsive captures. Without them, each photo blocks the next and people using your app might miss moments they can't get back. To further optimize your camera app, watch "Build a responsive camera app that launches quickly" from WWDC 2026.

    Build a camera experience that's fast when it needs to be. And uncompromising on quality when it matters. Thanks for watching.

    • 5:26 - Configure the AVCaptureSession

      import AVFoundation
      
      private let session = AVCaptureSession()
      private func configureSession() {
          session.beginConfiguration()
          session.sessionPreset = .photo
      }
    • 6:11 - Configure AVCapturePhotoOutput

      import AVFoundation
      
      private let photoOutput = AVCapturePhotoOutput()
      private let configurePhotoOutput: () -> Void = {
          photoOutput.maxPhotoQualityPrioritization = .quality // or .balanced
      }
    • 6:38 - Add maxPhotoDimensions to AVCapturePhotoOutput

      import AVFoundation
      
      let supportedMaxPhotoDimensions = device?.activeFormat.supportedMaxPhotoDimensions ?? []
      if let largestDimension = supportedMaxPhotoDimensions.max(by: { lhs, rhs in
          Int(lhs.width) * Int(lhs.height) < Int(rhs.width) * Int(rhs.height)
      } ) {
          photoOutput?.maxPhotoDimensions = largestDimension
      }
      
      session?.commitConfiguration()
      session?.startRunning()
    • 7:21 - Update AVCapturePhotoSettings

      import AVFoundation
      
      let settings = AVCapturePhotoSettings()
      settings.maxPhotoDimensions = dimension.cmVideoDimensionsValue
      settings.photoQualityPrioritization = .quality
      
      var delegate: AVCapturePhotoCaptureDelegate?
      
      // Configure photo request delegate
      
      if let delegate {
       photoOutput?.capturePhoto(with: settings, delegate: delegate)
      }
    • 8:59 - Prepare resources for the capture

      import AVFoundation
      
      let prepareSettings = AVCapturePhotoSettings()
      prepareSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions
      prepareSettings.photoQualityPrioritization = .quality
      
      photoOutput.setPreparedPhotoSettingsArray([prepareSettings]) { prepared, error in
        if let error = error {
          print("Failed to prepare: \(error)")
            return
        }
        print("Pipeline prepared: \(prepared)")
      }
      
      // Later, when ready to capture — create NEW settings
      let captureSettings = AVCapturePhotoSettings()
      captureSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions
      captureSettings.photoQualityPrioritization = quality
      photoOutput.capturePhoto(with: captureSettings, delegate: self)
    • 0:00 - Introduction
    • The tradeoffs high-resolution photo capture requires — particularly between processing time and image quality — and what the session covers: photo types, configuring and capturing them, and keeping your app responsive.

    • 0:52 - High-resolution photos
    • Explore the different photo resolutions available across iPhone cameras, including 12MP, 24MP, and 48MP, and how the photonic engine balances light and detail.

    • 4:07 - Types of captures
    • Learn about the four types of high resolution captures you can request: fully processed photos, exposure brackets, Bayer RAW, and Apple ProRAW.

    • 5:20 - Configure a capture session
    • An overview of AVCaptureSession setup for high resolution photos. Learn how to select quality prioritization, configure maximum photo dimensions, and preallocate resources.

    • 9:41 - Responsive capture best practices
    • Keep your app fast and responsive by implementing overlapping captures, deferred photo processing, and fast capture prioritization to minimize shot-to-shot delay.

Developer Footer

  • Videos
  • WWDC26
  • Implement high resolution photo capture
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • Apple Intelligence
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Downloads
    • Sample Code
    • Videos
    Open Menu Close Menu
    • Help Guides & Articles
    • Contact Us
    • Forums
    • Feedback & Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • Mini Apps Partner Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Read the latest news.
    Get the Apple Developer app.
    Copyright © 2026 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines