Есть файл bmp (256 градаций серого для начала). Из него читаются данные. Генерится структура BITMAP.
Для вывода на экран, как я поняла, нужен CBitmap.
Делаю вот что (в OnDraw), pbmp — это BITMAP*:
Валится на CreateBitmapIndirect. Если вместо него использовать CreateBitmap, то не валится, но если потом посмотреть свойства bmpImage (путем mpImage.GetBitmap(pbmp), то указатель на данные (pbmp->bmBits) равен NULL.
Здравствуйте, Bonnie, Вы писали:
B>Есть файл bmp (256 градаций серого для начала). Из него читаются данные. Генерится структура BITMAP. B>Для вывода на экран, как я поняла, нужен CBitmap. B>Делаю вот что (в OnDraw), pbmp — это BITMAP*:
B>CDC memDC; B>memDC.CreateCompatibleDC(pDC); B>bmpImage.CreateBitmapIndirect(pbmp); B>memDC.SelectObject(&bmpImage); pDC->>BitBlt(0,0,pbmp->bmWidth,pbmp->bmHeight,&memDC,0,0,SRCCOPY);
B>Валится на CreateBitmapIndirect. Если вместо него использовать CreateBitmap, то не валится, но если потом посмотреть свойства bmpImage (путем mpImage.GetBitmap(pbmp), то указатель на данные (pbmp->bmBits) равен NULL.
B>Объясните мне пожалуйста, где я что не так делаю?
А не лучше ли вместо создания битмапа загружать его с помощью LoadBitmap или LoadImage?
Здравствуйте, Yaumen, Вы писали:
Y>А не лучше ли вместо создания битмапа загружать его с помощью LoadBitmap или LoadImage?
К сожалению, это критично. Считанную картинку надо будет преобразовывать с помощью неких алгоритмов и каждый промежуточный этап выводить на экран.
То есть смысл не в том, чтобы файл показать, а чтобы показывать картинку, с которой что-то уже сделали. В реальном времени.
Здравствуйте, Bonnie, Вы писали:
B>Здравствуйте, Yaumen, Вы писали:
Y>>А не лучше ли вместо создания битмапа загружать его с помощью LoadBitmap или LoadImage?
B>К сожалению, это критично. Считанную картинку надо будет преобразовывать с помощью неких алгоритмов и каждый промежуточный этап выводить на экран. B>То есть смысл не в том, чтобы файл показать, а чтобы показывать картинку, с которой что-то уже сделали. В реальном времени.
Так загрузи эту битмапку один раз, например в конструкторе, и храни ее пока живет приложение, по необходимости издеваясь над ее содержимым. И незачем каждый раз при выводе создавать новую битмапку. Выбрал существующую, нарисовал и все.
Здравствуйте, Yaumen, Вы писали:
Y>Так загрузи эту битмапку один раз, например в конструкторе, и храни ее пока живет приложение, по необходимости издеваясь над ее содержимым. И незачем каждый раз при выводе создавать новую битмапку. Выбрал существующую, нарисовал и все.
Погоди-погоди, ты не понимаешь, кажется =)
Проблема в том, что не создается нужный экземпляр CBitmap, в котороый должна запихнуться картинка.
Сама картинка (структура BITMAP и привязанный к ней массивчик точек) созданы отдельно и не пересоздаются каждый раз.
И потом, мне же менять ее надо будет! 25 раз в секунду. Ну или раз в секунду, как получится.
Или погоди... ты предлагаешь и CBitmap создать вместе с ними с привязать намертво, чтобы изменились данные — изменился битмап? Так?
Но он же и в первый раз не создается.
Здравствуйте, Bonnie, Вы писали:
B>Здравствуйте, Yaumen, Вы писали:
Y>>Так загрузи эту битмапку один раз, например в конструкторе, и храни ее пока живет приложение, по необходимости издеваясь над ее содержимым. И незачем каждый раз при выводе создавать новую битмапку. Выбрал существующую, нарисовал и все.
B>Погоди-погоди, ты не понимаешь, кажется =) B>Проблема в том, что не создается нужный экземпляр CBitmap, в котороый должна запихнуться картинка. B>Сама картинка (структура BITMAP и привязанный к ней массивчик точек) созданы отдельно и не пересоздаются каждый раз. B>И потом, мне же менять ее надо будет! 25 раз в секунду. Ну или раз в секунду, как получится. B>Или погоди... ты предлагаешь и CBitmap создать вместе с ними с привязать намертво, чтобы изменились данные — изменился битмап? Так? B>Но он же и в первый раз не создается.
В таком случае, вообще проще создать один раз DIB и отказаться от структуры BITMAP и связанным с ним массивом точек. DIB тебе в любой момент и массив точек (даже цветных — COLORREF) и если надо HBITMAP. Поэтому вообще ничего больше пересоздавать не надо будет
Здравствуйте, Yaumen, Вы писали:
Y>В таком случае, вообще проще создать один раз DIB и отказаться от структуры BITMAP и связанным с ним массивом точек. DIB тебе в любой момент и массив точек (даже цветных — COLORREF) и если надо HBITMAP. Поэтому вообще ничего больше пересоздавать не надо будет
Можно код? И по вывод на экран.
DIB, как я понимаю, это структура файла bmp вживую?
Здравствуйте, Bonnie, Вы писали:
B>Здравствуйте, Yaumen, Вы писали:
Y>>В таком случае, вообще проще создать один раз DIB и отказаться от структуры BITMAP и связанным с ним массивом точек. DIB тебе в любой момент и массив точек (даже цветных — COLORREF) и если надо HBITMAP. Поэтому вообще ничего больше пересоздавать не надо будет
B>Можно код? И по вывод на экран. B>DIB, как я понимаю, это структура файла bmp вживую?
Эта проблема много где описана. Вот пример кода который создает DIB из битмапа. Битмап же ты умеешь загружать!?
На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt
Y>На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt
Прям вот так вот и выбирать с помощью SelectObject?
Или ::SelectObject?
Здравствуйте, Yaumen, Вы писали:
Y>На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt
Да, и еще вопрос: это про 32 бит на цвет, а если 8 бит? Где там таблица цветов?
Здравствуйте, Bonnie, Вы писали:
B>Здравствуйте, Yaumen, Вы писали:
Y>>На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt
B>Да, и еще вопрос: это про 32 бит на цвет, а если 8 бит? Где там таблица цветов?
К вопросу о количестве бит на цвет смотри спецификацию на BITMAPINFOHEADER: biBitCount
Specifies the number of bits per pixel. Some compression formats need this information to properly decode the colors in the pixel.
Что касается рисования, то лучше использовать ::SelectObject(), хотя никто не запрещает написать SelectObject(FromHandle(hSrcDib)).
Кстати в приведенном коде я забыл указать назначение hSrcDC — это контекст в котором выбран HBITMAP, который запихивается в DIB
Здравствуйте, Yaumen, Вы писали:
B>>Да, и еще вопрос: это про 32 бит на цвет, а если 8 бит? Где там таблица цветов?
Y>К вопросу о количестве бит на цвет смотри спецификацию на BITMAPINFOHEADER: Y>biBitCount Y>Specifies the number of bits per pixel. Some compression formats need this information to properly decode the colors in the pixel.
Я спрашивала про таблицу цветов... 8 бит это ж не только цветной, но и градации серого... Откуда цвета-то сами берутся?