Для моего приложения для Android мне нужно несколько процедур обработки изображений, которые я хочу протестировать с помощью robolectric. Эти процедуры работают на объектах Bitmap
. Для этого мне нужно загрузить тестовые изображения. К моему большому разочарованию я обнаружил, что robolectric не поддерживает фреймворк Android класса BitmapFactory
. Они говорят:Тестирование процедур обработки изображений с robolectric
Так что я решил написать свой собственный Bitmap
погрузчик:
public static Bitmap loadFromFile(File file) throws IOException
{
final BufferedImage image = ImageIO.read(file);
final int[] pixels = new int[ image.getWidth() * image.getHeight() ];
image.getRGB
(0 // start x
, 0 // start y
, image.getWidth() // width
, image.getHeight() // height
, pixels // pixel array
, 0 // offset
, image.getWidth()); // stride
final Bitmap result = Bitmap.createBitmap
(pixels // pixel array
, image.getWidth() // width
, image.getHeight() // height
, Bitmap.Config.ARGB_8888); // format
return result;
}
Я также хотел, чтобы проверить, работает ли загрузчик, так что я написал короткую процедуру тестирования показано ниже.
@Test
public void test() throws Exception
{
final Bitmap source = loadFromFile(new File("in.png"));
saveToFile(source, "png", new File("out.png"));
}
Он использует следующую процедуру для записи изображения:
public static void saveToFile
(Bitmap bitmap
, String format, File file) throws IOException
{
final BufferedImage image = new BufferedImage
(bitmap.getWidth() // width
, bitmap.getHeight() // height
, BufferedImage.TYPE_INT_ARGB); // channels
final int[] pixels = new int[ image.getWidth() * image.getHeight() ];
bitmap.getPixels
(pixels // pixel array
, 0 // offset
, image.getWidth() // stride
, 0 // start x
, 0 // start y
, image.getWidth() // width
, image.getHeight()); // height
image.setRGB
(0 // start x
, 0 // start y
, image.getWidth() // width
, image.getHeight() // height
, pixels // pixel array
, 0 // offset
, image.getWidth()); // stride
ImageIO.write(image, format, file);
}
После того как я запустить тест, я сравниваю письменный out.png
к in.png
. Хотя, конечно, in.png
выглядит хорошо, out.png
пуст. Он имеет правильные размеры, но заполняется нулевыми альфа-пикселями.
Вопрос: Что я делаю неправильно? Как я могу загрузить тестовые изображения с помощью robolectric, которые мне требуются для тестирования моих процедур обработки изображений?
Примечание: Если установить все pixels
записи в 0xFFFFFFFF прямо перед созданием Bitmap
объекта, ничего не меняется. Письменное изображение остается прозрачным. Поэтому я думаю, что ошибка должна быть где-то позже.
Я использую robolectric 2.2.
Любые обновления на этом компьютере? Я пробовал много подходов, но похоже, что Bitmap заштрихован ... – saikek
@saikek Нет, похоже, что только вы можете сделать это, используя собственную абстракцию «Bitmap», которая использует исходную «битмап», когда она доступна, и падает вернуться к собственной реализации в противном случае. – theV0ID