Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/41: Рейтинг темы: голосов - 41, средняя оценка - 4.76
 Аватар для frombrest
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 16

Конвертация BMP в свой формат

28.10.2012, 01:03. Показов 8383. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит задача сделать собственный формат изображения. Собственный формат предполагает создание собственной структуры заголовка (отличающейся от BMP), запись этого заголовка в файл и запись растровых данных с глубиной цвета 24 бита.

Программа должна открывать BMP сохранять в свой формат и наоборот (открывать свой формат и сохранять в bmp), соответственно выводить информацию за заголовка.

Вот копался, читал... написал открывание bmp....
по аналогии можно и на свой формат написать....

но его сначала надо как то сохранить. Может кто написать как бы так со своим заголовком сохранить? Структура заголовка ниже...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
if (OpenPictureDialog1->Execute())  {
Memo1->Clear();
ptrOnBmpFile=fopen(OpenPictureDialog1->FileName.c_str(),"r");
fseek(ptrOnBmpFile, 0, SEEK_SET);
 
fread(&c, 1, 1, ptrOnBmpFile); // определяем что за файл
 
if (c=='B') /*если BMP*/
{
fread(&c, 1, 1, ptrOnBmpFile);
if (c!='M') f=False;
if (f) {
/*тут читаем BMP*/
 
// читаем инфу
Memo1->Lines->Add("Это BMP");
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Размер файла "+IntToStr(dwData)+" byte");
fread(&dwData, 4, 1, ptrOnBmpFile);
fread(&dwData, 4, 1, ptrOnBmpFile);
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Начало данных изображения "+IntToStr(dwData));
fread(&h, 4, 1, ptrOnBmpFile);
fread(&w, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Разрешение "+IntToStr(h)+" x "+IntToStr(w));
fread(&wData, 2, 1, ptrOnBmpFile);
Memo1->Lines->Add("Кол-во плоскостей "+IntToStr(wData));
fread(&size, 2, 1, ptrOnBmpFile);
Memo1->Lines->Add("Кол-во битов на пиксель "+IntToStr(size));
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Сжатие "+IntToStr(dwData));
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Размер растра в байтах "+IntToStr(dwData));
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Гор разреш (пик/метр) "+IntToStr(dwData));
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Вер разреш (пик/метр) "+IntToStr(dwData));
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Кол-во цветов "+IntToStr(dwData));
fread(&dwData, 4, 1, ptrOnBmpFile);
Memo1->Lines->Add("Кол-во важных цветов "+IntToStr(dwData));
// подгоняем окошко
Image1->Width=h;
Image1->Height=w;
Form1->Width=200+h+24;
if (Image1->Height<Memo1->Height)
{Form1->Height=380;}
else   {Form1->Height=w+73;}
// читаем растр
 
if (size==8)
 {
 Memo1->Lines->Add(IntToStr(ftell(ptrOnBmpFile)));
 fread(pal, 4, 256, ptrOnBmpFile);
 
 Memo1->Lines->Add(IntToStr(ftell(ptrOnBmpFile)));
 
 for (i=w-1;i>=0;i--)
 for (j=0;j<h;j++)
  {
  fread(&ptr,1, 1, ptrOnBmpFile);
  Image1->Canvas->Pixels[j][i]=RGB(pal[ptr].red,pal[ptr].green,pal[ptr].blue);
  }
 Memo1->Lines->Add(IntToStr(ftell(ptrOnBmpFile)));
 }
 else //обработка 24 битных изображений
 {
 Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
  };
   // прочитали )
}

Структура заголовка:

1. Идентификатор типа файла (2 байта)
2. Автор формата (20 байт)
3. Название программы (8 байт)
4. Размер заголовка в байтах (2 байта)
5. Размер изображения в пикселах (4 байта)
6. Глубина цвета (1 байт) - глубина постоянная 24 байта
7. Ширина изображения (4 байта)
8. Размер файла в байтах (8 байт)
9. Размер растра в байтах (8 байт)
10. Смещение растровых данных (4 байта)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2012, 01:03
Ответы с готовыми решениями:

Конвертация bmp в png
есть изображение созданое путём Graphics::TBitmap *Bitmap=new Graphics::TBitmap; надо переконвертировать его в пнг если не ошибаюсь...

Формат PCX. Конвертация в BMP
Приветствую. Возникла задача для курсового - написать конвертер 256-цветных PCX изображений в 256-цветные BMP. И появились вопросы. ...

Кодирование Хаффмана (bmp в свой формат)
Дообры день! Подскажите как реализовать следующее: Есть программа кодирования/декодирования хаффмана. Работает так: с текстового файла...

31
 Аватар для frombrest
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 16
04.11.2012, 19:31  [ТС]
Студворк — интернет-сервис помощи студентам
Ребят... всё сделал... программа сохраняет как надо... все по байту проверил всё ровненько... как надо...
Растр пишется как в БМП так и в моём файле... разница только в заголовках. Остальное всё точно так же... ))

Теперь всплыла другая трабла... Вот в чём она заключается я вооообще понять не могу =(

Описываю:

Во первых файлы изображений: test.zip

Вот как считывает мой формат (PAI) программа:

Вот как считывается мой формат в программе:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Memo1->Clear();
ptrOnBmpFile=fopen(OpenDialog1->FileName.c_str(),"r");
fseek(ptrOnBmpFile, 0, SEEK_SET);
fread(&c, 1, 1, ptrOnBmpFile); 
if (c=='P'){
fread(&c, 1, 1, ptrOnBmpFile);
if (c!='A') f=False;
if (f) {
Memo1->Lines->Add("Ýòî PAI");
char myname,inf;
String myname1;
for (int v=0;v<20;v++){
fread(&inf, 1, 1, ptrOnBmpFile);
myname =(char)inf;
myname1 = myname1 + myname;
}
        Memo1->Lines->Add("Èìÿ "+myname1);
char prname,inf1;
String prname1;
for (int v=0;v<8;v++){
fread(&inf1, 1, 1, ptrOnBmpFile);
prname =(char)inf1;
prname1 = prname1 + prname;
}
        Memo1->Lines->Add("Ïðîãðàììà "+prname1);
fread(&dwData, 2, 1, ptrOnBmpFile);
        Memo1->Lines->Add("Ðàçìåð çàãîëîâêà "+IntToStr(dwData));
fread(&pix, 4, 1, ptrOnBmpFile);
        Memo1->Lines->Add("Êîë-âî ïèêñåëåé "+IntToStr(pix));
fread(&size, 1, 1, ptrOnBmpFile);
        Memo1->Lines->Add("Ãëóáèíà öâåòà "+IntToStr(size));
fread(&h, 4, 1, ptrOnBmpFile);
        w=pix/h;
        Memo1->Lines->Add("Øèðèíà êàðòèíêè "+IntToStr(h));
fread(&dwData, 8, 1, ptrOnBmpFile);
        Memo1->Lines->Add("Ðàçìåð ôàéëà "+IntToStr(dwData));
fread(&dwData, 8, 1, ptrOnBmpFile);
        Memo1->Lines->Add("Ðàçìåð ðàñòðà "+IntToStr(dwData));
fread(&dwData, 4, 1, ptrOnBmpFile);
        Memo1->Lines->Add("Ñìåùåíèå ðàñòðà "+IntToStr(dwData));
 
Image1->Width=h;
Image1->Height=w;
Form1->Width=200+h+24;
if (Image1->Height<Memo1->Height)
{Form1->Height=380;}
else   {Form1->Height=w+73;}
 
// ÷èòàåì ðàñòð
int ptrB, ptrG, ptrR;
/*Memo1->Lines->Add("Test_Width "+IntToStr(h));
Memo1->Lines->Add("Test_Height "+IntToStr(w));
Memo1->Lines->Add("Test_Ftell "+IntToStr(ftell(ptrOnBmpFile))); */
  for (i=w-1;i>=0;i--)
 for (j=0;j<h;j++)
  {
  fread(&ptrB,1, 1, ptrOnBmpFile);
  fread(&ptrG,1, 1, ptrOnBmpFile);
  fread(&ptrR,1, 1, ptrOnBmpFile);
  Image1->Canvas->Pixels[j][i]= TColor(RGB(ptrR, ptrG, ptrB));
  ptrB=0;
  ptrG=0;
  ptrR=0;
  }
 }
Откуда эта чёрная полоса сверху??? =(
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.11.2012, 19:34
Выложи заново вложения... они не открываются.
0
 Аватар для frombrest
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 16
04.11.2012, 19:37  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Выложи заново вложения... они не открываются.
поправил =\
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.11.2012, 19:40
Ну так размер заголовка наверное не угадал поэтому и срезает
0
 Аватар для frombrest
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 16
04.11.2012, 19:44  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так размер заголовка наверное не угадал поэтому и срезает
Не.. с размером заголовка всё окей...

Я посмотрел перед началом считывания растра курсор находится на 61-ом байте файла.... 62- уже начинается растр. Да и большая часть изображения считывается правильно. да и заголовок у меня 61 байт занимает я думаю этот кусок занял бы меньше на картинке если бы он начинал читать растр с заголовка =\
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.11.2012, 19:49
Размер "старого" заголовка не угадали поэтому байты загрузились не все, я так предполагаю
0
 Аватар для frombrest
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 16
04.11.2012, 20:06  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Размер "старого" заголовка не угадали поэтому байты загрузились не все, я так предполагаю
Блин Мистика....

ничего в программе не менял =(
Нарисовал в Пэинте BMPшку.... 24бита
сохранил.
открыл в проге... сохранил под PAI формат... Открыл опять в проге... всё замечательно открылось =\

как такое может быть ?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.11.2012, 20:08
У разных версий битмапа разный размер заголовка.... - читай ссылку на вики
0
 Аватар для frombrest
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 16
04.11.2012, 20:13  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
У разных версий битмапа разный размер заголовка.... - читай ссылку на вики
Так это понятно.... Я когда свой формат пишу ... я заголовки битмапа не трогаю... я просто с канваса по одному пикселю забираю и сохраняю по биту в свой формат... забираю только растровые данные...

чудные эти языки программирования =\ вообще капец.

да и обе картинки и для первого теста и для второго по формату одинаковые.. только по размеру разные.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.11.2012, 20:48
чудные эти языки программирования =\ вообще капец.
Ну чудного ничего нет, это у вас логика хромает...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.11.2012, 01:34
Можно как-то так реализовать преобразование, но это если при учете что битмап не содержит палитры

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <vcl.h>
#include <fstream>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
struct MyFILEHEADER
{
 unsigned short type;        // 1. Идентификатор типа файла (2 байта)
 char author[20];            // 2. Автор формата (20 байт)
 char prog_name[8];          // 3. Название программы (8 байт)
 unsigned long header_size;  // 4. Размер заголовка в байтах (2 байта)
 unsigned long img_size;         // 5. Размер изображения в пикселах (4 байта)
 unsigned char bit_count;    // 6. Глубина цвета (1 байт) - глубина постоянная 24 байта
 unsigned long img_width;    // 7. Ширина изображения (4 байта)
 long long file_size;        // 8. Размер файла в байтах (8 байт)
 long long raster_size;      // 9. Размер растра в байтах (8 байт)
 long raster_offset;         // 10. Смещение растровых данных (4 байта)
};
//---------------------------------------------------------------------------------
struct pixel_t
 {
    char blue,green,red;
 };
//---------------------------------------------------------------------------------
void ShowMyInfo(TStrings* SL,MyFILEHEADER my_header)
{
    SL->Clear();
    SL->Add("type= "+String(my_header.type) );
    SL->Add("author= "+String(my_header.author) );
    SL->Add("progname= "+String(my_header.prog_name) );
    SL->Add("img_width= "+String(my_header.img_width) );
    //...
    SL->Add("header_size= "+String(my_header.header_size) );
}
//---------------------------------------------------------------------------------
void ShowBmpInfo(TStrings* SL,BITMAPFILEHEADER bmp_header,BITMAPINFOHEADER bmp_map)
{
    SL->Clear();
    SL->Add("bfType= "+String(bmp_header.bfType) );
    SL->Add("bfSize= "+String(bmp_header.bfSize) );
    SL->Add("bfReserved1= "+String(bmp_header.bfReserved1) );
    SL->Add("bfReserved2= "+String(bmp_header.bfReserved2) );
    SL->Add("bfOffBits= "+String(bmp_header.bfOffBits) );
 
    SL->Add("");
    SL->Add("biSize= "+String(bmp_map.biSize) );
    SL->Add("biWidth= "+String(bmp_map.biWidth) );
    SL->Add("biHeight= "+String(bmp_map.biHeight) );
    SL->Add("biPlanes= "+String(bmp_map.biPlanes) );
    SL->Add("biBitCount= "+String(bmp_map.biBitCount) );
    SL->Add("biCompression= "+String(bmp_map.biCompression) );
    SL->Add("biSizeImage= "+String(bmp_map.biSizeImage) );
    SL->Add("biXPelsPerMeter= "+String(bmp_map.biXPelsPerMeter) );
    SL->Add("biYPelsPerMeter= "+String(bmp_map.biYPelsPerMeter) );
    SL->Add("biClrUsed= "+String(bmp_map.biClrUsed) );
    SL->Add("biClrImportant= "+String(bmp_map.biClrImportant) );
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ifstream ifs("1.bmp",ios::binary);
ofstream ofs("2.mybmp",ios::binary);
 
Memo1->Clear();
Memo2->Clear();
 
BITMAPFILEHEADER bmp_header;
BITMAPINFOHEADER bmp_map;
MyFILEHEADER     my_header;
 
 
if( ifs && ofs)
 {
    ifs.read( (char*)&bmp_header, sizeof(bmp_header) );
    ifs.read( (char*)&bmp_map,    sizeof(bmp_map) );
 
    my_header.type= 1;
    strcpy(my_header.author,"Avazart");
    strcpy(my_header.prog_name,"My Prog");
    my_header.header_size= sizeof(MyFILEHEADER);
    my_header.bit_count= bmp_map.biBitCount;
    my_header.img_width= bmp_map.biWidth;
    my_header.file_size= bmp_map.biSize;
    my_header.img_size=  bmp_map.biSizeImage;
    my_header.raster_offset= sizeof(MyFILEHEADER);
    my_header.raster_size= bmp_map.biSizeImage;
 
    ofs.write( (char*)&my_header,sizeof(MyFILEHEADER) );
 
    pixel_t pixel;
 
    while( ifs.read( (char*)&pixel, sizeof(pixel_t)) )
     {
         ofs.write( (char*)&pixel, sizeof(pixel_t)) ;
     }
    ShowBmpInfo(Memo1->Lines,bmp_header,bmp_map);
 }
}
0
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 8
12.01.2016, 17:39
У кого есть код целиком? у меня такое же задание.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2016, 17:39
Помогаю со студенческими работами здесь

Конвертация из bmp в png
Всем здравствуйте.:senor: Возник вопрос по поводу использования библиотек gdiplus.h. В MSDN есть готовый код который позволяет...

Конвертация bmp изображения в матрицу
StreamWriter steamWriter = new StreamWriter(&quot;c:\1.txt&quot;); for (int y = 0; y &lt; bmp.Height; y++) { for (int x = 0; x &lt;...

Конвертация BMP в массив и обратно
Добрый день. Есть проблема с конвертацией Ч/Б bmp изображения в массив и обратным получением изображения из массива. Код создания...

Конвертация *.BMP в 3 файла *.ТХТ
Народ помогите. Нужен код на VB для конвертации файла формата BMP, ну то бишь изображения, в три файла формата ТХТ - RED.тхт, GREEN.тхт...

Конвертация bmp-файла в jpg
Все привет!!! Как с помощью WinApi файл .bmp преобразовать в файл .jpg?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru