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

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

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

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

27.02.2011, 10:09. Просмотров 718. Ответов 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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 10:09     Сохранение пикселей в графический формат файла
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
спасибо, всё работает, правда завершается с какой-то ошибкой, но это уже не важно )))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2011, 11:50     Сохранение пикселей в графический формат файла
Еще ссылки по теме:

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

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

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

Чтение и сохранение JPEG файла - C++
Как прочитать файл формата .jpg, а потом обработанное(уже мной!) сохранить???

сохранение и обработка файла HTML - C++
хочу сделать программу которая будет сохранять страницу HTML файлом а потом откроет ее в текстовом файле и проанализирует исходный код. ...

Изменение и сохранение текстового файла - C++
Дан текстовый файл, содержащий 100 строк. Программа запрашивает у пользователя, что необходимо сделать: a) удалить каждую четную строку ...


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

Или воспользуйтесь поиском по форуму:
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
27.02.2011, 11:50     Сохранение пикселей в графический формат файла #6
возможно за пределы массива где-то выходит, не отлаживал в рамках вашей задачи).. нп.
Yandex
Объявления
27.02.2011, 11:50     Сохранение пикселей в графический формат файла
Ответ Создать тему
Опции темы

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