Форум программистов, компьютерный форум CyberForum.ru

Сохранение пикселей в графический формат файла - C++

Восстановить пароль Регистрация
 
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
27.02.2011, 10:09     Сохранение пикселей в графический формат файла #1
Добрый день
на этот раз передо мной встала вот такая задачка: необходимо разбить картинку на несколько частей и каждую часть сохранить в отдельный файл. С разделением картинки я думаю справлюсь, а вот как вообще сохранять эти пиксели (может даже можно не по пикселям, а как-то сразу?) я хз.
нашёл вот такой код для извлечения пикселей
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
    HBITMAP hbit = (HBITMAP)::LoadImage(NULL,".bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    BITMAP bmp;
 
    ::GetObject(hbit,sizeof(bmp),&bmp);
 
    HDC hdc = 0;
    {
        HWND hwndScreen = 0;
        HDC hdcScreen=::GetDC(hwndScreen);
        hdc=::CreateCompatibleDC(hdcScreen);
        ::ReleaseDC(hwndScreen,hdcScreen);
    }
 
    COLORREF clr;
 
    HBITMAP oldBmp = (HBITMAP)::SelectObject(hdc,hbit);
    {
        int a = 0;
        for(int x = 1; x < bmp.bmWidth-1; x++)
        {
            for(int y = 1; y < bmp.bmHeight-1; y++)
            {
                clr = ::GetPixel(hdc,x,y);
            }
        }
    }
 
    ::SelectObject(hdc,oldBmp);
    ::DeleteDC(hdc);
    hdc = 0;
 
    ::DeleteObject(hbit);
    hbit = 0;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 10:09     Сохранение пикселей в графический формат файла
Посмотрите здесь:

C++ Сохранение в графический файл
C++ Сохранение файла в С++
Открытие и сохранение файла C++
Сохранение файла в нужную папку C++
Собственный формат файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
27.02.2011, 10:38     Сохранение пикселей в графический формат файла #2
копирования bmp фала:
Открытие и запись bmp-файла

останется добавить разбиение изображения на части и поменять заголовки записываемых новых файлов.
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
27.02.2011, 10:59  [ТС]     Сохранение пикселей в графический формат файла #3
казалось бы всё так просто, а на деле... )
пример с копированием работает на ура, но вот сохранение отдельных частей до меня никак не доходит Можешь привести хотя бы примерчик как из файла прочитать первые 32 пикселя по горизонтали и вертикали, и сохранить их в файл 32х32?
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
27.02.2011, 11:23     Сохранение пикселей в графический формат файла #4
в примере практически нет обработок ошибок - служит только для того, чтобы показать принцип работы. Также в примере есть структура RGB - в то время, когда я разбирался с bmp форматом, не знал про стандартную структуру RGBTRIPLE, поэтому пришлось нагородить чуть-чуть)).
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
#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "windows.h"
#include "math.h"
using namespace std;
 
struct RGB {
    int B;
    int G;
    int R;
};
 
BYTE CreateBMP(LPTSTR lpFileName, WORD BMPWidth, WORD BMPHeight, RGB **lpData);
 
int main(int argc, char* argv[])
{
 
 
    char file[] = "test.bmp";
    FILE * f_in;  
    BITMAPFILEHEADER bmFileHdr;  
    BITMAPINFO bmInfo;  
     
    // open file to read  
    if ((f_in = fopen(file, "rb")) == NULL)   
        cout<<"Error opening file "<<file<<endl;  
    
    // read BITMAPFILEHEADER  
    fread((char *)&bmFileHdr, sizeof(BITMAPFILEHEADER), 1, f_in);  
    fread((char *)&bmInfo, sizeof(BITMAPINFO), 1, f_in);  
    fseek(f_in, bmFileHdr.bfOffBits, SEEK_SET); // set the pointer to start reading the bmp data  
    
    RGB **pixel = new RGB*[bmInfo.bmiHeader.biHeight];
    for(int i = 0; i < bmInfo.bmiHeader.biHeight; ++i) {
        pixel[i] = new RGB[bmInfo.bmiHeader.biWidth];
    }
    size_t padding = 0;
    if ((bmInfo.bmiHeader.biWidth * 3) % 4) padding = 4 - (bmInfo.bmiHeader.biWidth * 3) % 4;
 
    for(int i = 0; i < bmInfo.bmiHeader.biHeight; i++) {  
        for(int j = 0; j < bmInfo.bmiHeader.biWidth; j++) {   
            pixel[i][j].B = fgetc(f_in);   
            pixel[i][j].G = fgetc(f_in);   
            pixel[i][j].R = fgetc(f_in);   
        }   
        
        for (size_t t = 0; t < padding; ++t) {
            fgetc(f_in);
        }
 
    }  
    
    RGB **newpixel = new RGB*[32];
    for(int i = 0; i < 32; ++i) {
        newpixel[i] = new RGB[32];
    }
    
    for(int i = 0; i < 32; ++i) {
        for(int j = 0; j < 32; ++j) {
            newpixel[i][j] = pixel[i][j];
        }
    }
 
 
    BYTE f = CreateBMP(_T("temp.bmp"), 32, 32, newpixel);
    
    for(size_t i = 0; i < bmInfo.bmiHeader.biHeight; i++)
        delete []pixel[i];
    delete []pixel;
 
    for(size_t i = 0; i < 32; i++)
        delete []newpixel[i];
    delete []newpixel;
 
    return 0;
}
 
 
 
