From 30622ed8cb9233cad77eb021d02ac58e4a3c0572 Mon Sep 17 00:00:00 2001 From: Paul Cantrell Date: Sat, 2 Nov 2024 18:35:29 -0500 Subject: [PATCH] More image array tests, more docs --- src/edu/macalester/graphics/Image.java | 26 ++++++++++++++++-- test/edu/macalester/graphics/ImageTest.java | 16 +++++++++++ .../imageFileProcessing-plain.expected.png | Bin 0 -> 28522 bytes 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/imageComparisons/ImageTest/imageFileProcessing-plain.expected.png diff --git a/src/edu/macalester/graphics/Image.java b/src/edu/macalester/graphics/Image.java index 108b9ae..3e1dbae 100644 --- a/src/edu/macalester/graphics/Image.java +++ b/src/edu/macalester/graphics/Image.java @@ -127,7 +127,7 @@ public Image(double x, double y, String path) { * (see {@link PixelFormat}.) *

* For example, the array { 1, 0.5f, 0, 0, 0, 0.5f } with the RGB pixel format - * specifies one orange pixel (R=1, G=0.5, B=0), then one dark blue pixel (R=0, G=0, B=0.5). + * specifies one orange pixel (R=100%, G=50%, B=0%), then one dark blue pixel (R=0%, G=0%, B=50%). * * @param width Image width in pixels * @param height Image height in pixels @@ -146,7 +146,7 @@ public Image(int width, int height, float[] pixels, PixelFormat format) { * (see {@link PixelFormat}.) *

* For example, the array { -1, 127, 0, 0, 0, 127 } with the RGB pixel format - * specifies one orange pixel (R=1, G=0.5, B=0), then one dark blue pixel (R=0, G=0, B=0.5). + * specifies one orange pixel (R=100%, G=50%, B=0%), then one dark blue pixel (R=0%, G=0%, B=50%). * * @param width Image width in pixels * @param height Image height in pixels @@ -273,10 +273,32 @@ private double getScaleToFit() { maxHeight / getImageHeight())); } + /** + * Returns the pixels in this image as an array of bytes, one byte per color channel per pixel, + * interleaved in the order specified by format. Zero is minimum intensity, and + * 255 (or -1, since bytes are signed) is full intensity. + *

+ * Note that when requesting a grayscale image, this method averages the color channels, which + * produces results that correspond poorly to perceived brightness. + * + * @see #Image(int,int,byte[],PixelFormat) + * @see #toFloatArray(PixelFormat) + */ public byte[] toByteArray(PixelFormat format) { return format.makeByteArray(img); } + /** + * Returns the pixels in this image as an array of floats, one number per color channel per + * pixel, interleaved in the order specified by format. Zero is minimum intensity, + * and 1 is full intensity. + *

+ * Note that when requesting a grayscale image, this method averages the color channels, which + * produces results that correspond poorly to perceived brightness. + * + * @see #Image(int,int,float[],PixelFormat) + * @see #toByteArray(PixelFormat) + */ public float[] toFloatArray(PixelFormat format) { var bytes = toByteArray(format); var floats = new float[bytes.length]; diff --git a/test/edu/macalester/graphics/ImageTest.java b/test/edu/macalester/graphics/ImageTest.java index af92b7a..f1564e7 100644 --- a/test/edu/macalester/graphics/ImageTest.java +++ b/test/edu/macalester/graphics/ImageTest.java @@ -197,6 +197,22 @@ private float[] generateFloatData(int w, int h, int chans) { return pixels; } + @RenderingTest(width=200, height=200, modes = { PLAIN }) + void imageFileProcessing() { + Image original = new Image(FOXFLOWER_IMAGE); + float[] pixels = original.toFloatArray(Image.PixelFormat.RGB); + + for(int i = 0; i < pixels.length; i++) { + pixels[i] = (float) (Math.sin(pixels[i] * Math.PI * 2) + 1) / 2; + } + + image = new Image( + original.getImageWidth(), + original.getImageHeight(), + pixels, + Image.PixelFormat.RGB); + } + @RenderingTest(height=200, modes = { PLAIN }) void colorPixelConversionToGrayscaleArray() { Image colorImage = new Image(FOXBOT_IMAGE); diff --git a/test/imageComparisons/ImageTest/imageFileProcessing-plain.expected.png b/test/imageComparisons/ImageTest/imageFileProcessing-plain.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..959d1fe00f82a58c816e6c9934686246ace396d6 GIT binary patch literal 28522 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