Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Создание bmp файлов


Автор: Светлана 7.9.2006, 14:43
Подскажите, пожалуйста кто-нибудь! как в Visual С работать с bmp файлами? Мне надо создать картинку и порисовать там.

Автор: cardinal 7.9.2006, 15:07
А поискать на форуме? Все сто раз уже объясняли...

Автор: Светлана 7.9.2006, 15:22
Хорошо. Тогда дайте ссылку, где это обсуждалось. Если, конечно, не трудно.

Автор: cardinal 7.9.2006, 15:32
Эх, народ...
http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=f463a6d68c6d6f027f5de50affb289bb&search_in=posts&result_type=topics&flag=search&debug=&highlite=bmp&skipped=
(это только те темы, в которых я принимал участие)...

Автор: Светлана 7.9.2006, 16:14
Народ у нас такой же как и правительство.

Спасибо. Я поищу там ответ на свой вопрос. Только меня мучают сомнения - есть ли там программное создание bmp файлов? Я же тоже искала ответ, прежде чем задавать вопрос. А суть в том, что программа переписывается с Builder'а, где существует замечательный класс. Он позволяет и создать, и порисовать и сохранить в файл. А в Visual такой класс есть? Спасибо, заранее за ответ.

Автор: Alexeis 7.9.2006, 16:43
Цитата(Светлана @  7.9.2006,  16:14 Найти цитируемый пост)
есть ли там программное создание bmp файлов?

Класс CBitmap это может.
А вот на счет сохранения тут не уверен. Кажись нет такого метода.

А вот в .Net есть замечательный класс BitMap имеющий метод Save для сохранения изображений (не зря говорят, что там поработал программист Borland smile )

Автор: Rapalex 7.9.2006, 17:41
CImage прекрасно сохранит даже в png.

Автор: cardinal 7.9.2006, 18:58
Цитата(Светлана @  7.9.2006,  15:14 Найти цитируемый пост)
А в Visual такой класс есть?

А тебе обязательно класс нужен?

Автор: SteN 7.9.2006, 21:41
Нашёл тут у себя один исходничек. Может поможет:
Код

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <mem.h>

#define BI_RGB        0    // компрессия отсутствует
#define BI_RLE8       1    // компрессия (для одного пиксела - 8 бит)
#define BI_RLE4       2    // компрессия (для одного пиксела - 4 бита)
#define BI_BITFIELDS  3    // компрессия (другой формат компрессии)

typedef unsigned long UINT;
typedef unsigned long DWORD;
typedef unsigned int  WORD;
typedef unsigned long LONG;
typedef unsigned char BYTE;
//////////////////////////////////////////////////////////////////////////
//
typedef struct tagBITMAPFILEHEADER
{
    UINT  bfType;                // тип файла (0x4D42)
    DWORD bfSize;                // размер файла
    BYTE  bfReserved1;        
    BYTE  bfReserved2;        
    DWORD bfOffBits;            // смещение битов изображения
}BITMAPFILEHEADER;
typedef BITMAPFILEHEADER*     PBITMAPFILEHEADER;
typedef BITMAPFILEHEADER far* LPBITMAPFILEHEADER;

//////////////////////////////////////////////////////////////////////////
//
typedef struct tagBITMAPINFOHEADER
{
    DWORD biSize;                // размер структуры BITMAPFILEHEADER
    LONG  biWidth;                // ширина изображения в пикселах
    LONG  biHeight;            // высота изображения в пикселах
    WORD  biPlanes;            // количество плоскостей
    WORD  biBitCount;            // количество бит на пиксел
    DWORD biCompression;        // тип сжатия
    DWORD biSizeImage;        // размер изображения в байтах
    LONG  biXPelsPerMeter;    // разрешение устройства вывода по X
    LONG  biYPelsPerMeter;    // разрешение устройства вывода по Y
    DWORD biClrUsed;            // размер таблицы цветов
    DWORD biClrImportant;    // необходимое количество цветов
}BITMAPINFOHEADER;
typedef BITMAPINFOHEADER*     PBITMAPINFOHEADER;
typedef BITMAPINFOHEADER far* LPBITMAPINFOHEADER;

//////////////////////////////////////////////////////////////////////////
//
typedef struct tagRGBTRIPLE
{
    BYTE rgbtBlue;
    BYTE rgbtGreen;
    BYTE rgbtRed;
}RGBTRIPLE;
typedef RGBTRIPLE far* LPRGBTRIPLE;

//////////////////////////////////////////////////////////////////////////
//
void main()
{
    BITMAPFILEHEADER BitmapFileHeader;
    BITMAPINFOHEADER BitmapInfoHeader;
    RGBTRIPLE Rgb;
    BYTE buf;
    LONG  Width;
    LONG  Height;
    int i, j, k;

    buf    = 0;
    Width  = 150;
    Height = 300;
    clrscr();

    
    memset(&BitmapFileHeader, 0, sizeof(BITMAPFILEHEADER));
    
    BitmapFileHeader.bfType = 0x4D42;    // тип файла (текстовая строка "BM")
    BitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) +
                                          sizeof(BITMAPINFOHEADER);

    
    memset(&BitmapInfoHeader, 0, sizeof(BITMAPINFOHEADER));
    
    BitmapInfoHeader.biSize     = sizeof(BITMAPINFOHEADER);
    BitmapInfoHeader.biHeight   = Height;
    BitmapInfoHeader.biWidth    = Width;
    BitmapInfoHeader.biPlanes   = 1;
    BitmapInfoHeader.biBitCount = sizeof(RGBTRIPLE)*8;

    FILE *stream;
    stream = fopen("a.bmp", "wb");
    if(stream == NULL)
    {
        cout << "Ошибка открытия файла для записи" << endl;
        exit(1);
    }

    
    fwrite(&BitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, stream);
    fwrite(&BitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, stream);

   // "рисуем" красный прямоугольник
    Rgb.rgbtBlue  = 0;
    Rgb.rgbtGreen = 0;
    Rgb.rgbtRed   = 255;

    for(i = 0; i<Height/2; i++)
    {
        for(j = 0; j<Width; j++)
            fwrite(&Rgb, sizeof(RGBTRIPLE), 1, stream);

        // каждая строка изображения - кратна 4 байтам
        if(Width%4 == 0) continue;
        for(k=0; k<4; k++)
        {
            fwrite(&buf, sizeof(BYTE), 1, stream);
            if((Width+k+1)%4 == 0) break;
        }
    }

    // "рисуем" синий прямоугольник
    Rgb.rgbtBlue  = 255;
    Rgb.rgbtGreen = 0;
    Rgb.rgbtRed   = 0;

    for(i = 0; i<Height/2; i++)
    {
        for(j = 0; j<Width; j++)
            fwrite(&Rgb, sizeof(RGBTRIPLE), 1, stream);
        if(Width%4 == 0) continue;
        for(k=0; k<4; k++)
        {
            fwrite(&buf, sizeof(BYTE), 1, stream);
            if((Widthэ)%4 == 0) break;
        }
    }
    if(Width%4 != 0)
        for(k=0; k<4; k++)
        {
            fwrite(&buf, sizeof(BYTE), 1, stream);
            if((Widthэ)%4 == 0) break;
        }

    fclose(stream);
    getch();
}
 

Автор: cardinal 8.9.2006, 00:09
SteN, у тебя очепятки в коде - Widthэ

А так, Светлана, я думаю Вы уже видите, что что в Visual, что в Borland - bmp файлы создавать можно везде одинаково (и не через классы).

Автор: Светлана 8.9.2006, 09:01
Спасибо. Я даже не ожидала такого живого участия к моей проблеме... Правда, СПАСИБО!

SteN, скорее всего пригодится. Я посмотрю.

Сardinal, не обязательно класс. Хотя конечно с ним было бы удобнее. Но можно все собрать по кусочкам... Теперь, если с созданием и сохранением, есть где смотреть, то осталась проблема с рисованием. А очепятки - ничего, будет повод разобраться :)

Rapalex, CImage... что-то этот класс я упустила из виду.

Аlexeis1, класс CBitmap, не подходит. Т.к. в Builder'е класс назывался TBitmap, то на CBitmap я и подумала. Но он работает исключительно с картинкой, ее цветом и подобное. Не сохранить, не нарисовать что-нибудь с его помощью нельзя... А .Net, замечательно, но я ни разу даже не видела Visual .Net... Учиться конечно никогда не поздно, но хочу попробовать сначала решить проблему на этом уровне.

Автор: Dart 8.9.2006, 11:26
Светлана, в любом классе производном от CObject (это и к CImage, и к CBitmap), есть сериализация. А это преобразование в/из последовательной формы в, собственно, сам объект. Т.е. пожалуйста, переопределяй сериализацию и сохраняй как тебе угодно, вообще в любом формате. По поводу функций преобразования можно посмотреть на www.codeproject.com

Автор: Earnest 8.9.2006, 16:05
Цитата(Светлана @  8.9.2006,  10:01 Найти цитируемый пост)
 не нарисовать что-нибудь с его помощью нельзя... 

Рисовать на битмапе очень просто. Нужно создать совместимый контекст, выбрать туда битмап, и рисовать в контекст любыми средствами GDI. CImage делает то же самое, но предлагает готовый контекст.

Автор: Светлана 12.9.2006, 11:47
Все получилось! Всем огромное СПАСИБО!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)