Version: 1.0 (using KDE 4.3.4) OS: Linux Installed from: openSUSE RPMs In Gimp's save dialogue I found an option "use the quality settings of the orginal picture". I think this would help users in digikam to not decrease the quality of a picture by default, i.e. because digikam uses the value from the setup dialogue.
Andreas, Do you have an idea, how gimp can take the image quality value (JPEG compression) from file ? It's recorded somewhere in metadata ? Gilles Caulier
ImageMagick's "identify" tool can display Quality (and lots of other parameters the image was saved with) See http://www.imagemagick.org/script/identify.php GraphicsMagick might be an option, too, but haven't checked.
imagemagick is already a dependency of digikam. So it could be used indeed. Thanks for the hint!
no, IM is not a depency of digiKam, but to kipi-plugins, as run-time... Gilles Caulier
Well, you could have a look at ImageMagick's source to see how to compute the average Quality from the quantization coefficient matrix.
An IM example : [gilles@localhost Camera]$ identify -verbose Bryce_2007_0102.jpg Image: Bryce_2007_0102.jpg Format: JPEG (Joint Photographic Experts Group JFIF format) Class: DirectClass Geometry: 3872x2592+0+0 Resolution: 300x300 Print size: 12.9067x8.64 Units: PixelsPerInch Type: TrueColor Endianess: Undefined Colorspace: sRGB Depth: 8-bit Channel depth: red: 8-bit green: 8-bit blue: 8-bit Channel statistics: Red: min: 4 (0.0156863) max: 255 (1) mean: 112.346 (0.440574) standard deviation: 49.9501 (0.195883) kurtosis: -0.905399 skewness: 0.0162092 Green: min: 3 (0.0117647) max: 239 (0.937255) mean: 94.4013 (0.370201) standard deviation: 56.1 (0.22) kurtosis: -0.899077 skewness: 0.540585 Blue: min: 0 (0) max: 232 (0.909804) mean: 92.1944 (0.361547) standard deviation: 71.8705 (0.281845) kurtosis: -1.19741 skewness: 0.634281 Image statistics: Overall: min: 0 (0) max: 255 (1) mean: 99.6473 (0.390774) standard deviation: 60.0211 (0.235377) kurtosis: -1.00412 skewness: 0.407677 Rendering intent: Perceptual Gamma: 0.45455 Chromaticity: red primary: (0.64,0.33) green primary: (0.3,0.6) blue primary: (0.15,0.06) white point: (0.3127,0.329) Interlace: None Background color: white Border color: srgb(223,223,223) Matte color: grey74 Transparent color: black Compose: Over Page geometry: 3872x2592+0+0 Dispose: Undefined Iterations: 0 Compression: JPEG Quality: 99 Orientation: TopLeft Properties: comment: Bryce Canyon NP. Thor's hammer (si j'avais un marteau ...) Mais que pouvait bien venir faire Thor dans cet endroit ?? date:create: 2012-07-11T09:05:33+02:00 date:modify: 2008-03-06T00:00:00+01:00 exif:CFAPattern: 0, 2, 0, 2, 1, 0, 2, 1 exif:ColorSpace: 1 exif:ComponentsConfiguration: 1, 2, 3, 0 exif:CompressedBitsPerPixel: 4/1 exif:Compression: 6 exif:Contrast: 0 exif:CustomRendered: 0 exif:DateTime: 2007:07:30 08:44:54 exif:DateTimeDigitized: 2007:07:30 08:44:54 exif:DateTimeOriginal: 2007:07:30 08:44:54 exif:DigitalZoomRatio: 1/1 exif:ExifImageLength: 2592 exif:ExifImageWidth: 3872 exif:ExifOffset: 277 exif:ExifVersion: 48, 50, 50, 49 exif:ExposureBiasValue: 0/6 exif:ExposureMode: 0 exif:ExposureProgram: 3 exif:ExposureTime: 10/800 exif:FileSource: 3 exif:Flash: 0 exif:FlashPixVersion: 48, 49, 48, 48 exif:FNumber: 100/10 exif:FocalLength: 180/10 exif:FocalLengthIn35mmFilm: 27 exif:GainControl: 0 exif:GPSInfo: 3378 exif:GPSVersionID: 2, 2, 0, 0 exif:InteroperabilityIndex: R98 exif:InteroperabilityOffset: 3348 exif:InteroperabilityVersion: 48, 49, 48, 48 exif:ISOSpeedRatings: 100 exif:JPEGInterchangeFormat: 3502 exif:JPEGInterchangeFormatLength: 9141 exif:LightSource: 9 exif:Make: NIKON CORPORATION exif:MakerNote: 78, 105, 107, 111, 110, 0, 2, 16, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 51, 0, 1, 0, 7, 0, 0, 0, 4, 48, 50, 49, 48, 0, 2, 0, 3, 0, 0, 0, 2, 0, 0, 0, 100, 0, 3, 0, 2, 0, 0, 0, 6, 0, 0, 2, 114, 0, 4, 0, 2, 0, 0, 0, 8, 0, 0, 2, 120, 0, 5, 0, 2, 0, 0, 0, 13, 0, 0, 2, 128, 0, 6, 0, 2, 0, 0, 0, 7, 0, 0, 2, 141, 0, 7, 0, 2, 0, 0, 0, 7, 0, 0, 2, 148, 0, 8, 0, 2, 0, 0, 0, 13, 0, 0, 2, 155, 0, 9, 0, 2, 0, 0, 0, 20, 0, 0, 2, 168, 0, 11, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 12, 0, 5, 0, 0, 0, 4, 0, 0, 2, 188, 0, 13, 0, 7, 0, 0, 0, 4, 0, 1, 6, 0, 0, 14, 0, 7, 0, 0, 0, 4, 0, 1, 12, 0, 0, 17, 0, 4, 0, 0, 0, 1, 0, 0, 9, 62, 0, 18, 0, 7, 0, 0, 0, 4, 0, 1, 6, 0, 0, 19, 0, 3, 0, 0, 0, 2, 0, 0, 0, 100, 0, 22, 0, 3, 0, 0, 0, 4, 0, 0, 2, 220, 0, 23, 0, 7, 0, 0, 0, 4, 0, 1, 6, 0, 0, 24, 0, 7, 0, 0, 0, 4, 0, 1, 6, 0, 0, 25, 0, 10, 0, 0, 0, 1, 0, 0, 2, 228, 0, 27, 0, 3, 0, 0, 0, 7, 0, 0, 2, 236, 0, 28, 0, 7, 0, 0, 0, 3, 0, 1, 6, 0, 0, 29, 0, 2, 0, 0, 0, 8, 0, 0, 2, 250, 0, 30, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 0, 32, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 129, 0, 2, 0, 0, 0, 9, 0, 0, 3, 2, 0, 131, 0, 1, 0, 0, 0, 1, 6, 0, 0, 0, 0, 132, 0, 5, 0, 0, 0, 4, 0, 0, 3, 11, 0, 135, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 136, 0, 7, 0, 0, 0, 4, 0, 9, 2, 0, 0, 137, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 138, 0, 3, 0, 0, 0, 1, 0, 2, 0, 0, 0, 139, 0, 7, 0, 0, 0, 4, 64, 1, 12, 0, 0, 141, 0, 2, 0, 0, 0, 9, 0, 0, 3, 43, 0, 144, 0, 2, 0, 0, 0, 12, 0, 0, 3, 52, 0, 145, 0, 7, 0, 0, 3, 16, 0, 0, 3, 64, 0, 146, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 149, 0, 2, 0, 0, 0, 5, 0, 0, 6, 80, 0, 151, 0, 7, 0, 0, 2, 96, 0, 0, 6, 85, 0, 152, 0, 7, 0, 0, 0, 31, 0, 0, 8, 181, 0, 154, 0, 5, 0, 0, 0, 2, 0, 0, 8, 212, 0, 162, 0, 4, 0, 0, 0, 1, 0, 85, 42, 200, 0, 163, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 165, 0, 4, 0, 0, 0, 1, 0, 0, 9, 115, 0, 166, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 167, 0, 4, 0, 0, 0, 1, 0, 0, 9, 115, 0, 168, 0, 7, 0, 0, 0, 20, 0, 0, 8, 228, 0, 169, 0, 2, 0, 0, 0, 16, 0, 0, 8, 248, 0, 170, 0, 2, 0, 0, 0, 16, 0, 0, 9, 8, 0, 176, 0, 7, 0, 0, 0, 16, 0, 0, 9, 24, 0, 177, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 67, 79, 76, 79, 82, 0, 70, 73, 78, 69, 32, 32, 32, 0, 83, 85, 78, 78, 89, 32, 32, 32, 32, 32, 32, 32, 0, 78, 79, 82, 77, 65, 76, 0, 65, 70, 45, 83, 32, 32, 0, 78, 79, 82, 77, 65, 76, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 1, 206, 0, 0, 1, 0, 0, 0, 1, 102, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 15, 32, 10, 32, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 15, 64, 10, 56, 15, 64, 10, 56, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 0, 65, 85, 84, 79, 32, 32, 32, 32, 0, 0, 0, 0, 180, 0, 0, 0, 10, 0, 0, 2, 188, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 0, 45, 0, 0, 0, 10, 77, 79, 68, 69, 51, 32, 32, 32, 0, 78, 65, 84, 85, 82, 65, 76, 32, 32, 32, 32, 0, 48, 50, 48, 55, 44, 200, 40, 99, 140, 36, 162, 43, 21, 117, 252, 27, 87, 176, 38, 185, 105, 54, 32, 39, 75, 140, 234, 101, 253, 178, 132, 115, 127, 168, 238, 81, 209, 110, 40, 255, 243, 4, 50, 125, 229, 106, 12, 203, 167, 160, 182, 233, 57, 166, 48, 215, 155, 124, 122, 149, 205, 34, 148, 35, 207, 152, 126, 129, 161, 222, 56, 175, 67, 244, 194, 173, 55, 252, 52, 71, 247, 144, 1, 27, 9, 86, 14, 101, 240, 108, 54, 227, 181, 146, 164, 218, 108, 136, 14, 177, 113, 9, 74, 95, 181, 228, 82, 221, 133, 74, 44, 43, 71, 248, 251, 73, 137, 134, 80, 55, 48, 172, 74, 200, 107, 250, 52, 69, 110, 253, 158, 224, 6, 24, 79, 15, 227, 114, 150, 13, 85, 186, 60, 218, 208, 112, 102, 121, 169, 231, 113, 246, 186, 236, 23, 133, 0, 114, 249, 27, 130, 104, 47, 139, 17, 47, 242, 191, 51, 48, 114, 60, 57, 236, 156, 77, 55, 128, 38, 84, 72, 195, 132, 50, 47, 153, 124, 240, 157, 249, 212, 202, 15, 24, 190, 65, 225, 158, 120, 111, 129, 180, 7, 115, 235, 155, 24, 7, 116, 80, 134, 217, 73, 194, 240, 83, 7, 44, 74, 132, 165, 127, 155, 211, 114, 20, 98, 69, 53, 34, 126, 93, 243, 254, 150, 157, 197, 31, 105, 235, 135, 65, 20, 9, 25, 9, 16, 247, 123, 28, 250, 148, 201, 130, 244, 122, 63, 56, 215, 168, 136, 94, 152, 199, 35, 148, 34, 205, 149, 122, 126, 155, 215, 48, 166, 57, 233, 166, 160, 167, 203, 14, exif:MaxApertureValue: 36/10 exif:MeteringMode: 2 exif:Model: NIKON D200 exif:Orientation: 1 exif:ResolutionUnit: 2 exif:Saturation: 0 exif:SceneCaptureType: 0 exif:SceneType: 1 exif:SensingMethod: 2 exif:Sharpness: 0 exif:Software: Ver.2.00 exif:SubjectDistanceRange: 0 exif:SubSecTime: 73 exif:SubSecTimeDigitized: 73 exif:SubSecTimeOriginal: 73 exif:UserComment: 65, 83, 67, 73, 73, 0, 0, 0, 66, 114, 121, 99, 101, 32, 67, 97, 110, 121, 111, 110, 32, 78, 80, 46, 32, 32, 84, 104, 111, 114, 39, 115, 32, 104, 97, 109, 109, 101, 114, 32, 40, 115, 105, 32, 106, 39, 97, 118, 97, 105, 115, 32, 117, 110, 32, 109, 97, 114, 116, 101, 97, 117, 32, 46, 46, 46, 41, 32, 77, 97, 105, 115, 32, 113, 117, 101, 32, 112, 111, 117, 118, 97, 105, 116, 32, 98, 105, 101, 110, 32, 118, 101, 110, 105, 114, 32, 102, 97, 105, 114, 101, 32, 84, 104, 111, 114, 32, 100, 97, 110, 115, 32, 99, 101, 116, 32, 101, 110, 100, 114, 111, 105, 116, 32, 63, 63, 32 exif:WhiteBalance: 1 exif:XResolution: 300/1 exif:YCbCrPositioning: 2 exif:YResolution: 300/1 jpeg:colorspace: 2 jpeg:sampling-factor: 2x1,1x1,1x1 signature: 70f55c68fa1f5a1e244988f290246cb5b6ee2939208fb6695c2c8994a945889d unknown: digiKam-0.9.2-final Profiles: Profile-8bim: 290 bytes Profile-exif: 12649 bytes Profile-iptc: 277 bytes Originating Program[2,65]: digiKam Program Version[2,70]: 0.9.2-final Caption[2,120]: Bryce Canyon NP. Thor's hammer (si j'avais un marteau ...) Mais que pouvait bien venir faire Thor dans cet endroit ?? Priority[2,10]: 5 Byline[2,80]: Pottier Michel Byline Title[2,85]: Credit[2,110]: Src[2,115]: Copyright String[2,116]: Pottier Created Date[2,55]: 20070730 Created Time[2,60]: 084454+0000 Keyword[2,25]: Nature/Paysage Keyword[2,25]: lieux/USA/Bryce NP Artifacts: filename: Bryce_2007_0102.jpg verbose: true Tainted: False Filesize: 5.595MB Number pixels: 10.04M Pixels per second: 10.68MB User time: 0.670u Elapsed time: 0:01.940 Version: ImageMagick 6.7.5-10 2012-08-22 Q16 http://www.imagemagick.org Look relevant info : Compression: JPEG Quality: 99 Gilles Caulier
Code taken from IM JPEG codec : { ssize_t j, qvalue, sum; register ssize_t i; /* Determine the JPEG compression quality from the quantization tables. */ sum=0; for (i=0; i < NUM_QUANT_TBLS; i++) { if (jpeg_info->quant_tbl_ptrs[i] != NULL) for (j=0; j < DCTSIZE2; j++) sum+=jpeg_info->quant_tbl_ptrs[i]->quantval[j]; } if ((jpeg_info->quant_tbl_ptrs[0] != NULL) && (jpeg_info->quant_tbl_ptrs[1] != NULL)) { ssize_t hash[101] = { 1020, 1015, 932, 848, 780, 735, 702, 679, 660, 645, 632, 623, 613, 607, 600, 594, 589, 585, 581, 571, 555, 542, 529, 514, 494, 474, 457, 439, 424, 410, 397, 386, 373, 364, 351, 341, 334, 324, 317, 309, 299, 294, 287, 279, 274, 267, 262, 257, 251, 247, 243, 237, 232, 227, 222, 217, 213, 207, 202, 198, 192, 188, 183, 177, 173, 168, 163, 157, 153, 148, 143, 139, 132, 128, 125, 119, 115, 108, 104, 99, 94, 90, 84, 79, 74, 70, 64, 59, 55, 49, 45, 40, 34, 30, 25, 20, 15, 11, 6, 4, 0 }, sums[101] = { 32640, 32635, 32266, 31495, 30665, 29804, 29146, 28599, 28104, 27670, 27225, 26725, 26210, 25716, 25240, 24789, 24373, 23946, 23572, 22846, 21801, 20842, 19949, 19121, 18386, 17651, 16998, 16349, 15800, 15247, 14783, 14321, 13859, 13535, 13081, 12702, 12423, 12056, 11779, 11513, 11135, 10955, 10676, 10392, 10208, 9928, 9747, 9564, 9369, 9193, 9017, 8822, 8639, 8458, 8270, 8084, 7896, 7710, 7527, 7347, 7156, 6977, 6788, 6607, 6422, 6236, 6054, 5867, 5684, 5495, 5305, 5128, 4945, 4751, 4638, 4442, 4248, 4065, 3888, 3698, 3509, 3326, 3139, 2957, 2775, 2586, 2405, 2216, 2037, 1846, 1666, 1483, 1297, 1109, 927, 735, 554, 375, 201, 128, 0 }; qvalue=(ssize_t) (jpeg_info->quant_tbl_ptrs[0]->quantval[2]+ jpeg_info->quant_tbl_ptrs[0]->quantval[53]+ jpeg_info->quant_tbl_ptrs[1]->quantval[0]+ jpeg_info->quant_tbl_ptrs[1]->quantval[DCTSIZE2-1]); for (i=0; i < 100; i++) { if ((qvalue < hash[i]) && (sum < sums[i])) continue; if (((qvalue <= hash[i]) && (sum <= sums[i])) || (i >= 50)) image->quality=(size_t) i+1; if (image->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), "Quality: %.20g (%s)",(double) i+1,(qvalue <= hash[i]) && (sum <= sums[i]) ? "exact" : "approximate"); break; } } else if (jpeg_info->quant_tbl_ptrs[0] != NULL) { ssize_t hash[101] = { 510, 505, 422, 380, 355, 338, 326, 318, 311, 305, 300, 297, 293, 291, 288, 286, 284, 283, 281, 280, 279, 278, 277, 273, 262, 251, 243, 233, 225, 218, 211, 205, 198, 193, 186, 181, 177, 172, 168, 164, 158, 156, 152, 148, 145, 142, 139, 136, 133, 131, 129, 126, 123, 120, 118, 115, 113, 110, 107, 105, 102, 100, 97, 94, 92, 89, 87, 83, 81, 79, 76, 74, 70, 68, 66, 63, 61, 57, 55, 52, 50, 48, 44, 42, 39, 37, 34, 31, 29, 26, 24, 21, 18, 16, 13, 11, 8, 6, 3, 2, 0 }, sums[101] = { 16320, 16315, 15946, 15277, 14655, 14073, 13623, 13230, 12859, 12560, 12240, 11861, 11456, 11081, 10714, 10360, 10027, 9679, 9368, 9056, 8680, 8331, 7995, 7668, 7376, 7084, 6823, 6562, 6345, 6125, 5939, 5756, 5571, 5421, 5240, 5086, 4976, 4829, 4719, 4616, 4463, 4393, 4280, 4166, 4092, 3980, 3909, 3835, 3755, 3688, 3621, 3541, 3467, 3396, 3323, 3247, 3170, 3096, 3021, 2952, 2874, 2804, 2727, 2657, 2583, 2509, 2437, 2362, 2290, 2211, 2136, 2068, 1996, 1915, 1858, 1773, 1692, 1620, 1552, 1477, 1398, 1326, 1251, 1179, 1109, 1031, 961, 884, 814, 736, 667, 592, 518, 441, 369, 292, 221, 151, 86, 64, 0 }; qvalue=(ssize_t) (jpeg_info->quant_tbl_ptrs[0]->quantval[2]+ jpeg_info->quant_tbl_ptrs[0]->quantval[53]); for (i=0; i < 100; i++) { if ((qvalue < hash[i]) && (sum < sums[i])) continue; if (((qvalue <= hash[i]) && (sum <= sums[i])) || (i >= 50)) image->quality=(size_t) i+1; if (image->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), "Quality: %.20g (%s)",(double) i+1,(qvalue <= hash[i]) && (sum <= sums[i]) ? "exact" : "approximate"); break; } } } See JPEGSetImageQuality() method from here for details : https://www.imagemagick.org/subversion/ImageMagick/trunk/coders/jpeg.c
Maik, Another entry not too difficult to implement as IM code is here. A new method must be created in JPEGUtils to determine the JPEG compression quality from the quantization tables. A new option in JPEG IO File Settings must be add to use it as well. Gilles
Git commit e908aa4e278967ad7276086eeb9ee61a8400f29b by Maik Qualmann. Committed on 30/06/2015 at 20:11. Pushed by mqualmann into branch 'master'. function added to get the JPEG quality from image, first used for lossy transform M +168 -0 libs/jpegutils/jpegutils.cpp M +1 -0 libs/jpegutils/jpegutils.h http://commits.kde.org/digikam/e908aa4e278967ad7276086eeb9ee61a8400f29b
Git commit 60b3d50b19920499cc34814e37da4fa229252589 by Gilles Caulier. Committed on 01/07/2015 at 07:58. Pushed by cgilles into branch 'frameworks'. backport commit #e908aa4e278967ad7276086eeb9ee61a8400f29b from git/master to frameworks branch M +168 -0 libs/jpegutils/jpegutils.cpp M +1 -0 libs/jpegutils/jpegutils.h http://commits.kde.org/digikam/60b3d50b19920499cc34814e37da4fa229252589