BYTE CreateBMP(LPTSTR lpFileName, WORD BMPWidth, WORD BMPHeight, RGB **lpData)
{
   LPBYTE            lpBits;        // Указатель на данные BMP
   HANDLE            hOutFile;      // Хендл файла
   PBITMAPINFOHEADER lpMyBMPInfo;   // Информационная структура BMP
   PBITMAPFILEHEADER lpMyFileInfo;  // Структура инфы файла BMP
   DWORD             dwTmp; 
 
   BYTE              bOver;         // Дополнение до 4 байтной границы
   DWORD             dwDataSize;    // Общий рамер данных BMP (с выравниванием)
 
   if ((BMPWidth*3)%4) bOver = 4 - (BMPWidth*3)%4;
   else bOver = 0;
 
   dwDataSize = BMPHeight*(BMPWidth*3 + bOver);
 
   lpBits = new BYTE[dwDataSize];   
 
   DWORD inum = 0;
   for (DWORD iy = 0; iy < BMPHeight; iy++)
   {
      for (DWORD ix = 0; ix < BMPWidth; ix++)
      {
         // R
         lpBits[inum] = lpData[iy][ix].B;
         inum++;
         // G
         lpBits[inum] = lpData[iy][ix].G;
         inum++;
         // B
         lpBits[inum] = lpData[iy][ix].R;
         inum++;
 
      }      
 
      for (BYTE i = 0; i < bOver; i++)
      {
         lpBits[inum] = 0;
         inum++;
      }
   }
 
   lpMyBMPInfo = new BITMAPINFOHEADER;
 
   lpMyBMPInfo->biSize   = sizeof(BITMAPINFOHEADER);
   lpMyBMPInfo->biHeight = BMPHeight; 
   lpMyBMPInfo->biWidth  = BMPWidth; 
   lpMyBMPInfo->biPlanes = 1;
   lpMyBMPInfo->biBitCount = 24;
   lpMyBMPInfo->biCompression = BI_RGB;
   lpMyBMPInfo->biSizeImage = 0;
   lpMyBMPInfo->biClrImportant = 0;
   lpMyBMPInfo->biClrUsed = 0;
 
   lpMyFileInfo = new BITMAPFILEHEADER;
   
   lpMyFileInfo->bfType = 0x4d42;
   lpMyFileInfo->bfReserved1 = 0;
   lpMyFileInfo->bfReserved2 = 0;   
   lpMyFileInfo->bfOffBits = (DWORD) sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
   lpMyFileInfo->bfSize = (DWORD) (dwDataSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
  
   hOutFile = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE, 
                         (DWORD) 0, NULL, CREATE_ALWAYS, 
                         FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); 
   
   if (hOutFile == INVALID_HANDLE_VALUE) return 0; 
   
   WriteFile(hOutFile, (LPVOID) lpMyFileInfo, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL);
 
   WriteFile(hOutFile, (LPVOID) lpMyBMPInfo, sizeof(BITMAPINFOHEADER), (LPDWORD) &dwTmp, NULL);
 
   WriteFile(hOutFile, (LPVOID) lpBits, dwDataSize, (LPDWORD) &dwTmp, NULL);
 
   CloseHandle(hOutFile);
   
   delete[] lpBits;
   delete lpMyFileInfo;
   delete lpMyBMPInfo;
 
   return 1;
}
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
27.02.2011, 11:47  [ТС]     Сохранение пикселей в графический формат файла #5
спасибо, всё работает, правда завершается с какой-то ошибкой, но это уже не важно )))
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
27.02.2011, 11:50     Сохранение пикселей в графический формат файла #6
возможно за пределы массива где-то выходит, не отлаживал в рамках вашей задачи).. нп.
Yandex
Объявления
27.02.2011, 11:50     Сохранение пикселей в графический формат файла
Ответ Создать тему
Опции темы

Текущее время: 08:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru