Added raster write test

+ fixed a small issue for PAM
This commit is contained in:
Harald Kuhr
2026-03-11 18:53:24 +01:00
parent 26ecf18c68
commit b9b3c364be
3 changed files with 63 additions and 9 deletions
@@ -34,6 +34,7 @@ import com.twelvemonkeys.imageio.stream.URLImageInputStreamSpi;
import org.mockito.InOrder; import org.mockito.InOrder;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter; import javax.imageio.ImageWriter;
@@ -84,6 +85,7 @@ public abstract class ImageWriterAbstractTest<T extends ImageWriter> {
protected static BufferedImage drawSomething(final BufferedImage image) { protected static BufferedImage drawSomething(final BufferedImage image) {
Graphics2D g = image.createGraphics(); Graphics2D g = image.createGraphics();
try { try {
int width = image.getWidth(); int width = image.getWidth();
int height = image.getHeight(); int height = image.getHeight();
@@ -131,18 +133,54 @@ public abstract class ImageWriterAbstractTest<T extends ImageWriter> {
public void testWrite() throws IOException { public void testWrite() throws IOException {
ImageWriter writer = createWriter(); ImageWriter writer = createWriter();
for (RenderedImage testData : getTestData()) { try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); for (RenderedImage testData : getTestData()) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try (ImageOutputStream stream = ImageIO.createImageOutputStream(buffer)) { try (ImageOutputStream stream = ImageIO.createImageOutputStream(buffer)) {
writer.setOutput(stream); writer.setOutput(stream);
writer.write(drawSomething((BufferedImage) testData)); writer.write(drawSomething((BufferedImage) testData));
}
catch (IOException e) {
throw new AssertionError(e.getMessage(), e);
}
assertTrue(buffer.size() > 0, "No image data written");
} }
catch (IOException e) { }
throw new AssertionError(e.getMessage(), e); finally {
writer.dispose();
}
}
@Test
public void testWriteRaster() throws IOException {
ImageWriter writer = createWriter();
try {
if (!writer.canWriteRasters()) {
return;
} }
assertTrue(buffer.size() > 0, "No image data written"); ImageWriteParam param = writer.getDefaultWriteParam();
for (RenderedImage testData : getTestData()) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try (ImageOutputStream stream = ImageIO.createImageOutputStream(buffer)) {
writer.setOutput(stream);
writer.write(null, new IIOImage(testData.getTile(0, 0), null, null), param);
}
catch (IOException e) {
throw new AssertionError(e.getMessage(), e);
}
assertTrue(buffer.size() > 0, "No image data written");
}
}
finally {
writer.dispose();
} }
} }
@@ -50,11 +50,22 @@ public class DDSImageWriterTest extends ImageWriterAbstractTest<DDSImageWriter>
); );
} }
@Test
void writeRasters() throws IOException {
ImageWriter writer = createWriter();
assertTrue(writer.canWriteRasters());
// Full tests in super class
}
@Test @Test
void writeMipmap() throws IOException { void writeMipmap() throws IOException {
ImageWriter writer = createWriter(); ImageWriter writer = createWriter();
try { try {
assertTrue(writer.canWriteSequence());
List<BufferedImage> testData = getTestData(); List<BufferedImage> testData = getTestData();
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int previousSize = 0; int previousSize = 0;
@@ -111,6 +111,7 @@ enum TupleType {
static TupleType forPAM(Raster raster) { static TupleType forPAM(Raster raster) {
SampleModel sampleModel = raster.getSampleModel(); SampleModel sampleModel = raster.getSampleModel();
switch (sampleModel.getTransferType()) { switch (sampleModel.getTransferType()) {
case DataBuffer.TYPE_BYTE: case DataBuffer.TYPE_BYTE:
case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_USHORT:
@@ -145,8 +146,12 @@ enum TupleType {
return TupleType.RGB; return TupleType.RGB;
} }
else if (bands == 4) { else if (bands == 4) {
// Ambiguous, could also be CMYK...
return TupleType.RGB_ALPHA; return TupleType.RGB_ALPHA;
} }
else if (bands == 5) {
return TupleType.CMYK_ALPHA;
}
// ...else fall through... // ...else fall through...
} }
@@ -154,7 +159,7 @@ enum TupleType {
} }
static TupleType forPAM(ImageTypeSpecifier type) { static TupleType forPAM(ImageTypeSpecifier type) {
// Support only 1 bit b/w, 8-16 bit gray and 8-16 bit/sample RGB // Support only 1 bit b/w, 8-16 bit gray, 8-16 bit/sample RGB and 8-16 bit/sample CMYK
switch (type.getBufferedImageType()) { switch (type.getBufferedImageType()) {
// 1 bit b/w or b/w + a // 1 bit b/w or b/w + a
case BufferedImage.TYPE_BYTE_BINARY: case BufferedImage.TYPE_BYTE_BINARY: