Как получить растровое изображение из необработанного изображения - PullRequest
7 голосов
/ 11 апреля 2011

Я читаю необработанное изображение из сети. Это изображение было прочитано датчиком изображения, а не из файла.

Вот что я знаю об изображении:
~ Высота и ширина
~ Общий размер (в байтах)
~ 8-битная шкала серого
~ 1 байт / пиксель

Я пытаюсь преобразовать это изображение в растровое изображение для отображения в виде изображения.

Вот что я попробовал:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.outHeight = shortHeight; //360
opt.outWidth = shortWidth;//248
imageBitmap = BitmapFactory.decodeByteArray(imageArray, 0, imageSize, opt);

decodeByteArray возвращает null , поскольку он не может декодировать мое изображение.

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

imageBitmap = BitmapFactory.decodeStream(imageInputStream, null, opt);

Возвращает также ноль .

Я искал на этом и других форумах, но не могу найти способ добиться этого.

Есть идеи?

РЕДАКТИРОВАТЬ: я должен добавить, что первое, что я сделал, было проверить, действительно ли поток содержит сырое изображение. Я сделал это с помощью других приложений `(iPhone / Windows MFC), и они смогли прочитать и правильно отобразить изображение. Мне просто нужно найти способ сделать это в Java / Android.

Ответы [ 4 ]

13 голосов
/ 12 апреля 2011

Android не поддерживает растровые изображения в градациях серого.Итак, во-первых, вы должны расширить каждый байт до 32-битного ARGB int.Альфа равен 0xff, а байты R, G и B являются копиями значения пикселя байта исходного изображения.Затем создайте растровое изображение поверх этого массива.

Также (см. Комментарии) кажется, что устройство думает, что 0 - это белый, 1 - черный - мы должны инвертировать исходные биты.

* 1004Итак, давайте предположим, что исходное изображение находится в байтовом массиве с именем Src.Вот код:
byte [] src; //Comes from somewhere...
byte [] bits = new byte[src.length*4]; //That's where the RGBA array goes.
int i;
for(i=0;i<src.length;i++)
{
    bits[i*4] =
        bits[i*4+1] =
        bits[i*4+2] = ~src[i]; //Invert the source bits
    bits[i*4+3] = 0xff; // the alpha.
}

//Now put these nice RGBA pixels into a Bitmap object

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(bits));
1 голос
/ 04 апреля 2018
for(i=0;i<src.length;i++)
{
    bits[i*4] = bits[i*4+1] = bits[i*4+2] = ~src[i]; //Invert the source bits
    bits[i*4+3] = 0xff; // the alpha.
}

Цикл преобразования может занять много времени для преобразования 8-битного изображения в RGBA, изображение 640x800 может занять более 500 мс ... Более быстрое решение - использовать формат ALPHA8 для растрового изображения и использовать цветфильтр:

//setup color filter to inverse alpha, in my case it was needed
float[] mx = new float[]{
    1.0f, 0, 0, 0, 0, //red
    0, 1.0f, 0, 0, 0, //green
    0, 0, 1.0f, 0, 0, //blue
    0, 0, 0, -1.0f, 255 //alpha
};

ColorMatrixColorFilter cf = new ColorMatrixColorFilter(mx);
imageView.setColorFilter(cf);

// after set only the alpha channel of the image, it should be a lot faster without the conversion step

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(src));  //src is not modified, it's just an 8bit grayscale array
imageview.setImageBitmap(bm);
1 голос
/ 12 апреля 2011

Однажды я сделал что-то подобное для декодирования потока байтов, полученного из обратного вызова предварительного просмотра камеры:

    Bitmap.createBitmap(imageBytes, previewWidth, previewHeight, 
                        Bitmap.Config.ARGB_8888);

Попробуйте.

0 голосов
/ 12 апреля 2011

Использовать Drawable create from stream. Вот как это сделать с помощью HttpResponse, но вы можете получить входной поток в любое время.

  InputStream stream = response.getEntity().getContent();

  Drawable drawable = Drawable.createFromStream(stream, "Get Full Image Task");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...