1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.imaging.formats.png;
18
19 import java.util.logging.Level;
20 import java.util.logging.Logger;
21
22 public class GammaCorrection {
23
24 private static final Logger LOGGER = Logger.getLogger(GammaCorrection.class.getName());
25
26 private final int[] lookupTable;
27
28 public GammaCorrection(final double srcGamma, final double dstGamma) {
29
30 if (LOGGER.isLoggable(Level.FINEST)) {
31 LOGGER.finest("srcGamma: " + srcGamma);
32 LOGGER.finest("dstGamma: " + dstGamma);
33 }
34
35 lookupTable = new int[256];
36 for (int i = 0; i < 256; i++) {
37 lookupTable[i] = correctSample(i, srcGamma, dstGamma);
38 if (LOGGER.isLoggable(Level.FINEST)) {
39 LOGGER.finest("lookupTable[" + i + "]: " + lookupTable[i]);
40 }
41 }
42 }
43
44 public int correctArgb(final int pixel) {
45 final int alpha = 0xff000000 & pixel;
46 int red = pixel >> 16 & 0xff;
47 int green = pixel >> 8 & 0xff;
48 int blue = pixel >> 0 & 0xff;
49
50 red = correctSample(red);
51 green = correctSample(green);
52 blue = correctSample(blue);
53
54 return alpha | (0xff & red) << 16 | (0xff & green) << 8 | (0xff & blue) << 0;
55 }
56
57 public int correctSample(final int sample) {
58 return lookupTable[sample];
59 }
60
61 private int correctSample(final int sample, final double srcGamma, final double dstGamma) {
62
63
64
65
66
67
68
69 return (int) Math.round(255.0d * Math.pow(sample / 255.0d, srcGamma / dstGamma));
70 }
71
72 }