Copy link to clipboard
Copied
Hi everyone! I have a quick question about the limitations of a photo blow-up for a poster. I can't share screenshots since the content is proprietary, but I will do my best to describe:
1. Boss wants an 5.5" x 8.5" photo to be blown up for a poster that is at least 30" on one side
The specs for the file I was given are: 1650 px x 2550 px (5.5" x 8.5"), Resolution is 300 and file size is 12M
2. I didn't think that would work because that's over double the size of the original so my assumption would be that the image would start to pixelate.
3. In Photoshop, I resized the image to be 30" on the long side and the new specs are:
Image size: 200M
Width: 12.413"
Height: 30"
Resolution 300
4. The image looks great when I open it and the resolution seems optimal based on that image size box.
My question is: would this actually print correctly if we send it to the printer? How is that resolution staying so stable and why is there no pixelation if it has been blown up to over twice its size?
Thank you! I hope this isn't an overly basic question, I am just trying to understand as much as I can about image size/resolution/dimension
Putting that formula into a basic script:
/*
Print Resolution Calculator Viewing Distance - Feet.jsx
Formula from @davescm
v1.0 - 13th February 2024, Stephen Marsh
v1.1 - 14th February 2024, Added canvas size to the alert
https://community.adobe.com/t5/photoshop-ecosystem-discussions/photo-blow-up-question/td-p/14416674
https://community.adobe.com/t5/photoshop-ecosystem-discussions/quick-question-how-to-you-tackle-image-size-regarding-printing-projects-distance-dpi/m-p/1327375...
A new version, combining the separate metric and imperial scripts into one script with a GUI, adding a scale factor field.
P.S. Just in case I broke something, I welcome testing and feedback, thanks.
EDIT: v1.3 Update, 21st August 2025
/*
Poster Viewing Distance Resolution Calculator v1-3.jsx
Stephen Marsh
v1.0 - 13th February 2024: Initial release
v1.1 - 14th February 2024: Added canvas size to the alert
v1.2 - 6th May 2025: Combined the separate metric and imperial scripts into a sin...
Copy link to clipboard
Copied
Note that the Resample box is checked. With this, Photoshop adds or removes pixels what an image is resized, setting the pixel dimensions based on the print dimensions and resolution.
When the Resample box is not checked, the resolution is set based on the pixel dimensions and the print dimensions.
There are several resampling methods available. Automatic is a good general purpose one, but they all have their uses.
It's a good idea to discuss this with the printer you use, as they can recommend what would work best on their press.
Copy link to clipboard
Copied
Thank you for your answer!
Copy link to clipboard
Copied
You may not need 300 PPI, it depends on viewing distance/conditions and the variables of the printing method.
Without resampling, you would only have an effective resolution of 85 PPI for 30 inches on the longest edge... So some resampling is probably required to avoid visible pixels.
The final image quality will depend on the source image content/quality and the resizing interpolation method used.
When you say it "looks great", what viewing % are you evaluating this at?
Copy link to clipboard
Copied
Thank you for your answer! I was just viewing it on my Mac desktop, so probably not a great assessment I am guessing
Copy link to clipboard
Copied
Posters can be printed in the 90-150ppi range and usually look pretty good. Photoshop has some built-in upsampling (in the Camera RAW module, and there is a neural upsampling filter) and there are numerous third-party solutions. I'd just try it in PS and see how it looks.
The printer should have a wide-format printer. Ask if they have a printer profile (to help with color matching.)
Copy link to clipboard
Copied
Thank you! I will definitely ask my printer
Copy link to clipboard
Copied
The above is entirely right. You do not need 300 ppi for large format printing. The bigger it is, the farther away it will be seen from, so the optical resolution stays the same. The eye wants to take in the whole image. You won't stick your nose into it.
Just for demonstration, look at a traditional monitor at 95-120 ppi. How close do you need to go before you see pixels? That's right, very close. For a wall-sized banner, as low as 15 - 20 ppi may be good enough.
300 ppi is for books and magazines to be seen at arm's length or less. Even so, there's nothing magical about the 300 number. It's not even a sharpness limit - it's a smoothness limit. With a standard halftone screen at 150 lines per inch, 300 pixels per inch is the theoretical upper limit beyond which no individual pixels can be detected. But it can still be eminently sharp at lower ppi.
All that said. 2250 x 1650 pixels is a small file to begin with. That sets limits to reproduction size under any circumstances. At 30", you will end at 75 ppi. While not disastrously low, it's still not very good.
Generally, all resampling disrupts the pixel structure and degrades the image. This is especially true for jpegs, which will never look good upsampled. In most normal circumstances, the image will look best as-is, without any upsampling. But sometimes you have to, to avoid visible pixels.
Copy link to clipboard
Copied
This is so helpful, thank you for taking the time to explain these concepts!
Copy link to clipboard
Copied
'I am just trying to understand as much as I can about image size/resolution/dimension'
Resizing can be done two ways.
First without resampling. So your 8.5" x 5.5" 300ppi image becomes 30" x 19.4" 85ppi. Overall it has the same number of pixels 2550x1650 =4.2 million pixels and the image is unchanged. If it is viewed from a greater distance so that it takes up the same field of view as the original viewed closer then the two will look identical. Only if you move closer will you see the pixel structure.
Second with resampling. If you resize and resample to 300ppi then your 8.5 x 5.5 300ppi image now becomes a 30" x 19.4" image at 300ppi and measures 9000 x 5824 = 52.4 million pixelspixels. You will not see any pixel structure, but those additional 48 million pixels had to be invented by the software based on the initial 4.2 million real image pixels. This 'invention' of image data can introduce artifacts.
So it is all about striking a balance between the visibility of the image pixel structure and the introduction of image artifacts.
What becomes important in striking that balance is viewing distance. It is obvious really, but the closer you get to view an image the more detail you can see.
There is a handy formula, based on good eyesight, to work out what ppi is required in order to avoid seeing image pixels.
ppi required = 6878/viewing distance in inches.
So, for example, if your poster will be viewed from say 4 feet away.
The formula gives 6878/48 = 143ppi. At that distance a higher ppi is finer than the eye can resolve.
Going any higher than that is wasted and just increases the chances of introducing resizing artifacts.
I hope that help
Dave
Edit : D Fosse posted while I was typing. We are both saying the same thing 🙂
Copy link to clipboard
Copied
Putting that formula into a basic script:
/*
Print Resolution Calculator Viewing Distance - Feet.jsx
Formula from @davescm
v1.0 - 13th February 2024, Stephen Marsh
v1.1 - 14th February 2024, Added canvas size to the alert
https://community.adobe.com/t5/photoshop-ecosystem-discussions/photo-blow-up-question/td-p/14416674
https://community.adobe.com/t5/photoshop-ecosystem-discussions/quick-question-how-to-you-tackle-image-size-regarding-printing-projects-distance-dpi/m-p/13273751
NOTE: This script assumes that the correct print size is set in the Image Size window
*/
#target photoshop
if (app.documents.length) {
var theViewingDistance = prompt("Enter the viewing distance in feet:", "1");
if (theViewingDistance < 1) {
theViewingDistance = 1;
}
var feetToInch = (theViewingDistance * 12);
var theResult = Math.round(6878 / feetToInch);
alert("Poster Size Print Resolution Calculator: " + "\r" + "Viewing Distance : " + theViewingDistance + " Feet" + "\r" + "Calculated PPI Value: " + theResult + " PPI" + "\r" + "Document Resolution: " + Math.round(app.activeDocument.resolution) + " PPI" + "\r" + "Canvas Size: " + activeDocument.width.as('in') + " x " + activeDocument.height.as('in') + " Inches" + "\r\r" + "(Based on the viewing distance, the ability to resolve 60 line pairs per degree and current document print dimensions)");
} else {
alert("A document must be open!");
}
Or for those of us who use the metric system:
/*
Print Resolution Calculator Viewing Distance - Metres.jsx
Formula from @davescm
v1.0 - 13th February 2024, Stephen Marsh
v1.1 - 14th February 2024, Added canvas size to the alert
https://community.adobe.com/t5/photoshop-ecosystem-discussions/photo-blow-up-question/td-p/14416674
https://community.adobe.com/t5/photoshop-ecosystem-discussions/quick-question-how-to-you-tackle-image-size-regarding-printing-projects-distance-dpi/m-p/13273751
NOTE: This script assumes that the correct print size is set in the Image Size window
*/
#target photoshop
if (app.documents.length) {
var theViewingDistance = prompt("Enter the viewing distance in metres:", "1");
// Metres to feet
theViewingDistance = (theViewingDistance * 3.281);
if (theViewingDistance < 3.281) {
theViewingDistance = 3.281;
}
var feetToInch = (theViewingDistance * 12);
var theResult = Math.round(6878 / feetToInch);
alert("Poster Size Print Resolution Calculator: " + "\r" + "Viewing Distance : " + (theViewingDistance / 3.281) + " Metres" + "\r" + "Calculated PPI Value: " + theResult + " PPI" + "\r" + "Document Resolution: " + Math.round(app.activeDocument.resolution) + " PPI" + "\r" + "Canvas Size: " + (Math.round(activeDocument.width.as('cm') * 100) / 100 + ' x ' + Math.round(activeDocument.height.as('cm') * 100) / 100 + ' CM') + "\r\r" + "(Based on the viewing distance, the ability to resolve 60 line pairs per degree and current document print dimensions)");
} else {
alert("A document must be open!");
}
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html
Copy link to clipboard
Copied
That's clever Stephen.
Dave
Copy link to clipboard
Copied
Thanks Dave, however, that was simple compared to the original formula!
More could be done... Perhaps opening up Image Size with the calculated PPI value set, or just automating resizing a copy of the original with the calculated value. There are many possibilities depending on how far one wishes to take this!
Copy link to clipboard
Copied
Thank you so much for this thorough answer Stephen_A_Marsh! I really appreciate the detail you have given here
Copy link to clipboard
Copied
A new version, combining the separate metric and imperial scripts into one script with a GUI, adding a scale factor field.
P.S. Just in case I broke something, I welcome testing and feedback, thanks.
EDIT: v1.3 Update, 21st August 2025
/*
Poster Viewing Distance Resolution Calculator v1-3.jsx
Stephen Marsh
v1.0 - 13th February 2024: Initial release
v1.1 - 14th February 2024: Added canvas size to the alert
v1.2 - 6th May 2025: Combined the separate metric and imperial scripts into a single script with a GUI, including a scale factor
v1.3 - 21st August 2025: Scale factor and minimum calculated PPI formula corrected
https://community.adobe.com/t5/photoshop-ecosystem-discussions/photo-blow-up-question/td-p/14416674#U15306592
https://community.adobe.com/t5/photoshop-ecosystem-discussions/photo-blow-up-question/td-p/14416674#U14419023
https://community.adobe.com/t5/photoshop-ecosystem-discussions/quick-question-how-to-you-tackle-image-size-regarding-printing-projects-distance-dpi/m-p/13273751
Related resources:
https://www.omnicalculator.com/other/pixels-to-print-size
https://www.insights4print.ceo/2025/04/stop-asking-for-300-ppi-or-dpi-images/
https://www.linkedin.com/pulse/300-ppp-le-culte-des-pixels-inutiles-branislav-mili%25C4%2587-1qx6f/?trackingId=OGo70EImQ5cm9d3Sqe4q5w%3D%3D
*/
#target photoshop
(function () {
// Check if a document is open
if (!app.documents.length) {
alert("A document must be open to use this script!");
return;
}
// Create the input dialog window
var dialog = new Window("dialog", "Poster Viewing Distance Resolution Calculator (v1.3)");
dialog.preferredSize.width = 380;
// Create the panel for dropdown and input field
var inputPanel = dialog.add("panel", undefined, "Input Parameters");
inputPanel.alignChildren = "left";
inputPanel.orientation = "column";
inputPanel.margins = 15;
inputPanel.preferredSize.width = 350;
// Dropdown for unit selection
var unitDropdown = inputPanel.add("dropdownlist", undefined, ["Metres", "Feet"]);
unitDropdown.selection = 0; // Default selection: Metres
// Input field for viewing distance
var distanceGroup = inputPanel.add("group");
distanceGroup.orientation = "row";
distanceGroup.add("statictext", undefined, "Viewing Distance:");
var distanceInput = distanceGroup.add("editnumber", undefined, "1");
distanceInput.characters = 8;
// Input field for scale factor
var scaleGroup = inputPanel.add("group");
scaleGroup.orientation = "row";
scaleGroup.add("statictext", undefined, "Scale Factor:");
var scaleInput = scaleGroup.add("editnumber", undefined, "1");
scaleInput.characters = 8;
// Add help text for scale factor
var helpText = inputPanel.add("statictext", undefined, "Scale Factor: 1 = 100%, 2 = 200%, 0.5 = 50% etc.");
helpText.preferredSize.width = 320;
// Event listener to change the editnumber field based on dropdown selection
unitDropdown.onChange = function () {
if (unitDropdown.selection.text === "Feet") {
distanceInput.text = "3"; // Set to 3 for Feet
} else if (unitDropdown.selection.text === "Metres") {
distanceInput.text = "1"; // Set to 1 for Metres
}
};
// Cancel and OK buttons
var buttonGroup = dialog.add("group");
buttonGroup.alignment = "right";
var cancelButton = buttonGroup.add("button", undefined, "Cancel");
var okButton = buttonGroup.add("button", undefined, "OK");
// Define OK button action
okButton.onClick = function () {
var unit = unitDropdown.selection.text; // Get selected unit
var viewingDistance = parseFloat(distanceInput.text); // Get entered distance
var scaleFactor = parseFloat(scaleInput.text); // Get scale factor
if (isNaN(viewingDistance)) {
alert("Please enter a valid number for the viewing distance.");
return;
}
if (isNaN(scaleFactor) || scaleFactor <= 0) {
alert("Please enter a valid positive number for the scale factor.");
return;
}
// Validate minimum viewing distance based on the selected unit
if (unit === "Metres" && viewingDistance < 1) {
alert("For Metres, the minimum viewing distance is 1.");
return;
} else if (unit === "Feet" && viewingDistance < 3) {
alert("For Feet, the minimum viewing distance is 3.");
return;
}
// Convert to feet if necessary
if (unit === "Metres") {
viewingDistance = viewingDistance * 3.281; // Metres → Feet
}
var inches = viewingDistance * 12;
////////////////////////////////////////////////////////////////////
// A "minimal" constant of 3438 PPI (or x2 of 6878 PPI for "optimal
// smoothness") is derived from the relationship between human visual
// acuity and the resolution needed for a print.
////////////////////////////////////////////////////////////////////
var minPPI = Number(3438);
var optPPI = Number(6878);
// ✅ Required PPI depends ONLY on viewing distance
var requiredPPI = Math.ceil(optPPI / inches);
// Document properties
var doc = app.activeDocument;
var docRes = Math.round(doc.resolution);
// Original dimensions (px)
var origWidthPx = Math.round(doc.width.as('px'));
var origHeightPx = Math.round(doc.height.as('px'));
// Scaled dimensions (px)
var scaledWidthPx = Math.round(origWidthPx * scaleFactor);
var scaledHeightPx = Math.round(origHeightPx * scaleFactor);
// Original print dimensions (inches or cm)
var origWidth = unit === "Metres" ?
(Math.round(doc.width.as('cm') * 100) / 100) :
(Math.round(doc.width.as('in') * 100) / 100).toFixed(2);
var origHeight = unit === "Metres" ?
(Math.round(doc.height.as('cm') * 100) / 100) :
(Math.round(doc.height.as('in') * 100) / 100).toFixed(2);
// Scaled print dimensions
var scaledWidth = unit === "Metres" ?
(Math.round((doc.width.as('cm') * scaleFactor) * 100) / 100) :
(Math.round((doc.width.as('in') * scaleFactor) * 100) / 100).toFixed(2);
var scaledHeight = unit === "Metres" ?
(Math.round((doc.height.as('cm') * scaleFactor) * 100) / 100) :
(Math.round((doc.height.as('in') * scaleFactor) * 100) / 100).toFixed(2);
// ✅ Effective resolution after scaling
var actualPPI = docRes / scaleFactor;
// Format display strings
var origSizeUnit = unit === "Metres" ? " CM" : " Inches";
var origCanvasSize = origWidth + " x " + origHeight + origSizeUnit;
var scaledCanvasSize = scaledWidth + " x " + scaledHeight + origSizeUnit;
var origCanvasSizePx = origWidthPx + " x " + origHeightPx + " PX";
var scaledCanvasSizePx = scaledWidthPx + " x " + scaledHeightPx + " PX";
// Show the result in a new window
var resultWindow = new Window("dialog", "Poster Viewing Distance Calculation Results");
resultWindow.preferredSize.width = 400;
resultWindow.orientation = "column";
resultWindow.alignChildren = "left";
resultWindow.spacing = 10;
var resultGroup = resultWindow.add("group");
resultGroup.orientation = "column";
resultGroup.alignChildren = "left";
resultGroup.spacing = 10;
resultGroup.add("statictext", undefined, "Viewing Distance: " +
(unit === "Metres" ? (viewingDistance / 3.281).toFixed(2) + " Metres" : viewingDistance + " Feet"));
resultGroup.add("statictext", undefined, "Scale Factor: " + scaleFactor);
var requiredText = resultGroup.add("statictext", undefined, "Required Minimum PPI: " + requiredPPI + " PPI");
var actualText = resultGroup.add("statictext", undefined, "Actual Effective PPI: " + actualPPI.toFixed(0) + " PPI");
var infoText = resultGroup.add("statictext", undefined,
actualPPI >= requiredPPI ?
"Note: There appears to be sufficient pixels for output at this print size." :
"Note: There may be insufficient pixels for output at this print size.",
{ multiline: true });
infoText.preferredSize.width = 365;
// Original size
resultGroup.add("statictext", undefined, "Original Print / Image Size:", { multiline: true });
resultGroup.add("statictext", undefined, origCanvasSize + " (" + origCanvasSizePx + ") ");
// Scaled size - only show if scale factor is not 1
if (scaleFactor !== 1) {
resultGroup.add("statictext", undefined, "Scaled Print Size:", { multiline: true });
resultGroup.add("statictext", undefined, scaledCanvasSize + " (" + scaledCanvasSizePx + ")", { multiline: true });
}
// Disclaimer text
var explanationText = resultGroup.add("statictext", undefined,
'\nDisclaimer: Calculations are based on the viewing distance and visual acuity assumptions. The results are intended for informational purposes only and should not be considered as definitive guidelines for print quality. Upscaling to achieve higher PPI is rarely recommended. This script is provided "as is".',
{ multiline: true });
explanationText.preferredSize.width = 365;
// ✅ Color code pass/fail based on comparison
if (actualPPI >= requiredPPI) {
requiredText.graphics.foregroundColor = actualText.graphics.newPen(actualText.graphics.PenType.SOLID_COLOR, [0, 1, 0, 1], 1);
} else {
requiredText.graphics.foregroundColor = actualText.graphics.newPen(actualText.graphics.PenType.SOLID_COLOR, [1, 0, 0, 1], 1);
}
// Add Close button
var buttonGroup = resultWindow.add("group");
buttonGroup.alignment = "right";
var closeButton = buttonGroup.add("button", undefined, "Close");
closeButton.onClick = function () { resultWindow.close(); };
resultWindow.layout.layout(true);
resultWindow.layout.resize();
resultWindow.center();
resultWindow.show();
dialog.close();
};
// Define Cancel button action
cancelButton.onClick = function () {
dialog.close();
};
// Show the input dialog
dialog.center();
dialog.show();
})();
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html
Copy link to clipboard
Copied
Wow thank you for taking the time to answer davescm!
Find more inspiration, events, and resources on the new Adobe Community
Explore Now