diff --git a/frontends/sdl/src/main.rs b/frontends/sdl/src/main.rs
index c5ddebe19adef5ef50e91c051cdb4304f09846bd..59f0ba73eca5ce49ac2dc3d242604481d06a6425 100644
--- a/frontends/sdl/src/main.rs
+++ b/frontends/sdl/src/main.rs
@@ -15,7 +15,7 @@ use boytacean::{
 };
 use chrono::Utc;
 use clap::Parser;
-use image::ColorType;
+use image::{ColorType, ImageBuffer, Rgb};
 use sdl::{surface_from_bytes, SdlSystem};
 use sdl2::{event::Event, keyboard::Keycode, pixels::PixelFormatEnum, Sdl};
 use std::{
@@ -247,6 +247,23 @@ impl Emulator {
         );
     }
 
+    fn save_image(&mut self, file_path: &str) {
+        let width = DISPLAY_WIDTH as u32;
+        let height = DISPLAY_HEIGHT as u32;
+        let pixels = self.system.frame_buffer();
+
+        let mut image_buffer: ImageBuffer<Rgb<u8>, Vec<u8>> = ImageBuffer::new(width, height);
+
+        for (x, y, pixel) in image_buffer.enumerate_pixels_mut() {
+            let base = ((y * width + x) * 3) as usize;
+            *pixel = Rgb([pixels[base], pixels[base + 1], pixels[base + 2]])
+        }
+
+        image_buffer
+            .save_with_format(file_path, image::ImageFormat::Png)
+            .unwrap();
+    }
+
     pub fn toggle_audio(&mut self) {
         let apu_enabled = self.system.apu_enabled();
         self.system.set_apu_enabled(!apu_enabled);
@@ -319,6 +336,10 @@ impl Emulator {
                         keycode: Some(Keycode::B),
                         ..
                     } => self.benchmark(&Benchmark::default()),
+                    Event::KeyDown {
+                        keycode: Some(Keycode::I),
+                        ..
+                    } => self.save_image("screen.png"),
                     Event::KeyDown {
                         keycode: Some(Keycode::T),
                         ..