1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65

Работа с BMP файлом

18.06.2014, 08:59. Показов 4328. Ответов 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
public:      int *loadBMP( const char *fname, int &mx, int &my )
{ int *v;
   mx = my = -1;
    FILE *f = fopen( fname, "rb" );
    if( !f ) return NULL;
    BMPheader bh;    // File header sizeof(BMPheader) = 56
    size_t res;
 
    // читаем заголовок
    res = fread( &bh, 1, sizeof(BMPheader), f );
    if( res != sizeof(BMPheader) ) { fclose(f); return NULL; }
 
    // проверяем сигнатуру
    if( bh.bfType!=0x4d42 && bh.bfType!=0x4349 && bh.bfType!=0x5450 ) { fclose(f); return NULL; }
 
    // проверка размера файла
    fseek( f, 0, SEEK_END);
    int filesize = ftell(f);
    // восстановим указатель в файле:
    fseek( f, sizeof(BMPheader), SEEK_SET);
    // проверим условия
    if( bh.bfSize != filesize ||
        bh.bfReserved != 0    ||
        bh.biPlanes   != 1    ||
       (bh.biSize!=40 && bh.biSize!=108 && bh.biSize!=124)||
        bh.bfOffBits != 14+bh.biSize ||
 
        bh.biWidth <1 || bh.biWidth >10000 ||
        bh.biHeight<1 || bh.biHeight>10000 ||
        bh.biBitCount    != 24 ||             // пока рассматриваем только полноцветные изображения
        bh.biCompression !=  0                // пока рассматриваем только несжатие изображения
        ) 
    { 
            fclose(f); 
            return NULL; 
    }
    // Заголовок прочитан и проверен, тип - верный (BGR-24), размеры (mx,my) найдены
     mx = bh.biWidth;
     my = bh.biHeight;
    int mx3 = (3*mx+3) & (-4);    // Compute row width in file, including padding to 4-byte boundary
    unsigned char *tmp_buf = new unsigned  char[mx3*my];    // читаем данные
    res = fread( tmp_buf, 1, mx3*my, f);
    if( (int)res != mx3*my ) { delete []tmp_buf; fclose(f); return NULL; }
    // данные прочитаны
    fclose(f); 
 
    // выделим память для результата
  v = new int[mx*my];
 
    // Перенос данных (не забудем про BGR->RGB)
    unsigned char *ptr = (unsigned char *) v;
    for(int y = my-1; y >= 0; y--) {
        unsigned char *pRow = tmp_buf + mx3*y;
        for(int x=0; x< mx; x++) {
            *ptr++ = *(pRow + 2);
            *ptr++ = *(pRow + 1);
            *ptr++ = *pRow; 
            pRow+=3;
            ptr ++;
        }
    }
    delete []tmp_buf;
    return v;    // OK
}

запись файл
Кликните здесь для просмотра всего текста
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
public:   int  saveBMP( const char *fname, int *v, int mx, int my ) // В каждом элементе упаковано все три RGB-байта
{
    BMPheader bh;   // Заголовок файла, sizeof(BMPheader) = 56
    memset( &bh, 0, sizeof(bh) );
    bh.bfType =0x4d42;  // 'BM'
    // Найдем длину строки в файле, включая округление вверх до кратного 4:
    int mx3 = (3*mx+3) & (-4);
    int filesize = 54 + my*mx3;
    bh.bfSize = filesize;
    bh.bfReserved =  0;
    bh.biPlanes   =  1;
    bh.biSize     = 40;
    bh.bfOffBits  = 14 + bh.biSize;
    bh.biWidth    = mx;
    bh.biHeight   = my;
    bh.biBitCount = 24;
    bh.biCompression= 0;
 
    FILE *f = fopen( fname, "wb" );
    if( !f ) return -1;
    size_t res;
 
    // пишем заголовок
    res = fwrite( &bh, 1, sizeof(BMPheader), f );
    if( res != sizeof(BMPheader) ) { fclose(f); return -1; }
 
    // приготовим временный буфер
    unsigned char *tmp_buf = new unsigned char[mx3*my];
    // Перенос данных (не забудем про RGB->BGR)
    unsigned char *ptr = (unsigned char *) v;
    for(int y = my-1; y >= 0; y--) {
        unsigned char *pRow = tmp_buf + mx3*y;
        for(int x=0; x< mx; x++) {
            *(pRow + 2) = *ptr++;
            *(pRow + 1) = *ptr++;
            *pRow       = *ptr++; 
            pRow+=3;
            ptr++;
        }
    }
    // сбросим в файл
    fwrite( tmp_buf, 1, mx3*my, f );
    fclose(f);
    delete []tmp_buf;
    return 0;   // OK
}

