Bug 217984 - FILEIO : add new option to use quality of the original JPEG picture
Summary: FILEIO : add new option to use quality of the original JPEG picture
Status: REPORTED
Alias: None
Product: digikam
Classification: Applications
Component: Plugin-DImg-JPEG (show other bugs)
Version: 2.9.0
Platform: openSUSE Linux
: NOR wishlist
Target Milestone: ---
Assignee: Digikam Developers
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-12-09 13:52 UTC by S. Burmeister
Modified: 2017-07-30 16:32 UTC (History)
3 users (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description S. Burmeister 2009-12-09 13:52:21 UTC
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.
Comment 1 caulier.gilles 2012-09-11 20:03:03 UTC
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
Comment 2 Christoph Feck 2012-09-11 22:40:21 UTC
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.
Comment 3 S. Burmeister 2012-09-12 00:14:48 UTC
imagemagick is already a dependency of digikam. So it could be used indeed.

Thanks for the hint!
Comment 4 caulier.gilles 2012-09-12 04:52:13 UTC
no, IM is not a depency of digiKam, but to kipi-plugins, as run-time...

Gilles Caulier
Comment 5 Christoph Feck 2012-09-12 08:55:26 UTC
Well, you could have a look at ImageMagick's source to see how to compute the average Quality from the quantization coefficient matrix.
Comment 6 caulier.gilles 2012-09-12 09:24:11 UTC
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
Comment 7 caulier.gilles 2012-09-12 09:45:31 UTC
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
Comment 8 caulier.gilles 2015-05-12 12:40:33 UTC
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
Comment 9 Maik Qualmann 2015-06-30 20:13:50 UTC
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
Comment 10 caulier.gilles 2015-07-01 07:58:46 UTC
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