blob: f8ca38de98be6fc135159657cbbeaf650f166882 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.imaging.formats.png;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.apache.commons.imaging.ImageFormat;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Sanselan;
import org.apache.commons.imaging.SanselanTest;
import org.apache.commons.imaging.util.IoUtils;
public class PngWriteReadTest extends SanselanTest
{
// public PngWriteReadTest(String name)
// {
// super(name);
// }
private int[][] getSimpleRawData(int width, int height, int value)
{
int[][] result = new int[height][width];
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
result[y][x] = value;
return result;
}
private int[][] getAscendingRawData(int width, int height)
{
int[][] result = new int[height][width];
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
int alpha = (x + y) % 256;
int value = (x + y) % 256;
int argb = (0xff & alpha) << 24 | (0xff & value) << 16
| (0xff & value) << 8 | (0xff & value) << 0;
result[y][x] = argb;
}
return result;
}
private int[][] randomRawData(int width, int height)
{
Random random = new Random();
int[][] result = new int[height][width];
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
int argb = random.nextInt();
result[y][x] = argb;
}
return result;
}
public void test() throws Exception
{
int[][] smallBlackPixels = getSimpleRawData(256, 256, 0);
int[][] singleBlackPixel = getSimpleRawData(1, 1, 0);
int[][] smallRedPixels = getSimpleRawData(256, 256, 0xffff0000);
int[][] singleRedPixel = getSimpleRawData(1, 1, 0xffff0000);
int[][] smallAscendingPixels = getAscendingRawData(256, 256);
int[][] smallRandomPixels = randomRawData(256, 256);
int[][][] testData = {
smallBlackPixels, singleBlackPixel, smallRedPixels,
singleRedPixel, smallAscendingPixels, smallRandomPixels,
};
for (int i = 0; i < testData.length; i++)
{
int rawData[][] = testData[i];
writeAndReadImageData(rawData);
}
}
public void testTransparency() throws Exception
{
// Test for https://issues.apache.org/jira/browse/SANSELAN-52
int[][] smallAscendingPixels = getAscendingRawData(256, 256);
byte[] pngBytes = Sanselan.writeImageToBytes(
imageDataToBufferedImage(smallAscendingPixels),
ImageFormat.IMAGE_FORMAT_PNG, null);
assertTrue(Sanselan.getImageInfo(pngBytes).isTransparent());
}
private BufferedImage imageDataToBufferedImage(int[][] rawData)
{
int width = rawData[0].length;
int height = rawData.length;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
image.setRGB(x, y, rawData[y][x]);
}
return image;
}
private int[][] bufferedImageToImageData(BufferedImage image)
{
int width = image.getWidth();
int height = image.getHeight();
int[][] result = new int[height][width];
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
result[y][x] = image.getRGB(x, y);
}
return result;
}
private void writeAndReadImageData(int[][] rawData) throws IOException,
ImageReadException, ImageWriteException
{
BufferedImage srcImage = imageDataToBufferedImage(rawData);
Map writeParams = new HashMap();
// writeParams.put(SanselanConstants.PARAM_KEY_FORMAT, ImageFormat.IMAGE_FORMAT_PNG);
// writeParams.put(PngConstants.PARAM_KEY_PNG_FORCE_TRUE_COLOR,
// Boolean.TRUE);
byte bytes[] = Sanselan.writeImageToBytes(srcImage,
ImageFormat.IMAGE_FORMAT_PNG, writeParams);
// Debug.debug("bytes", bytes);
File tempFile = createTempFile("temp", ".png");
IoUtils.writeToFile(bytes, tempFile);
BufferedImage dstImage = Sanselan.getBufferedImage(bytes);
assertNotNull(dstImage);
assertTrue(srcImage.getWidth() == dstImage.getWidth());
assertTrue(srcImage.getHeight() == dstImage.getHeight());
int dstData[][] = bufferedImageToImageData(dstImage);
compare(rawData, dstData);
}
private void compare(int[][] a, int[][] b)
{
assertNotNull(a);
assertNotNull(b);
assertTrue(a.length == b.length);
for (int y = 0; y < a.length; y++)
{
assertTrue(a[y].length == b[y].length);
// make sure row lengths consistent.
assertTrue(a[0].length == b[y].length);
for (int x = 0; x < a[y].length; x++)
{
assertTrue(a[y][x] == b[y][x]);
}
}
}
}