С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Xtir
12 / 12 / 0
Регистрация: 10.07.2010
Сообщений: 130
#1

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

27.02.2011, 10:09. Просмотров 736. Ответов 5
Метки нет (Все метки)

Добрый день
на этот раз передо мной встала вот такая задачка: необходимо разбить картинку на несколько частей и каждую часть сохранить в отдельный файл. С разделением картинки я думаю справлюсь, а вот как вообще сохранять эти пиксели (может даже можно не по пикселям, а как-то сразу?) я хз.
нашёл вот такой код для извлечения пикселей
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;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 10:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сохранение пикселей в графический формат файла (C++):

Сохранение в графический файл - C++
Здравствуйте дорогие друзья! помогите пожалуйста с задачей. У меня написан текст программы в Dev C++ который рисует график некоторой...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Ввод рисунка из файла *.bmp. Подсчет общего числа пикселей в строке,столбце матрицы рисунка... - C++
На языке СИ++ написать программу,Выполняющую следующие операции: Ввод рисунка из файла *.bmp. Подсчет общего числа пикселей в...

Собственный формат файла - C++
Здравствуйте!!! Есть программа, для нее нужна некая БД в виде файла. Как сделать, чтобы этот файл понимала только программа, а в...

Найти формат неизвестного файла - C++
Задача звучит так: &quot;Для файлов нескольких (не менее 3) широко используемых форматов составить базу данных, содержащую статистические...

Перевод тексового файла в бинарный формат - C++
Добрый день! Необходимо открыть текстовый файл, содержание которого не известно, и перезаписать его в новый файл, но данные записывать...

5
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
27.02.2011, 10:38 #2
копирования bmp фала:
Открытие и запись bmp-файла

останется добавить разбиение изображения на части и поменять заголовки записываемых новых файлов.
1
Xtir
12 / 12 / 0
Регистрация: 10.07.2010
Сообщений: 130
27.02.2011, 10:59  [ТС] #3
казалось бы всё так просто, а на деле... )
пример с копированием работает на ура, но вот сохранение отдельных частей до меня никак не доходит Можешь привести хотя бы примерчик как из файла прочитать первые 32 пикселя по горизонтали и вертикали, и сохранить их в файл 32х32?
0
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;
}
1
Xtir
12 / 12 / 0
Регистрация: 10.07.2010
Сообщений: 130
27.02.2011, 11:47  [ТС] #5
спасибо, всё работает, правда завершается с какой-то ошибкой, но это уже не важно )))
0
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
27.02.2011, 11:50 #6
возможно за пределы массива где-то выходит, не отлаживал в рамках вашей задачи).. нп.
0
27.02.2011, 11:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2011, 11:50
Привет! Вот еще темы с ответами:

Как создать свой формат файла на Visual C++ Win32, Или С# формой - C++
Как создать свой формат файла на Visual C++ Win32, Или С# формой, чтоб откривался только єтой прогой и сохранялся этой прогой честно...

Сохранение файла в С++ - C++
Вот прога была написана на Си. И щас переписал на С++ и не знаю ,что делать с сохранеием файла. Помогите исправить ошибку. Сам пишу...

Сохранение Xml файла - C++
Вот есть небольшой класс для создания и редактирования XML файла: class XML_TEMPLATENIK { private: struct CLIENTNIK { ...

Открытие и сохранение файла - C++
Привет всем, подскажыте как открыть файл в С++ без Опен диалога и как збереч его, при етом с файла нужно считать инфу. (Файл в форматие...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.