ImageUtil: Rename methods to luminance, and work with non ARGB images

This commit is contained in:
Max Weber
2019-11-26 22:27:45 -07:00
parent 808e85fdf8
commit dc2f4b6f59
7 changed files with 58 additions and 41 deletions

View File

@@ -79,9 +79,9 @@ class PluginListItem extends JPanel
BufferedImage onStar = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "star_on.png"); BufferedImage onStar = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "star_on.png");
CONFIG_ICON = new ImageIcon(configIcon); CONFIG_ICON = new ImageIcon(configIcon);
ON_STAR = new ImageIcon(onStar); ON_STAR = new ImageIcon(onStar);
CONFIG_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(configIcon, -100)); CONFIG_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(configIcon, -100));
BufferedImage offStar = ImageUtil.grayscaleOffset( BufferedImage offStar = ImageUtil.luminanceScale(
ImageUtil.grayscaleImage(onStar), ImageUtil.grayscaleImage(onStar),
0.77f 0.77f
); );

View File

@@ -42,7 +42,7 @@ class PluginToggleButton extends JToggleButton
BufferedImage onSwitcher = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "switcher_on.png"); BufferedImage onSwitcher = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "switcher_on.png");
ON_SWITCHER = new ImageIcon(onSwitcher); ON_SWITCHER = new ImageIcon(onSwitcher);
OFF_SWITCHER = new ImageIcon(ImageUtil.flipImage( OFF_SWITCHER = new ImageIcon(ImageUtil.flipImage(
ImageUtil.grayscaleOffset( ImageUtil.luminanceScale(
ImageUtil.grayscaleImage(onSwitcher), ImageUtil.grayscaleImage(onSwitcher),
0.61f 0.61f
), ),

View File

@@ -108,7 +108,7 @@ class ScreenMarkerPanel extends JPanel
static static
{ {
final BufferedImage borderImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "border_color_icon.png"); final BufferedImage borderImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "border_color_icon.png");
final BufferedImage borderImgHover = ImageUtil.grayscaleOffset(borderImg, -150); final BufferedImage borderImgHover = ImageUtil.luminanceOffset(borderImg, -150);
BORDER_COLOR_ICON = new ImageIcon(borderImg); BORDER_COLOR_ICON = new ImageIcon(borderImg);
BORDER_COLOR_HOVER_ICON = new ImageIcon(borderImgHover); BORDER_COLOR_HOVER_ICON = new ImageIcon(borderImgHover);
@@ -116,7 +116,7 @@ class ScreenMarkerPanel extends JPanel
NO_BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(borderImgHover, -100)); NO_BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(borderImgHover, -100));
final BufferedImage fillImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "fill_color_icon.png"); final BufferedImage fillImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "fill_color_icon.png");
final BufferedImage fillImgHover = ImageUtil.grayscaleOffset(fillImg, -150); final BufferedImage fillImgHover = ImageUtil.luminanceOffset(fillImg, -150);
FILL_COLOR_ICON = new ImageIcon(fillImg); FILL_COLOR_ICON = new ImageIcon(fillImg);
FILL_COLOR_HOVER_ICON = new ImageIcon(fillImgHover); FILL_COLOR_HOVER_ICON = new ImageIcon(fillImgHover);
@@ -124,7 +124,7 @@ class ScreenMarkerPanel extends JPanel
NO_FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(fillImgHover, -100)); NO_FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(fillImgHover, -100));
final BufferedImage opacityImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "opacity_icon.png"); final BufferedImage opacityImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "opacity_icon.png");
final BufferedImage opacityImgHover = ImageUtil.grayscaleOffset(opacityImg, -150); final BufferedImage opacityImgHover = ImageUtil.luminanceOffset(opacityImg, -150);
FULL_OPACITY_ICON = new ImageIcon(opacityImg); FULL_OPACITY_ICON = new ImageIcon(opacityImg);
FULL_OPACITY_HOVER_ICON = new ImageIcon(opacityImgHover); FULL_OPACITY_HOVER_ICON = new ImageIcon(opacityImgHover);

View File

@@ -75,15 +75,15 @@ public class ClockTabPanel extends TabContentPanel
BufferedImage addIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "add_icon.png"); BufferedImage addIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "add_icon.png");
DELETE_ICON = new ImageIcon(deleteIcon); DELETE_ICON = new ImageIcon(deleteIcon);
DELETE_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(deleteIcon, -80)); DELETE_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(deleteIcon, -80));
LAP_ICON = new ImageIcon(lapIcon); LAP_ICON = new ImageIcon(lapIcon);
LAP_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(lapIcon, -80)); LAP_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(lapIcon, -80));
PAUSE_ICON = new ImageIcon(pauseIcon); PAUSE_ICON = new ImageIcon(pauseIcon);
PAUSE_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(pauseIcon, -80)); PAUSE_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(pauseIcon, -80));
RESET_ICON = new ImageIcon(resetIcon); RESET_ICON = new ImageIcon(resetIcon);
RESET_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(resetIcon, -80)); RESET_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(resetIcon, -80));
START_ICON = new ImageIcon(startIcon); START_ICON = new ImageIcon(startIcon);
START_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(startIcon, -80)); START_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(startIcon, -80));
ADD_ICON = new ImageIcon(addIcon); ADD_ICON = new ImageIcon(addIcon);
ADD_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(addIcon, 0.53f)); ADD_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(addIcon, 0.53f));
} }

View File

@@ -56,7 +56,7 @@ class WorldTableHeader extends JPanel
{ {
final BufferedImage arrowDown = ImageUtil.getResourceStreamFromClass(WorldHopperPlugin.class, "arrow_down.png"); final BufferedImage arrowDown = ImageUtil.getResourceStreamFromClass(WorldHopperPlugin.class, "arrow_down.png");
final BufferedImage arrowUp = ImageUtil.rotateImage(arrowDown, Math.PI); final BufferedImage arrowUp = ImageUtil.rotateImage(arrowDown, Math.PI);
final BufferedImage arrowUpFaded = ImageUtil.grayscaleOffset(arrowUp, -80); final BufferedImage arrowUpFaded = ImageUtil.luminanceOffset(arrowUp, -80);
ARROW_UP = new ImageIcon(arrowUpFaded); ARROW_UP = new ImageIcon(arrowUpFaded);
final BufferedImage highlightArrowDown = ImageUtil.fillImage(arrowDown, HIGHLIGHT_COLOR); final BufferedImage highlightArrowDown = ImageUtil.fillImage(arrowDown, HIGHLIGHT_COLOR);

View File

@@ -70,23 +70,37 @@ public class ImageUtil
return (BufferedImage) image; return (BufferedImage) image;
} }
final BufferedImage out = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); return toARGB(image);
final Graphics2D g2d = out.createGraphics(); }
/**
* Creates an ARGB {@link BufferedImage} from an {@link Image}.
*/
public static BufferedImage toARGB(final Image image)
{
if (image instanceof BufferedImage && ((BufferedImage) image).getType() == BufferedImage.TYPE_INT_ARGB)
{
return (BufferedImage) image;
}
BufferedImage out = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = out.createGraphics();
g2d.drawImage(image, 0, 0, null); g2d.drawImage(image, 0, 0, null);
g2d.dispose(); g2d.dispose();
return out; return out;
} }
/** /**
* Offsets an image in the grayscale (darkens/brightens) by a given offset. * Offsets an image's luminance by a given value.
* *
* @param image The image to be darkened or brightened. * @param rawImg The image to be darkened or brightened.
* @param offset A signed 8-bit integer value to brighten or darken the image with. * @param offset A signed 8-bit integer value to brighten or darken the image with.
* Values above 0 will brighten, and values below 0 will darken. * Values above 0 will brighten, and values below 0 will darken.
* @return The given image with its brightness adjusted by the given offset. * @return The given image with its brightness adjusted by the given offset.
*/ */
public static BufferedImage grayscaleOffset(final BufferedImage image, final int offset) public static BufferedImage luminanceOffset(final Image rawImg, final int offset)
{ {
BufferedImage image = toARGB(rawImg);
final float offsetFloat = (float) offset; final float offsetFloat = (float) offset;
final int numComponents = image.getColorModel().getNumComponents(); final int numComponents = image.getColorModel().getNumComponents();
final float[] scales = new float[numComponents]; final float[] scales = new float[numComponents];
@@ -104,15 +118,16 @@ public class ImageUtil
} }
/** /**
* Offsets an image in the grayscale (darkens/brightens) by a given percentage. * Changes an images luminance by a scaling factor
* *
* @param image The image to be darkened or brightened. * @param rawImg The image to be darkened or brightened.
* @param percentage The ratio to darken or brighten the given image. * @param percentage The ratio to darken or brighten the given image.
* Values above 1 will brighten, and values below 1 will darken. * Values above 1 will brighten, and values below 1 will darken.
* @return The given image with its brightness scaled by the given percentage. * @return The given image with its brightness scaled by the given percentage.
*/ */
public static BufferedImage grayscaleOffset(final BufferedImage image, final float percentage) public static BufferedImage luminanceScale(final Image rawImg, final float percentage)
{ {
BufferedImage image = toARGB(rawImg);
final int numComponents = image.getColorModel().getNumComponents(); final int numComponents = image.getColorModel().getNumComponents();
final float[] scales = new float[numComponents]; final float[] scales = new float[numComponents];
final float[] offsets = new float[numComponents]; final float[] offsets = new float[numComponents];
@@ -131,14 +146,15 @@ public class ImageUtil
/** /**
* Offsets an image's alpha component by a given offset. * Offsets an image's alpha component by a given offset.
* *
* @param image The image to be made more or less transparent. * @param rawImg The image to be made more or less transparent.
* @param offset A signed 8-bit integer value to modify the image's alpha component with. * @param offset A signed 8-bit integer value to modify the image's alpha component with.
* Values above 0 will increase transparency, and values below 0 will decrease * Values above 0 will increase transparency, and values below 0 will decrease
* transparency. * transparency.
* @return The given image with its alpha component adjusted by the given offset. * @return The given image with its alpha component adjusted by the given offset.
*/ */
public static BufferedImage alphaOffset(final BufferedImage image, final int offset) public static BufferedImage alphaOffset(final Image rawImg, final int offset)
{ {
BufferedImage image = toARGB(rawImg);
final float offsetFloat = (float) offset; final float offsetFloat = (float) offset;
final int numComponents = image.getColorModel().getNumComponents(); final int numComponents = image.getColorModel().getNumComponents();
final float[] scales = new float[numComponents]; final float[] scales = new float[numComponents];
@@ -153,14 +169,15 @@ public class ImageUtil
/** /**
* Offsets an image's alpha component by a given percentage. * Offsets an image's alpha component by a given percentage.
* *
* @param image The image to be made more or less transparent. * @param rawImg The image to be made more or less transparent.
* @param percentage The ratio to modify the image's alpha component with. * @param percentage The ratio to modify the image's alpha component with.
* Values above 1 will increase transparency, and values below 1 will decrease * Values above 1 will increase transparency, and values below 1 will decrease
* transparency. * transparency.
* @return The given image with its alpha component scaled by the given percentage. * @return The given image with its alpha component scaled by the given percentage.
*/ */
public static BufferedImage alphaOffset(final BufferedImage image, final float percentage) public static BufferedImage alphaOffset(final Image rawImg, final float percentage)
{ {
BufferedImage image = toARGB(rawImg);
final int numComponents = image.getColorModel().getNumComponents(); final int numComponents = image.getColorModel().getNumComponents();
final float[] scales = new float[numComponents]; final float[] scales = new float[numComponents];
final float[] offsets = new float[numComponents]; final float[] offsets = new float[numComponents];

View File

@@ -81,25 +81,25 @@ public class ImageUtilTest
public void grayscaleOffset() public void grayscaleOffset()
{ {
// grayscaleOffset(BufferedImage image, int offset) // grayscaleOffset(BufferedImage image, int offset)
assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), -255))); assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.luminanceOffset(oneByOne(BLACK), -255)));
assertTrue(bufferedImagesEqual(oneByOne(new Color(50, 50, 50)), ImageUtil.grayscaleOffset(oneByOne(BLACK), 50))); assertTrue(bufferedImagesEqual(oneByOne(new Color(50, 50, 50)), ImageUtil.luminanceOffset(oneByOne(BLACK), 50)));
assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(BLACK), 128))); assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.luminanceOffset(oneByOne(BLACK), 128)));
assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(GRAY), -255))); assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.luminanceOffset(oneByOne(GRAY), -255)));
assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(BLACK), 255))); assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.luminanceOffset(oneByOne(BLACK), 255)));
assertTrue(bufferedImagesEqual(oneByOne(new Color(200, 200, 200)), ImageUtil.grayscaleOffset(oneByOne(WHITE), -55))); assertTrue(bufferedImagesEqual(oneByOne(new Color(200, 200, 200)), ImageUtil.luminanceOffset(oneByOne(WHITE), -55)));
assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 55))); assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.luminanceOffset(oneByOne(WHITE), 55)));
// grayscaleOffset(BufferedImage image, float percentage) // grayscaleOffset(BufferedImage image, float percentage)
assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 0f))); assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.luminanceScale(oneByOne(BLACK), 0f)));
assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 1f))); assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.luminanceScale(oneByOne(BLACK), 1f)));
assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 2f))); assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.luminanceScale(oneByOne(BLACK), 2f)));
assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(GRAY), 0f))); assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.luminanceScale(oneByOne(GRAY), 0f)));
assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(GRAY), 1f))); assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.luminanceScale(oneByOne(GRAY), 1f)));
assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(GRAY), 2f))); assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.luminanceScale(oneByOne(GRAY), 2f)));
assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(WHITE), 0f))); assertTrue(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.luminanceScale(oneByOne(WHITE), 0f)));
assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(WHITE), 0.503f))); // grayscaleOffset does Math.floor assertTrue(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.luminanceScale(oneByOne(WHITE), 0.503f))); // grayscaleOffset does Math.floor
assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 1f))); assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.luminanceScale(oneByOne(WHITE), 1f)));
assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 2f))); assertTrue(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.luminanceScale(oneByOne(WHITE), 2f)));
} }
@Test @Test