Advertisement
aNNiMON

HSBCorrection

May 23rd, 2013
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.42 KB | None | 0 0
  1. /**
  2.  * Класс коррекции HSB-палитры
  3.  * Добавлена нормализация, общий класс HSB-палитры и оптимизирован alpha-канал.
  4.  * Добавлен параметр для тонировки изображений.
  5.  * @author aNNiMON
  6.  */
  7. public class eHSBCorrection extends Effect {
  8.  
  9.     Amount getAmount() {
  10.         return new Amount(
  11.                 new int[] {0,   -100, -100, 0},
  12.                 new int[] {360, 100, 100,   1},
  13.                 new int[] {45,  0,   0,     0});
  14.     }
  15.  
  16.     void applyEffect() {
  17.         HSB hsbColor;
  18.         super.progressMax = pix.length;
  19.         boolean tone = (am.cur[3] == 1); //тонировка
  20.         for (int io = 0; io < pix.length; io++) {
  21.             super.progress = io;
  22.             int qr = (pix[io] >> 16) & 0xff;
  23.             int qg = (pix[io] >> 8) & 0xff;
  24.             int qb = pix[io] & 0xff;
  25.             hsbColor = RGBtoHSB(qr, qg, qb, tone);
  26.             hsbColor.changeChannels(am.cur[0], am.cur[1], am.cur[2]);
  27.             hsbColor.normalize();
  28.             pix[io] = (pix[io] & 0xff000000) | HSBtoRGB(hsbColor);
  29.         }
  30.     }
  31.    
  32.     private int HSBtoRGB(HSB hsb) {
  33.         float hue = hsb.hue;
  34.         float saturation = hsb.saturation / 100f;
  35.         float brightness = hsb.brightness / 100f;
  36.        
  37.         float qr = 0, qg = 0, qb = 0;
  38.         int r = 0, g = 0, b = 0;
  39.         if(saturation <= 0) {
  40.             r = (int) (brightness * 255);
  41.             if(r > 255) r = 255;
  42.             return (r << 16) | (r << 8) | r;
  43.         } else if (brightness <= 0) {
  44.             return 0;
  45.         }
  46.         qr = (hue / 60f); // временно для расчета h / 60
  47.         int Hi = (int) (qr % 6);
  48.         float f = (float) (qr - Math.floor(qr));
  49.         float p = brightness * (1.0f - saturation);
  50.         float q = brightness * (1.0f - (f * saturation));
  51.         float t = brightness * (1.0f - (saturation * (1.0f-f)));
  52.         switch(Hi) {
  53.             case 0: qr = brightness; qg = t; qb = p; break;
  54.             case 1: qr = q; qg = brightness; qb = p; break;
  55.             case 2: qr = p; qg = brightness; qb = t; break;
  56.             case 3: qr = p; qg = q; qb = brightness; break;
  57.             case 4: qr = t; qg = p; qb = brightness; break;
  58.             case 5: qr = brightness; qg = p; qb = q; break;
  59.         }
  60.         r = (int) (255 * qr);
  61.         g = (int) (255 * qg);
  62.         b = (int) (255 * qb);
  63.        
  64.         if(r > 255) r = 255;
  65.         if(g > 255) g = 255;
  66.         if(b > 255) b = 255;
  67.        
  68.         return (r << 16) | (g << 8) | b;
  69.     }
  70.    
  71.     private HSB RGBtoHSB(int Red, int Green, int Blue, boolean tone) {
  72.         int MaxRGB = (Red > Green) ? Red : Green;
  73.         if (Blue > MaxRGB) MaxRGB = Blue;
  74.         int MinRGB = (Red < Green) ? Red : Green;
  75.         if (Blue < MinRGB) MinRGB = Blue;
  76.        
  77.         float hue, saturation, brightness;
  78.         if(tone) {
  79.             hue = 0.0f;
  80.             float Delta = MaxRGB - MinRGB;
  81.             brightness = MaxRGB / 255f;
  82.             if (MaxRGB != 0.0f) {
  83.                 saturation = Delta / MaxRGB;
  84.             } else {
  85.                 saturation = 0.0f;
  86.             }
  87.             if (saturation != 0.0) {
  88.                 if (Red == MaxRGB) {
  89.                     hue = (Green - Blue) / Delta;
  90.                 } else if (Green == MaxRGB) {
  91.                     hue = 2.0f + (Blue - Red) / Delta;
  92.                 } else if (Blue == MaxRGB) {
  93.                     hue = 4.0f + (Red - Green) / Delta;
  94.                 }
  95.             } else {
  96.                 hue = -60.0f;
  97.             }
  98.             if (hue < 0) {
  99.                 hue = hue + 360.0f;
  100.             }
  101.             return new HSB(
  102.                     (int) hue,
  103.                     (int) (saturation * 100f),
  104.                     (int) (brightness * 100f));
  105.         } else {
  106.             brightness = ((float) MaxRGB) / 255.0f;
  107.             if (MaxRGB != 0)  {
  108.                 saturation = ((float) (MaxRGB - MinRGB)) / ((float) MaxRGB);
  109.             } else {
  110.                 saturation = 0.0f;
  111.             }
  112.  
  113.             if (saturation == 0.0f) {
  114.                 hue = -1.0f;
  115.             } else {
  116.                 float redc = ((float) (MaxRGB - Red)) / ((float) (MaxRGB - MinRGB));
  117.                 float greenc = ((float) (MaxRGB - Green)) / ((float) (MaxRGB - MinRGB));
  118.                 float bluec = ((float) (MaxRGB - Blue)) / ((float) (MaxRGB - MinRGB));
  119.                 if (Red == MaxRGB)
  120.                     hue = bluec - greenc;
  121.                 else if (Green == MaxRGB)
  122.                     hue = 2.0f + redc - bluec;
  123.                 else
  124.                     hue = 4.0f + greenc - redc;
  125.                 hue = hue / 6.0f;
  126.  
  127.             }
  128.             if (hue < 0.0f)
  129.                 hue = hue + 1.0f;
  130.             // Приведение значений к удобным диапазонам
  131.             hue = hue * 360.0f;
  132.             saturation = saturation * 100f;
  133.             brightness = brightness * 100f;
  134.             return new HSB(
  135.                     (int) hue,
  136.                     (int) saturation,
  137.                     (int) brightness);
  138.         }
  139.     }
  140.  
  141.     /**
  142.      * Класс цветовой модели HSB
  143.      */
  144.     private class HSB {
  145.        
  146.         /** Цветовой тон 0..360 */
  147.         private int hue;
  148.         /** Насыщенность 0..100 */
  149.         private int saturation;
  150.         /** Яркость 0..100 */
  151.         private int brightness;
  152.  
  153.         private HSB(int h, int s, int b) {
  154.             hue = h;
  155.             saturation = s;
  156.             brightness = b;
  157.         }
  158.        
  159.         /**
  160.          * Изменение значение каналов на заданную величину
  161.          * @param h тон
  162.          * @param s насыщенность
  163.          * @param b яркость
  164.          */
  165.         private void changeChannels(int h, int s, int b) {
  166.             hue = hue + h;
  167.             saturation = saturation + s;
  168.             brightness = brightness + b;
  169.         }
  170.        
  171.         /**
  172.          * Нормализация значений
  173.          */
  174.         private void normalize() {
  175.             if(hue > 360) hue = hue - 360;
  176.  
  177.             if(saturation > 100) saturation = 100;
  178.             else if(saturation < 0) saturation = 0;
  179.  
  180.             if(brightness > 100) brightness = 100;
  181.             else if(brightness < 0) brightness = 0;
  182.         }
  183.        
  184.     }
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement