diff --git a/src/cli_args.rs b/src/cli_args.rs
index 1d70dc9db761e555a489c7487a7ceaa29044926d..f50c3b3413ce810a29a80dc4772125143440fb6a 100644
--- a/src/cli_args.rs
+++ b/src/cli_args.rs
@@ -126,10 +126,16 @@ impl Args {
 			Args::Info(info) => {
 				let image_data = load_image(&info.input, None)?;
 				let output = info.run(&image_data)?;
-				{
-					let file = std::fs::File::create(&info.output)?;
+
+				if let Some(out_path) = &info.output {
+					let file = std::fs::File::create(out_path)?;
 					serde_json::to_writer_pretty(file, &output)?;
+				} else {
+					let stdout = std::io::stdout();
+					let stdout_handle = stdout.lock();
+					serde_json::to_writer_pretty(stdout_handle, &output)?;
 				}
+
 				Ok(())
 			}
 		}
diff --git a/src/commands/info.rs b/src/commands/info.rs
index 140deea26171e8e8e2209db0283935104e0523a5..235d06e4ddb1e7beae4f8607ac77c10c581899f6 100644
--- a/src/commands/info.rs
+++ b/src/commands/info.rs
@@ -2,16 +2,16 @@ use clap::Parser;
 use image::{GenericImage, ImageFormat, Pixel};
 use serde::{Deserialize, Serialize};
 
-/// Extract Information About An Image
+/// Extract Information About An Image or Spritesheet
 #[derive(Debug, Clone, Parser, Serialize, Deserialize)]
 #[clap(author, version = "0.7.0")]
 pub struct Info {
 	/// The path to the image file
 	#[serde(default)]
 	pub input: String,
-	/// The path to write the flipped image
+	/// The output path for a JSON formatted information file. Omit to print to stdout
 	#[serde(default)]
-	pub output: String,
+	pub output: Option<String>,
 	/// The size of each tile in the spritesheet. Assumed to be square tiles
 	#[clap(short, long, default_value = None)]
 	#[serde(default)]
@@ -23,9 +23,13 @@ pub struct ImageInfo {
 	image_width: u32,
 	image_height: u32,
 	image_format: String,
+	#[serde(skip_serializing_if = "Option::is_none")]
 	tile_width: Option<u32>,
+	#[serde(skip_serializing_if = "Option::is_none")]
 	tile_height: Option<u32>,
+	#[serde(skip_serializing_if = "Option::is_none")]
 	rows: Option<u32>,
+	#[serde(skip_serializing_if = "Option::is_none")]
 	columns: Option<u32>,
 }