На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Bitmaps
    Такая трабла, не могу нормально работать с 256 цветными bitmap'ами. Я хочу у одной битмапы данные GetDIBits, что нить с ними сделать, с сунуть в другую. SetDIBits.
    Причем при 24 битном цвете все работает нормлаьно,

    а когда 8 бит, там мутотень с палитрой, и функции как-то коряво
    работают.
    так GetDIBits в массив выводит порядка 1000 элементов для картинки
    10х10
    хотя при 24битном цвете она выводила в массив 320 эл-тов.
     SetDIBits возвращает 0, то есть ошибка, GetLastError() тоже
     возвращает 0?? (вынь2000)
    дык а если битмапу не выбирать в контекст до GetDIBits, а сделать это
    после ее вызова, то вообще ничего не выводиться на экран.
    в чем может быть дело?

    кусок кода:
    char buf[2000];
     
      hbmp=(HBITMAP)LoadImage(0,"bmp.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
      //  SelectObject(hdc,hbmp);
     
      BITMAPINFO bi;
      bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
      bi.bmiHeader.biWidth=10;
      bi.bmiHeader.biHeight=10;
      bi.bmiHeader.biCompression=BI_RGB;
      bi.bmiHeader.biPlanes=1;
      bi.bmiHeader.biSizeImage=0;
      bi.bmiHeader.biBitCount=8;
      bi.bmiHeader.biClrUsed=2;
      bi.bmiHeader.biClrImportant=2;
       
       
      int res=GetDIBits(hdc,hbmp,0,10,buf,&bi,DIB_RGB_COLORS);
       
      char buf1[1000];

     // memset(bi.bmiColors,40,3*192); примерыы того, что можно делать
     // memset(buf+3,2,1);    на самом деле чусть сложнее
       
      HBITMAP hb=CreateBitmap(10,10,1,8,buf1);//=CreateCompatibleBitmap(hcdc,10,10);
     // SelectObject(hcdc,hbmp);
      res=SetDIBits(hdc,hb,0,10,buf,&bi,DIB_RGB_COLORS);
      res=(GetLastError());
       
      //int res=SetBitmapBits(hb,r,lp);
    //GetBitmapBits(hbmp,1900,buf)
            SelectObject(hcdc,hb);
      BitBlt(hdc,200,200,210,210,hcdc,0,0,SRCCOPY);

    причем от того, какие dc я скармливаю функциям hdc или hcdc ничего (почти ) независит...

    при 24 битном цвете все работает нормально..
    Заранее благодарен

      самое простое переделать  :(из 256 в 24 а затем обратно
        Ошибка в том, что при вызове GetDIBits в структуре BITMAPINFOHEADER заполняются только первые шесть параметров, т.е.:

        DWORD  biSize;
        LONG   biWidth;
        LONG   biHeight;
        WORD   biPlanes;
        WORD   biBitCount
        DWORD  biCompression;

        т.е. GetDIBits перед занесением битов в память конвертирует исходный растр в требуемый. При соответсвии BITMAPINFOHEADER исходному растру выполняется прямой перенос битов.

        все остальные параметры BITMAPINFOHEADER игнорируются.
        Как выполняется конвертация цветов при переходе из одного формата в другой, описано в хелпе по GetDIBits.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0175 ]   [ 16 queries used ]   [ Generated: 28.04.24, 00:20 GMT ]