2012-06-22 2 views

ответ

11

Карта из RGB в HSL (Hue/насыщенность/яркость), сохранить оттенок и насыщенность же, а просто изменить яркость, а затем сделать обратное преобразование из HSL в RGB.

You can read more about the RGB to HSL and HSL to RGB transformations here.

Если вы хотите более подробно, чем вы должны задать более конкретный вопрос.

+0

Неа это то, что я просил. Спасибо огромное! – user1475859

15

Самый простой способ - умножить каждое значение R, G, B на некоторую константу - если константа> 1, она сделает ее ярче, и если < 1 будет темнее. Если вы делаете это ярче, вы должны проверить каждое значение, чтобы убедиться, что оно не превышает максимальный (обычно 255).

Не только это проще, чем перевод с RGB на HSL и обратно, но он более близко приближается к тому, что происходит, когда вы светете другое количество света на физическом объекте.

+0

Да, получается точная вещь под моделью 'L = (R + G + B)/3', но некоторые модели яркости не используют это предположение (см. Страницу Wikipedia, с которой я связан.) Поскольку ОП был расплывчатым, я решил быть «общим». –

+0

@ChrisA. действительно ли это работает на одно и то же? Я думал, что существует некоторое взаимодействие между L и S, например, что действительно плохо, если вы делаете радикальные изменения. –

+0

Хорошая точка! Именно поэтому я попытался принять как можно меньше в своем ответе и оставить его общим. Я помню, что узнал, что это происходит, хотя Марк, но сейчас я пытаюсь это сделать, просто ради любопытства. –

2

Добавление Ответа Mark Ransom в: Было бы лучше использовать указанный коэффициент с константой 255 и добавить его к текущему цветовому значению:

float brightnessFac = //between -1.0 and 1.0  
byte brightnessRed = red + (255f * brightnessFac); 

Если вы просто делаете с коэффициентом от 0.0 1,0

byte brightnessRed = red * brightnessFac; 

Значение 0 остается равным нулю.

-3

Регулировка яркости изображения является одной из самых простых операций обработки изображений, которые можно выполнить. Все, что связано с этим, заключается в добавлении желаемого изменения яркости к каждому из компонентов красного, зеленого и синего цветов.

он бы что-то вроде этого:

colour = GetPixelColour(x, y) 
    newRed = Truncate(Red(colour) + brightness) 
    newGreen = Truncate(Green(colour) + brightness) 
    newBlue = Truncate(Blue(colour) + brightness) 
    PutPixelColour(x, y) = RGB(newRed, newGreen, newBlue) 

Код для гарантирует, что новые значения красного, зеленого и синего цвета находятся в пределах допустимого диапазона.

Procedure Truncate(value) 
     If value < 0 Then value = 0 
     If value > 255 Then value = 255 
     Return value 
    EndProcedure 
1

Моя рекомендация будет такой же, как ответ ChrisA. «s, с одним отличием:

Используйте HSP color space вместо этого, так как это приближение алгоритма Photoshop и имеет лучшие результаты.


Ради не только ссылки на сайт ХПП (который откровенно должно быть более чем достаточно, это просто, что я не хотел бы отвечать без примеров), вот мой C# реализация, вытекающее сайта :

#region Definitions 
//Perceived brightness to Red ratio. 
private const double Pr = .299; 
//Perceived brightness to Green ratio. 
private const double Pg = .587; 
//Perceived brightness to Blue ratio. 
private const double Pb = .114; 
#endregion 

