Преобразовать массив цветов пикселей в BMP [16 bit]

Тема в разделе "WASM.WIN32", создана пользователем punxer, 14 ноя 2009.

  1. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    есть RAW файл, в котором ,как я язнаю, а я знаю, содержится информация о битмапе, цветность 16 бит на пиксель, также известны размеры по ширине и высоте, нужно создать из этих данных битмап файл(*.BMP) так, что бы он был 16 битным. Для того, что бы была возможность изменить его в фотошопе и из вышедшего из фотошопа битмапа изъять тот же, что и вначале массив цветов пикселей. Вроде просто, но:

    bpp=16
    width=285
    height=530

    Код (Text):
    1. VOID    extract_res     (int iter,PCHAR pRes,int width,int height)
    2. {
    3.     BITMAPFILEHEADER               bfh;
    4.     BITMAPINFOHEADER               bi;
    5.     CHAR*               path=               NULL;
    6.     CHAR                dstbuff[MAX_SIZE];
    7.     FILE*               hBmpFile=           NULL;
    8.  
    9.     memset(&bfh,0x00,sizeof(bfh));
    10.     memset(&bi,0x00,sizeof(bi));
    11.    
    12.     bfh.bfType=(WORD)0x4D42;
    13.     bfh.bfSize=(DWORD)(sizeof(bi)+sizeof(bfh)+width*height*bpp/8);
    14.     bfh.bfReserved1=0;
    15.     bfh.bfReserved2=0;
    16.     bfh.bfOffBits=sizeof(bi)+sizeof(bfh);
    17.  
    18.     bi.biSize=sizeof(bi);
    19.     bi.biBitCount=bpp;
    20.     bi.biClrImportant=0;
    21.     bi.biClrUsed=0;
    22.     bi.biCompression=BI_RGB;
    23.     bi.biHeight=-height;
    24.     bi.biPlanes=1;
    25.     bi.biSizeImage=0;
    26.     bi.biWidth=width;
    27.     bi.biXPelsPerMeter=0;
    28.     bi.biYPelsPerMeter=0;
    29.  
    30.     _itoa(iter,dstbuff,10);
    31.     path=strcat(dstbuff,"_res.bmp");
    32.     fopen_s(&hBmpFile,path,"w+b");
    33.     fwrite((void *)&bfh,sizeof(BITMAPFILEHEADER),sizeof(BYTE),hBmpFile);
    34.     fwrite((void *)&bi,sizeof(BITMAPINFOHEADER),sizeof(BYTE),hBmpFile);
    35.     fwrite(pRes,width*height*bpp/8,sizeof(BYTE),hBmpFile);
    36.     fflush(hBmpFile);
    37.     fclose(hBmpFile);
    38.  
    39. }
    Это собсно то, что я наваял сразу. Но ,битмап выходи косячный.
    Прилогаю RAW данные и то что получается и то что должно выйти.
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    pRes указывает на начало данных.
    Iter так для успокоения и прочей бредни.
    поможайте, весь msdn облазил...
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    по моему длина строки в bmp должна быть до двойного слова выровнена
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Black_mirror
    v file? to est pisat v fail postrochno s dopolneniem nulyami?
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Black_mirror
    Est kontakt. kartinka rovnaya no tsveta kak byli tak i ostalisya( est kakie nit mysli?
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1.     _itoa(iter,dstbuff,10);
    2.     path=strcat(dstbuff,"_res.bmp");
    3.     fopen_s(&hBmpFile,path,"w+b");
    4.     fwrite((void *)&bfh,sizeof(BITMAPFILEHEADER),sizeof(BYTE),hBmpFile);
    5.     fwrite((void *)&bi,sizeof(BITMAPINFOHEADER),sizeof(BYTE),hBmpFile);
    6.     //write lines to fill line by line adjusted to dword size
    7.     ptr=pRes;
    8.     n=int(width%sizeof(DWORD));
    9.     n+=1;
    10.     for (int i=0;i<height;i++)
    11.     {
    12.         fwrite(ptr,width*bpp/8,sizeof(BYTE),hBmpFile);
    13.         fwrite(&close_line,n,sizeof(BYTE),hBmpFile);
    14.         ptr+=width*bpp/8;
    15.     }
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    CLOSED NAX
     
  8. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    punxer
    С цветами тоже разобрался? В первой версии твоей картинки проблема в том, что у тебя наверно по 5 бит на каждую компоненту, а у винды на зелёную выделено 6 бит, или наоборот.

    это вообще бред. должно быть n=(-width*bpp/8)%4
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    s 16 bpp kartinkami vse prosche:
    Код (Text):
    1.     if ((width%2)==0)
    2.         n=0;
    3.     else
    4.         n=2;
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Black_mirror
    Kstatte pochemu minus width?
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    a da, vse rabootaet