Создание 16 или 32-битного изображения из байтового массива - PullRequest
3 голосов
/ 23 ноября 2010

Учитывая ширину, высоту, глубину и байтовый массив изображения, мне нужно создать объект SWT Image.В настоящее время у меня нет проблем с предоставлением данных для 8-битных изображений.

int imageWidth;
int imageHeight;
int depth;
byte[] imageBytes;
//calculate the values

imageData = new ImageData( imageWidth, imageHeight, depth, new PaletteData(255,255,255), 1, imageBytes);
new Image( display, imageData );

У меня проблема в том, что для 16-битных изображений цвет немного искажен.Какими должны быть черные пиксели на самом деле серыми.

Для 32-битных изображений отображаются только несколько черных пикселей, а остальное изображение - белое.

Есть идеи?

Спасибо.

Редактировать: Массив imageBytes считывается из проприетарного графического файла, для которого мне не удалось получить спецификацию (и поэтому я не совсем уверен в формате).

Я смог добиться прогресса на 32-битном изображении.Похоже, что 32-битное изображение было в одном из форматов RGBAX.Я преобразовал его в 24-битное изображение, и теперь оно имеет ту же проблему, что и 16-битное изображение (то, что серое должно быть черным).

Размер массива imageBytes (ширина * высота * (глубина / 8)) где глубина в битах.

Я попытался изменить порядок байтов каждого пикселя, однако это не решило проблему.В областях, которые должны быть сплошным черным, это может быть либо черный, смесь белого и черного, либо все белое.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Учитывая, что (а) вы работаете с неизвестным графическим форматом и (б) у вас проблемы с серым, я подозреваю, что старший бит не для цвета, а для какой-то другой функции (возможно, прозрачности / альфа).Это может легко сделать ожидаемое полностью черное изображение на 50% серым.

Попробуйте выполнить простую битовую операцию для каждого байта изображения (или 16 бит или ...) и установите старший бит на ноль.

Для одного байта, т.е.: finalByte = originalByte & 0x7f;

Также возможно, что этот бит является маркером для кодирования длины серии (RLE) или другого кодирования вариаций, но если вы получаете правильные размеры изображения /размеры, это, вероятно, не тот случай.

0 голосов
/ 25 ноября 2010

Исходя из описанных вами симптомов, возможно, у вас возникли проблемы с порядком байтов. Похоже, что тип данных byte в Java только для 8-битных , поэтому при создании 16-битных изображений всего два Java bytes составляют один пиксель в построенном изображении. Очевидно, что для 32-битных изображений число Java bytes на пиксель будет равно 4.

Например, в 32-битном мире с прямым порядком байтов [0 0 0 255] будет довольно темно-серым (по существу, черным). С другой стороны, в мире с прямым порядком байтов это было бы очень близко к белому.

Некоторые вопросы:

  • Как вы заполняете массив imageBytes?
  • Каковы его размеры? Можно предположить, что это будет width*height*depth/8, если depth в битах.

Некоторые вещи, которые вы можете попробовать:

  • Прочтите документацию по SWT, чтобы узнать, что ожидает конструктор ImageData
  • Перемешайте bytes в пределах одного пикселя в массиве imageBytes. Например, в 32-битном случае [0 0 0 255] становится [255 0 0 0 ].
...