//Expected ranges: Hue = 0-359... Other values = 0-1 
public static ColorRGB ToRGB(double hue, double saturation, double perceivedBrightness, double alpha) { 
    //Check values within expected range 
    hue = hue < 0 ? 0 : hue > 359 ? 359 : hue; 
    saturation = saturation < 0 ? 0 : saturation > 1 ? 1 : saturation; 
    perceivedBrightness = perceivedBrightness < 0 ? 0 : perceivedBrightness > 1 ? 1 : perceivedBrightness; 
    alpha = alpha < 0 ? 0 : alpha > 1 ? 1 : alpha; 
    //Conversion 
    var minOverMax = 1 - saturation; 
    double r, g, b; 
    if (minOverMax > 0) { 
     double part; 
     if (hue < 0.166666666666667D) { //R>G>B 
      hue = 6 * (hue - 0); part = 1 + hue * (1/minOverMax - 1); 
      b = perceivedBrightness/Math.Sqrt(Pr/minOverMax/minOverMax + Pg * part * part + Pb); 
      r = b/minOverMax; g = b + hue * (r - b); 
     } 
     else if (hue < 0.333333333333333D) { //G>R>B 
      hue = 6 * (-hue + 0.333333333333333D); part = 1 + hue * (1/minOverMax - 1); 
      b = perceivedBrightness/Math.Sqrt(Pg/minOverMax/minOverMax + Pr * part * part + Pb); 
      g = b/minOverMax; r = b + hue * (g - b); 
     } 
     else if (hue < 0.5D) { // G>B>R 
      hue = 6 * (hue - 0.333333333333333D); part = 1 + hue * (1/minOverMax - 1); 
      r = perceivedBrightness/Math.Sqrt(Pg/minOverMax/minOverMax + Pb * part * part + Pr); 
      g = r/minOverMax; b = r + hue * (g - r); 
     } 
     else if (hue < 0.666666666666667D) { //B>G>R 
      hue = 6 * (-hue + 0.666666666666667D); part = 1 + hue * (1/minOverMax - 1); 
      r = perceivedBrightness/Math.Sqrt(Pb/minOverMax/minOverMax + Pg * part * part + Pr); 
      b = r/minOverMax; g = r + hue * (b - r); 
     } 
     else if (hue < 0.833333333333333D) { //B>R>G 
      hue = 6 * (hue - 0.666666666666667D); part = 1 + hue * (1/minOverMax - 1); 
      g = perceivedBrightness/Math.Sqrt(Pb/minOverMax/minOverMax + Pr * part * part + Pg); 
      b = g/minOverMax; r = g + hue * (b - g); 
     } 
     else { //R>B>G 
      hue = 6 * (-hue + 1D); part = 1 + hue * (1/minOverMax - 1); 
      g = perceivedBrightness/Math.Sqrt(Pr/minOverMax/minOverMax + Pb * part * part + Pg); 
      r = g/minOverMax; b = g + hue * (r - g); 
     } 
    } 
    else { 
     if (hue < 0.166666666666667D) { //R>G>B 
      hue = 6 * (hue - 0D); r = Math.Sqrt(perceivedBrightness * perceivedBrightness/(Pr + Pg * hue * hue)); g = r * hue; b = 0; 
     } 
     else if (hue < 0.333333333333333D) { //G>R>B 
      hue = 6 * (-hue + 0.333333333333333D); g = Math.Sqrt(perceivedBrightness * perceivedBrightness/(Pg + Pr * hue * hue)); r = g * hue; b = 0; 
     } 
     else if (hue < 0.5D) { //G>B>R 
      hue = 6 * (hue - 0.333333333333333D); g = Math.Sqrt(perceivedBrightness * perceivedBrightness/(Pg + Pb * hue * hue)); b = g * hue; r = 0; 
     } 
     else if (hue < 0.666666666666667D) { //B>G>R 
      hue = 6 * (-hue + 0.666666666666667D); b = Math.Sqrt(perceivedBrightness * perceivedBrightness/(Pb + Pg * hue * hue)); g = b * hue; r = 0; 
     } 
     else if (hue < 0.833333333333333D) { //B>R>G 
      hue = 6 * (hue - 0.666666666666667D); b = Math.Sqrt(perceivedBrightness * perceivedBrightness/(Pb + Pr * hue * hue)); r = b * hue; g = 0; 
     } 
     else { //R>B>G 
      hue = 6 * (-hue + 1D); r = Math.Sqrt(perceivedBrightness * perceivedBrightness/(Pr + Pb * hue * hue)); b = r * hue; g = 0; 
     } 
    } 
    return new ColorRGB(r, g, b, alpha); 
} 

//Expected ranges: 0-1 on all components 
public static ColorHSP FromRGB(double red, double green, double blue, double alpha) { 
    //Guarantee RGB values are in the correct ranges 
    red = red < 0 ? 0 : red > 1 ? 1 : red; 
    green = green < 0 ? 0 : green > 1 ? 1 : green; 
    blue = blue < 0 ? 0 : blue > 1 ? 1 : blue; 
    alpha = alpha < 0 ? 0 : alpha > 1 ? 1 : alpha; 
    //Prepare & cache values for conversion 
    var max = MathExtensions.Max(red, green, blue); 
    var min = MathExtensions.Min(red, green, blue); 
    var delta = max - min; 
    double h, s, p = Math.Sqrt(0.299 * red + 0.587 * green + 0.114 * blue); 
    //Conversion 
    if (delta.Equals(0)) h = 0; 
    else if (max.Equals(red)) { 
     h = (green - blue)/delta % 6; 
    } 
    else if (max.Equals(green)) h = (blue - red)/delta + 2; 
    else h = (red - green)/delta + 4; 
    h *= 60; 
    if (h < 0) h += 360; 
    if (p.Equals(0)) 
     s = 0; 
    else 
     s = delta/p; 
    //Result 
    return new ColorHSP(h, s, p, alpha); 
} 
0
import java.io.*; 
import java.awt.Color; 
import javax.imageio.ImageIO; 
import java.io.*; 
import java.awt.image.BufferedImage; 



    class psp{ 

public static void main(String a[]){ 
try{ 

File input=new File("abc.jpg"); 
File output=new File("output1.jpg"); 
     BufferedImage picture1 = ImageIO.read(input); // original 
BufferedImage picture2= new BufferedImage(picture1.getWidth(), picture1.getHeight(),BufferedImage.TYPE_INT_RGB);  
     int width = picture1.getWidth(); 
     int height = picture1.getHeight(); 

int factor=50; 
for (int y = 0; y < height ; y++) {//loops for images 
for (int x = 0; x < width ; x++) { 

Color c=new Color(picture1.getRGB(x,y)); 
int r=c.getRed()+factor; 
int b=c.getBlue()+factor; 
int g=c.getGreen()+factor; 

if (r >= 256) { 
    r = 255; 
} else if (r < 0) { 
r = 0; 
} 

if (g >= 256) { 
g = 255; 
} else if (g < 0) { 
g = 0; 
} 

if (b >= 256) { 
b = 255; 
} else if (b < 0) { 
b = 0; 
} 
picture2.setRGB(x, y,new Color(r,g,b).getRGB()); 


} 
} 




ImageIO.write(picture2,"jpg",output);  
}catch(Exception e){ 
System.out.println(e); 
} 





} 




}