вызов функций
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        int mx, my;                              // для размеров изображения
    int *v = loadBMP("picture.bmp", mx, my); // выделяем память и читаем туда файл
    //System::Windows::Forms::MessageBox::Show("Load ok");
    
 //   pictureBox1->Image=Image::FromFile("picture.bmp");
    delete [] v; 
             }
        
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
                
                int* v=new int;
             char t1[] ="picture.bmp";
     int  mx=Matrix_mx(t1);
    int   my=Matrix_my(t1);
            
           // для размеров изображения
           if   (saveBMP(t1,  v ,   mx, my)   ==0)    MessageBox::Show("Saved ok") ; else MessageBox::Show("ERROR");
             delete  v; 
         }


по идее с массива должен записываться тот же файл, но создается пустой файл bmp(только заголовок файла)
1)В чем проблема? где я чтото не так делаю?
2)как лучше использовать етот массив для обработки битов цветов
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.06.2014, 08:59
Ответы с готовыми решениями:

Работа с BMP файлом
Доброго всем дня. Мне нужно сделать приложение которое будет работать с BMP рисунком. То есть суть программки приблизительно такая: 1....

Работа с BMP файлом.
Помогите, с чего начать? Требуется написать программу, которая открывает файл bmp и заменяет в нём каждый 10 байт на байты из текстового...

Простейшая работа с BMP-файлом
Добрый день! Только начал работать с Python, версия 3.4,разбираюсь. Пробую для начала окрасить пиксель в bmp-файле, но возникают проблемы...

34
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
18.06.2014, 18:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от voldkost Посмотреть сообщение
нет ну конечно спасибо за проделанное)) но результат тотже))
тот же - это какой? Отлаживайте, этот код точно копирует 24 битный bmp. Остается два варианта - либо файл не открывается, либо он не 24 бита. Укажите имя файла с полным путем - что-нибудь вроде "D:\\3938181443.bmp". Можете приложить файл, я на него посмотрю.
0
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65
18.06.2014, 18:15  [ТС]
тот же
такой же пустой файл на выходе)))
Вложения
Тип файла: rar picture.rar (212 байт, 3 просмотров)
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
18.06.2014, 18:31
Цитата Сообщение от voldkost Посмотреть сообщение
такой же пустой файл на выходе)))
Нормальный файл, нормально копируется. Проверьте чтение.

C++
1
2
3
4
5
6
7
8
9
10
11
   private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
            {
               if(loadBMP( "D:\\picture.bmp" ))
               {
                  System::Windows::Forms::MessageBox::Show("Load ok");
               }
               else
               {
                  System::Windows::Forms::MessageBox::Show("Load failed");
               }
            }
1
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65
18.06.2014, 18:35  [ТС]
"Load failed"
не понимаю почему..



C++
1
2
warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          D:\Program files\visual studio\VC\include\stdio.h(234): см. объявление "fopen"
ето может влиять?
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
18.06.2014, 18:42
Цитата Сообщение от voldkost Посмотреть сообщение
ето может влиять?
Нет. Вариант один - имя файла задается неверно.
0
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65
18.06.2014, 18:46  [ТС]
но как можно задать имя файла неверно?......но ведь и адрес полный прописываю и в текущей папке файл размещаю.....
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
18.06.2014, 18:52
Цитата Сообщение от voldkost Посмотреть сообщение
но как можно задать имя файла неверно?
Да масса вариантов . Скопируйте в корень дика C: имена файлов задайте для load "C:\\picture.bmp" для save "C:\\picture_copy.bmp"
0
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65
18.06.2014, 18:58  [ТС]
ну я не знаю все возможные варианты наверно перепробовал))))


