Skip to content

Commit b92159a

Browse files
BAEL-7454 RGB conversions (#16053)
1 parent e44f924 commit b92159a

File tree

3 files changed

+195
-0
lines changed

3 files changed

+195
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.baeldung.rbg;
2+
3+
import java.util.Objects;
4+
5+
public class Rgb {
6+
private int alpha;
7+
private int red;
8+
private int green;
9+
private int blue;
10+
11+
public Rgb(int alpha, int red, int green, int blue) {
12+
this.alpha = alpha;
13+
this.red = red;
14+
this.green = green;
15+
this.blue = blue;
16+
}
17+
18+
public int getAlpha() {
19+
return alpha;
20+
}
21+
22+
public int getRed() {
23+
return red;
24+
}
25+
26+
public int getGreen() {
27+
return green;
28+
}
29+
30+
public int getBlue() {
31+
return blue;
32+
}
33+
34+
@Override
35+
public boolean equals(Object o) {
36+
if (this == o) return true;
37+
if (o == null || getClass() != o.getClass()) return false;
38+
Rgb rgb = (Rgb) o;
39+
return alpha == rgb.alpha && red == rgb.red && green == rgb.green && blue == rgb.blue;
40+
}
41+
42+
@Override
43+
public int hashCode() {
44+
return Objects.hash(alpha, red, green, blue);
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.rbg;
2+
3+
public class RgbConversions {
4+
5+
public static int rgbToInt(int alpha, int red, int green, int blue) {
6+
alpha = clamp(alpha, 0, 255);
7+
red = clamp(red, 0, 255);
8+
green = clamp(green, 0, 255);
9+
blue = clamp(blue, 0, 255);
10+
11+
return (alpha << 24) | (red << 16) | (green << 8) | blue;
12+
}
13+
14+
public static int rgbToInt(Rgb rgb) {
15+
return rgbToInt(rgb.getAlpha(), rgb.getRed(), rgb.getGreen(), rgb.getBlue());
16+
}
17+
18+
public static Rgb intToRgb(int argb) {
19+
int alpha = (argb >> 24) & 0xFF;
20+
int red = (argb >> 16) & 0xFF;
21+
int green = (argb >> 8) & 0xFF;
22+
int blue = argb & 0xFF;
23+
24+
return new Rgb(alpha, red, green, blue);
25+
}
26+
27+
private static int clamp(int value, int min, int max) {
28+
return Math.max(min, Math.min(max, value));
29+
}
30+
}
31+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package com.baeldung.rgb;
2+
3+
import com.baeldung.rbg.Rgb;
4+
import com.baeldung.rbg.RgbConversions;
5+
import org.junit.jupiter.api.Test;
6+
7+
import static org.junit.Assert.assertEquals;
8+
9+
public class RgbConversionUnitTest {
10+
11+
@Test
12+
public void whenBasicPackingAndUnpackingRgb_thenReturnInitialComponentsValues() {
13+
int alpha = 255;
14+
int red = 255;
15+
int green = 0;
16+
int blue = 0;
17+
18+
int rgb = (alpha << 24) | (red << 16) | (green << 8) | blue;
19+
20+
assertEquals(rgb, 0xFFFF0000);
21+
22+
int alphaReconstructed = (rgb >> 24) & 0xFF;
23+
int redReconstructed = (rgb >> 16) & 0xFF;
24+
int greenReconstructed = (rgb >> 8) & 0xFF;
25+
int blueReconstructed = rgb & 0xFF;
26+
27+
assertEquals(alphaReconstructed, alpha);
28+
assertEquals(redReconstructed, red);
29+
assertEquals(greenReconstructed, green);
30+
assertEquals(blueReconstructed, blue);
31+
}
32+
33+
@Test
34+
public void whenRgbaToIntWithoutClamping_ReturnIntegerRepresentations() {
35+
// Fully opaque red
36+
assertEquals(0xFFFF0000, RgbConversions.rgbToInt(255, 255, 0, 0));
37+
// Fully transparent blue
38+
assertEquals(0x000000FF, RgbConversions.rgbToInt(0, 0, 0, 255));
39+
// 50% transparent green
40+
assertEquals(0x8000FF00, RgbConversions.rgbToInt(128, 0, 255, 0));
41+
}
42+
43+
@Test
44+
public void whenRgbaToIntWithClamping_ReturnIntegerRepresentations() {
45+
// Clamping for values below 0
46+
assertEquals(0x00000000, RgbConversions.rgbToInt(-1, -1, -1, -1));
47+
// Clamping for values above 255
48+
assertEquals(0xFFFFFFFF, RgbConversions.rgbToInt(256, 256, 256, 256));
49+
}
50+
51+
@Test
52+
public void whenRgbaToIntBoundary_ReturnIntegerRepresentations() {
53+
// Boundary values for each color component including alpha
54+
assertEquals(0xFF000000, RgbConversions.rgbToInt(255, 0, 0, 0)); // Opaque black
55+
assertEquals(0x00FFFFFF, RgbConversions.rgbToInt(0, 255, 255, 255)); // Transparent white
56+
}
57+
58+
@Test
59+
public void whenRgbaToIntAndIntToRgb_ReturnTheSameValues() {
60+
Rgb rgb = new Rgb(0, 125, 125, 100);
61+
assertEquals(rgb, RgbConversions.intToRgb(RgbConversions.rgbToInt(rgb)));
62+
}
63+
64+
@Test
65+
public void whenBrightnessAdjustment_ReturnChangedRgbIntegerValue() {
66+
float scale = 0.8f; // darken by 20%
67+
68+
// initial values
69+
int alpha = 0;
70+
int red = 100;
71+
int green = 255;
72+
int blue = 100;
73+
74+
75+
int adjustedRed = (int)(red * scale);
76+
int adjustedGreen = (int)(green * scale);
77+
int adjustedBlue = (int)(blue * scale);
78+
79+
int newArgb = (alpha << 24) | (adjustedRed << 16) | (adjustedGreen << 8) | adjustedBlue;
80+
81+
assertEquals(newArgb, 0x50CC50);
82+
}
83+
84+
@Test
85+
public void whenGrayscaleConversion_ReturnChangedRgbIntegerValue() {
86+
float scale = 0.8f; // darken by 20%
87+
88+
// initial values
89+
int alpha = 0;
90+
int red = 100;
91+
int green = 255;
92+
int blue = 100;
93+
94+
int average = (int)(red * 0.299 + green * 0.587 + blue * 0.114);
95+
int grayscaleArgb = (alpha << 24) | (average << 16) | (average << 8) | average;
96+
97+
assertEquals(grayscaleArgb, 0xBEBEBE);
98+
}
99+
100+
@Test
101+
public void whenInversion_ReturnChangedRgbIntegerValue() {
102+
float scale = 0.8f; // darken by 20%
103+
104+
// initial values
105+
int alpha = 0;
106+
int red = 100;
107+
int green = 255;
108+
int blue = 100;
109+
110+
red = 255 - red;
111+
green = 255 - green;
112+
blue = 255 - blue;
113+
114+
int invertedArgb = (alpha << 24) | (red << 16) | (green << 8) | blue;
115+
116+
assertEquals(invertedArgb, 0x9B009B);
117+
}
118+
}

0 commit comments

Comments
 (0)