2013-05-06 2 views
0

Я конвертирую приложение C++ Win32 в Java (в Linux) Мне нужно прочитать BITMAPFILEHEADER и BITMAPINFOHEADER растрового изображения, как я могу это сделать? Я нахожу библиотеку jna (java native access), которая специализируется на окнах (я думаю). Есть ли у кого-нибудь идеи?Чтение BITMAPFILEHEADER и BITMAPINFOHEADER из BitMap

ответ

0

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

public class BitmapFileHeader { 

char[] bfType; 
int bfSize; 
short bfReserved1; 
short bfReserved2; 
int bfOffBits; 

private BitmapFileHeader() { 

} 

public static BitmapFileHeader readFromImage(byte[] image) { 

    BitmapFileHeader bitmap = new BitmapFileHeader(); 

    bitmap.bfType = new char[2]; 
    int index = 0; 
    bitmap.bfType[0] = (char) image[index++]; 
    bitmap.bfType[1] = (char) image[index++]; 

    bitmap.bfSize = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.bfReserved1 = (short) (((image[index + 1] & 0xFF) << 8) | (image[index + 0] & 0xFF)); 
    index += 2; 

    bitmap.bfReserved2 = (short) (((image[index + 1] & 0xFF) << 8) | (image[index + 0] & 0xFF)); 
    index += 2; 

    bitmap.bfOffBits = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 

    return bitmap; 

} 

} 

public class BitmapInfoHeader { 

int biSize; 
long biWidth; 
long biHeight; 
short biPlanes; 
short biBitCount; 
int biCompression; 
int biSizeImage; 
long biXPelsPerMeter; 
long biYPelsPerMeter; 
int biClrUsed; 
int biClrImportant; 

private BitmapInfoHeader() { 

} 

public static BitmapInfoHeader readFromImage(byte[] image) { 

    BitmapInfoHeader bitmap = new BitmapInfoHeader(); 
    // LittleEndian order ... 
    int index = 14; 

    bitmap.biSize = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biWidth = ((image[index + 3] & 0xff) << 24) | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biHeight = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biPlanes = (short) (((image[index + 1] & 0xFF) << 8) | (image[index + 0] & 0xFF)); 
    index += 2; 

    bitmap.biBitCount = (short) (((image[index + 1] & 0xFF) << 8) | (image[index + 0] & 0xFF)); 
    index += 2; 

    bitmap.biCompression = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biSizeImage = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biXPelsPerMeter = 
    // ByteBuffer.wrap(image, index, index + 
    // 4).order(ByteOrder.LITTLE_ENDIAN).getLong(); 
    (int) (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biYPelsPerMeter = 
      //ByteBuffer.wrap(image, index, index + 4).order(ByteOrder.LITTLE_ENDIAN).getLong(); 
    (int) (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biClrUsed = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    bitmap.biClrImportant = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8 
      | (image[index + 0] & 0xFF); 
    index += 4; 

    index += 10; 
    return bitmap; 

} 

} 
Смежные вопросы