у вас работает? ))
можете кинуть архивом? ))
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
18.06.2014, 19:15
Ну еще одна попытка.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
            {
               OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
 
               openFileDialog1->InitialDirectory = "c:\\";
               openFileDialog1->Filter = "bmp files (*.bmp)|*.bmp";
               openFileDialog1->FilterIndex = 1;
               openFileDialog1->RestoreDirectory = true;
               if ( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
               {
                  char* f_name = (char*)(void*)Marshal::StringToHGlobalAnsi(openFileDialog1->FileName);
                  if(loadBMP( f_name ))
                  {
                     System::Windows::Forms::MessageBox::Show("Load ok");
                  }
                  else
                  {
                     System::Windows::Forms::MessageBox::Show("Load failed");
                  }
                  Marshal::FreeHGlobal(IntPtr(f_name));
               }
            }
0
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65
18.06.2014, 19:18  [ТС]
C++
1
2
3
4
>e:\навчання\флешка\дп\новая папка (2)\1.5\1.5\Form1.h(247): error C2653: Marshal: не является именем класса или пространства имен
1>e:\навчання\флешка\дп\новая папка (2)\1.5\1.5\Form1.h(247): error C3861: StringToHGlobalAnsi: идентификатор не найден
1>e:\навчання\флешка\дп\новая папка (2)\1.5\1.5\Form1.h(256): error C2653: Marshal: не является именем класса или пространства имен
1>e:\навчання\флешка\дп\новая папка (2)\1.5\1.5\Form1.h(256): error C3861: FreeHGlobal: идентификатор не найден
вот я не знаю что)
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
18.06.2014, 19:21
C++
1
using namespace System::Runtime::InteropServices;
1
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65
19.06.2014, 16:16  [ТС]
диалоговое окно открывает и Load failed

