views:

318

answers:

6

This is really a two part question, since I don't fully understand how these things work just yet:

My situation: I'm writing a web app which lets the user upload an image. My app then resizes to something displayable (eg: 640x480-ish) and saves the file for use later.

My questions:

  1. Given an arbitrary JPEG file, is it possible to tell what the quality level is, so that I can use that same quality when saving the resized image?
  2. Does this even matter?? Should I be saving all the images at a decent level (eg: 75-80), regardless of the original quality?

I'm not so sure about this because, as I figure it: (let's take an extreme example), if someone had a 5 megapixel image saved at quality 0, it would be blocky as anything. Reducing the image size to 640x480, the blockiness would be smoothed out and barely less noticeable... until I saved it with quality 0 again...

On the other end of the spectrum, if there was an image which was 800x600 with q=0, resizing to 640x480 isn't going to change the fact that it looks like utter crap, so saving with q=80 would be redundant.

Am I even close?

I'm using GD2 library on PHP if that is of any use

+2  A: 

Every new save of the file will further decrease overall quality, by using higher quality values you will preserve more of image. Regardless of what original image quality was.

Alexander Taran
+7  A: 
  1. JPEG is a lossy format. Every time you save a JPEG same image, regardless of quality level, you will reduce the actual image quality. Therefore even if you did obtain a quality level from the file, you could not maintain that same quality when you save a JPEG again (even at quality=100).

  2. You should save your JPEG at as high a quality as you can afford in terms of file size. Or use a loss-less format such as PNG.

Low quality JPEG files do not simply become more blocky. Instead colour depth is reduced and the detail of sections of the image are removed. You can't rely on lower quality images being blocky and looking ok at smaller sizes.

According to the JFIF spec. the quality number (0-100) of an image is saved at is not stored in the image header, although the horizontal and vertical pixel density is stored.

Ash
+1, it's true in general that resaving a JPEG will tend to reduce quality, but in some restricted cases this can be worked around -- see http://en.wikipedia.org/wiki/Jpeg#Lossless_editing. E.g. Irfanview has a plugin for lossless JPEG cropping/rotating.
j_random_hacker
@j_random I hadn't heard of that IrfanView plugin, thanks.
Ash
do you know if the same applies to mpeg videos?
johnny
@johnny, MPEG2 (and I believe MPEG4) also uses lossy compression, so re-encoding multiple times will reduce the quality. Not sure if the compression level is stored in the MPEG headers though.
Ash
+1  A: 

If you resave a JPEG using the same software that created it originally, using the same settings, you'll find that the damage is minimized - the algorithm will tend to throw out the same information it threw out the first time. I don't think there's any way to know what level was selected just by looking at the file; even if you could, different software almost guarantees different parameters and rounding, making a match almost impossible.

Mark Ransom
+3  A: 

Jpeg compression algorithm has some parameters which influence on the quality of the result image.

One of such parameters are quantization tables which defines how many bits will be used on each coefficient. Different programs use different quatization tables.

Some programs allow user to set quality level 0-100. But there is no common defenition of this number. The image made with Photoshop with 60% quality takes 46 KB, while the image made with GIMP takes only 26 KB.

Quantization tables are also different.

There are other parameters such subsampling, dct method and etc.

So you can't describe all of them by single quality level number and you can't compare quality of jpeg images by single number. But you can create such number like photoshop or gimp which will describe compromiss between size on quality.

More information: http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html

Common practice is that you resize the image to appropriate size and apply jpeg after that. In this case huge and middle images will have the same size and quality.

ton4eg
A: 

This may be a silly question, but why would you be concerned about micromanaging the quality of the document? I believe if you use ImageMagick to do the conversion, it will manage the quality of the JPEG for you for best effect. http://www.php.net/manual/en/intro.imagick.php

bryanjonker
+2  A: 

So, there are basically two cases you care about:

  1. If an incoming image has quality set too high, it may take up an inappropriate amount of space. Therefore, you might want, for example, to reduce incoming q=99 to q=85.

  2. If an incoming image has quality set too low, it might be a waste of space to raise it's quality. Except that an image that's had a large amount of data discarded won't magically take up more space when the quality is raised -- blocky images will compress very nicely even at high quality settings. So, in my opinion it's perfectly OK to raise incoming q=1 to q=85.

From this I would think simply forcing a decent quality setting is a perfectly acceptable thing to do.

Eric Seppanen