Добавлено через 12 часов 16 минут
так и негрузит((( я даже не знаю, все варианты перепробовал.....

Добавлено через 8 часов 35 минут
uglyPinokkio, можете архивом проект кинуть? если он у вас работает....

а и еще одно при вызове функции загрузки надо указывать массив, так как надо работать (сравнивать) сразу 2 массива битов. Подскажите как? Вариант который вы написали я так понял работает ток для обработки 1 файла..
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
19.06.2014, 20:04
У меня работает. Весь код ниже. Добавил обработку ошибок чтения. Скопируй файл в корень диска С: и попробуй открыть.

Про массив битов не понял. Этот код читает растр в массив байт. С чем его сравнивать - я без понятия.

Для человека, задающего таки вопросы, эта задача слишком сложная, начни с изучения языка, желательно одного, потому что этот код использует два.


Кликните здесь для просмотра всего текста
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
#pragma once
 
#include <stdio.h>
#include <memory.h>
 
#pragma pack(push,1) 
typedef struct {
   unsigned __int16   bfType;         // 0x4d42 | 0x4349 | 0x5450
   int                bfSize;         // размер файла
   int                bfReserved;     // 0
   int                bfOffBits;      // смещение до поля данных,
   // обычно 54 = 16 + biSize
   int                biSize;         // размер струкуры в байтах:
   // 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER)
   // или 124(BITMAPV5HEADER)
   int                biWidth;        // ширина в точках
   int                biHeight;       // высота в точках
   unsigned __int16   biPlanes;       // всегда должно быть 1
   unsigned __int16   biBitCount;     // 0 | 1 | 4 | 8 | 16 | 24 | 32
   int                biCompression;  // BI_RGB | BI_RLE8 | BI_RLE4 |
   // BI_BITFIELDS | BI_JPEG | BI_PNG
   // реально используется лишь BI_RGB
   int                biSizeImage;    // Количество байт в поле данных
   // Обычно устанавливается в 0
   int                biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм
   int                biYPelsPerMeter;// вертикальное разрешение, точек на дюйм
   int                biClrUsed;      // Количество используемых цветов
   // (если есть таблица цветов)
   int                biClrImportant; // Количество существенных цветов.
   // Можно считать, просто 0
} BMPheader; 
#pragma pack(pop) 
 
namespace test {
 
   using namespace System;
   using namespace System::ComponentModel;
   using namespace System::Collections;
   using namespace System::Windows::Forms;
   using namespace System::Data;
   using namespace System::Drawing;
   using namespace System::Runtime::InteropServices;
   /// <summary>
   /// Summary for Form1
   /// </summary>
   public ref class Form1 : public System::Windows::Forms::Form
   {
   public:
      Form1(void)
      {
         v=0;
         mx=0;
         my=0;
         InitializeComponent();
         //
         //TODO: Add the constructor code here
         //
      }
 
   public: int *loadBMP(const char *fname)
           { 
              String^ file_name= gcnew String(fname);  
              if(v)
              {
                 delete []v;
                 v = 0;
              }
              mx = my = 0;
 
              FILE *f = fopen( fname, "rb" );
              if( !f )
              {
                 System::Windows::Forms::MessageBox::Show("Can't open file:"+file_name);
                 return NULL;
              }
              BMPheader bh;    // File header sizeof(BMPheader) = 56
              size_t res;
 
              // читаем заголовок
              res = fread( &bh, 1, sizeof(BMPheader), f );
              if( res != sizeof(BMPheader) ) 
              { 
                 System::Windows::Forms::MessageBox::Show("File read error:"+file_name);
                 fclose(f); 
                 return NULL; 
              }
 
              // проверяем сигнатуру
              if( bh.bfType!=0x4d42 && bh.bfType!=0x4349 && bh.bfType!=0x5450 ) 
              { 
                 System::Windows::Forms::MessageBox::Show("File format error:"+file_name);
                 fclose(f); 
                 return NULL; 
              }
 
              // проверка размера файла
              fseek( f, 0, SEEK_END);
              int filesize = ftell(f);
              // восстановим указатель в файле:
              fseek( f, sizeof(BMPheader), SEEK_SET);
              // проверим условия
              if( bh.bfSize != filesize ||
                 bh.bfReserved != 0    ||
                 bh.biPlanes   != 1    ||
                 (bh.biSize!=40 && bh.biSize!=108 && bh.biSize!=124)||
                 bh.bfOffBits != 14+bh.biSize ||
 
                 bh.biWidth <1 || bh.biWidth >10000 ||
                 bh.biHeight<1 || bh.biHeight>10000 ||
                 bh.biBitCount    != 24 ||             // пока рассматриваем только полноцветные изображения
                 bh.biCompression !=  0                // пока рассматриваем только несжатие изображения
                 ) 
              { 
                 fclose(f); 
                 return NULL; 
              }
              // Заголовок прочитан и проверен, тип - верный (BGR-24), размеры (mx,my) найдены
              mx = bh.biWidth;
              my = bh.biHeight;
              int mx3 = (3*mx+3) & (-4);    // Compute row width in file, including padding to 4-byte boundary
              unsigned char *tmp_buf = new unsigned  char[mx3*my];    // читаем данные
              res = fread( tmp_buf, 1, mx3*my, f);
              if( (int)res != mx3*my ) { delete []tmp_buf; fclose(f); return NULL; }
              // данные прочитаны
              fclose(f); 
 
              // выделим память для результата
              v = new int[mx*my];
 
              // Перенос данных (не забудем про BGR->RGB)
              unsigned char *ptr = (unsigned char *) v;
              for(int y = my-1; y >= 0; y--) {
                 unsigned char *pRow = tmp_buf + mx3*y;
                 for(int x=0; x< mx; x++) {
                    *ptr++ = *(pRow + 2);
                    *ptr++ = *(pRow + 1);
                    *ptr++ = *pRow; 
                    pRow+=3;
                    ptr ++;
                 }
              }
              delete []tmp_buf;
              return v;    // OK
           }
   public: int saveBMP( const char *fname) // В каждом элементе упаковано все три RGB-байта
           {
              BMPheader bh;   // Заголовок файла, sizeof(BMPheader) = 56
              memset( &bh, 0, sizeof(bh) );
              bh.bfType =0x4d42;  // 'BM'
              // Найдем длину строки в файле, включая округление вверх до кратного 4:
              int mx3 = (3*mx+3) & (-4);
              int filesize = 54 + my*mx3;
              bh.bfSize = filesize;
              bh.bfReserved =  0;
              bh.biPlanes   =  1;
              bh.biSize     = 40;
              bh.bfOffBits  = 14 + bh.biSize;
              bh.biWidth    = mx;
              bh.biHeight   = my;
              bh.biBitCount = 24;
              bh.biCompression= 0;
 
              FILE *f = fopen( fname, "wb" );
              if( !f ) return -1;
              size_t res;
 
              // пишем заголовок
              res = fwrite( &bh, 1, sizeof(BMPheader), f );
              if( res != sizeof(BMPheader) ) { fclose(f); return -1; }
 
              // приготовим временный буфер
              unsigned char *tmp_buf = new unsigned char[mx3*my];
              // Перенос данных (не забудем про RGB->BGR)
              unsigned char *ptr = (unsigned char *) v;
              for(int y = my-1; y >= 0; y--) {
                 unsigned char *pRow = tmp_buf + mx3*y;
                 for(int x=0; x< mx; x++) {
                    *(pRow + 2) = *ptr++;
                    *(pRow + 1) = *ptr++;
                    *pRow       = *ptr++; 
                    pRow+=3;
                    ptr++;
                 }
              }
              // сбросим в файл
              fwrite( tmp_buf, 1, mx3*my, f );
              fclose(f);
              delete []tmp_buf;
              return 0;   // OK
           }
   protected:
      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      ~Form1()
      {
         if (components)
         {
            delete components;
         }
      }
   private: System::Windows::Forms::Button^  button1;
   protected: 
   private: System::Windows::Forms::Button^  button2;
 
   private:
      int* v;
      int mx;
      int my;
      /// <summary>
      /// Required designer variable.
      /// </summary>
      System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      void InitializeComponent(void)
      {
         this->button1 = (gcnew System::Windows::Forms::Button());
         this->button2 = (gcnew System::Windows::Forms::Button());
         this->SuspendLayout();
         // 
         // button1
         // 
         this->button1->Location = System::Drawing::Point(615, 476);
         this->button1->Name = L"button1";
         this->button1->Size = System::Drawing::Size(75, 23);
         this->button1->TabIndex = 0;
         this->button1->Text = L"button1";
         this->button1->UseVisualStyleBackColor = true;
         this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
         // 
         // button2
         // 
         this->button2->Location = System::Drawing::Point(696, 476);
         this->button2->Name = L"button2";
         this->button2->Size = System::Drawing::Size(75, 23);
         this->button2->TabIndex = 1;
         this->button2->Text = L"button2";
         this->button2->UseVisualStyleBackColor = true;
         this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
         // 
         // Form1
         // 
         this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
         this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
         this->ClientSize = System::Drawing::Size(838, 511);
         this->Controls->Add(this->button2);
         this->Controls->Add(this->button1);
         this->Name = L"Form1";
         this->Text = L"Form1";
         this->ResumeLayout(false);
 
      }
#pragma endregion
   private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
            {
               OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
 
               openFileDialog1->InitialDirectory = "c:\\";
               openFileDialog1->Filter = "bmp files (*.bmp)|*.bmp";
               openFileDialog1->FilterIndex = 1;
               openFileDialog1->RestoreDirectory = true;
               if ( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
               {
                  String^ sf_name = openFileDialog1->FileName;
                  char* f_name = (char*)(void*)Marshal::StringToHGlobalAnsi(sf_name);
                  if(loadBMP( f_name ))
                  {
                     System::Windows::Forms::MessageBox::Show("Load ok");
                  }
                  else
                  {
                     System::Windows::Forms::MessageBox::Show("Load failed");
                  }
                  Marshal::FreeHGlobal(IntPtr(f_name));
               }
            }
   private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
               saveBMP( "C:\\picture_copy.bmp" );
            }
};
}
0
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 65
19.06.2014, 20:35  [ТС]
да спасибо код работает

Добавлено через 20 минут
Возможно я не так выразился..суть задания в том что б интегрировать одно изображение цифровой водяной знак) в другое методом замены байтов(в даном случае вместо синих цветов).
Нужно работать с двумя массивами байт(осуществлять замену если исполняется условие) двух изображений.
Если не програмно то хотя б полезными ссылками прошу помочь..
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.06.2014, 06:27
Цитата Сообщение от voldkost Посмотреть сообщение
суть задания в том что б интегрировать одно изображение цифровой водяной знак)

В самом простом случае - грузишь два изображения одинакового размера и объединяешь их по синему каналу

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   int mx, my;
   int *v = loadBMP("picture.bmp", mx, my); // выделяем память и читаем туда файл   
   int b_mx, b_my;
   int *b_v = loadBMP("picture_2.bmp", b_mx, b_my); // выделяем память и читаем туда файл   
   if((mx==b_mx) && (my==b_my))     
   {
      for(int row=0;row<my;row++)
      {
        unsigned char* v_row =  ((unsigned char*)v)+row*mx*4;
        unsigned char* bv_row =  ((unsigned char*)b_v)+row*mx*4;
        for(int col=0;col<mx;col++)
        {
           int p_b = v_row[col*4+2]|bv_row[col*4+2];
           v_row[col*4+2]= p_b>255?255:p_b;
        }         
      }
   }
   saveBMP("saved.bmp",  v ,   mx, my);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2014, 06:27
Помогаю со студенческими работами здесь

Работа с нетипизированным BMP файлом
Здравствуйте, хотел бы попросить помощи по заданию, так как не понимаю как сделать его через нетипизированный без использования GraphABC. ...

Работа с bmp файлом не получается найти ошибку
Добрый день, знаю что существуют разные способы считывания bmp файла, мне нужно считать таким образом что бы заголовок лежал в одном...

Работа с bmp файлом. Считывание значение пикселей в массив
Здравствуйте. Необходимо написать код который считывает из bmp картинки значение пикселей RGB в массив. Спасибо за внимание!

Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

Приложение, которое работает с bmp Файлом
Пожалуйста помогите!!! Нужно написать программу, которая читает с диска *.bmp файл и выводит его в окно приложения. При помощи потока...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru