powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исходники моей проги. (Может кто какую незуразность заметит)
23 сообщений из 23, страница 1 из 1
Исходники моей проги. (Может кто какую незуразность заметит)
    #33141677
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое всем кто помог.
Она ещё не дописанна малость. Но, думаю, программистам показать можно:)

Код: plaintext
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.
/***************************************************************************
 *   Copyright (C) 2005 by Mihail Konstantinov                             *
 *   023110@rambler.ru                                                     *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>

// секция типов
///////////////////////////////////////////////////////////////////////////////////////////////////

typedef struct bmpFileHeader { // bmfh 
    unsigned short int bfType; //должено содержать две буковки(B и M) 
    unsigned int bfSize;  //Размер файла в байтах
    unsigned short int bfReserved1; //зарезервированно
    unsigned short int bfReserved2; //зарезервированно
    unsigned int bfOffBits; //байтовое смещение до начала изображения (должно быть 54)
} Header_a;

typedef struct bmpInfoHeader{
	unsigned int biSize; //размер заголовка в байтах (должно быть 40)
	unsigned int biWidth; //ширина картинки
	unsigned int biHeight; // высота картинки
	unsigned short int biPlanes; //должно быть 1
	unsigned short int biBitCount; //глубина цвета (должно быть 24)
	unsigned int biCompression;
	unsigned int biSizeImage;
	unsigned int biXPelsPerMeter;
	unsigned int biYPelsPerMeter; 
	unsigned int biClrUsed;
	unsigned int biClrImportant;
} Header_b;

typedef struct bmpHeader{
	Header_a File;
	Header_b Info;
} Header;

typedef struct RGBQuad{
	unsigned char Blue;
	unsigned char Green;
	unsigned char Red;
	unsigned char Reserved;
} RGBQuad;

///////////////////////////////////////////////////////////////////////////////////////////////////

Header inputFileHeader;
RGBQuad inputPixel;

char inputFileName[ 1024 ], outTextFileName[ 1024 ], outBmpFileName[ 1024 ];
FILE *inputFile, *outTextFile, *outBmpFile;

///////////////////////////////////////////////////////////////////////////////////////////////////

int main(int argc, char *argv[])
{
	
	
	//секция открытия файлов
	printf("Вас приветствует эта чудная прога.\n");
	if (argc <  2 ){
   	printf("Введите имя файла для обработки.\n Файл должен быть несжатым BMP-файлом и иметь глубину цвета 24 бита\n");
		scanf("%s", inputFileName);
		printf("\nФайл выбран(%s)\n", inputFileName);
		inputFile = fopen(inputFileName, "rb");
	}
	else
		inputFile = fopen(argv[ 1 ], "rb");
	if (argc <  3 ){
   	printf("Введите имя текстового файла для вывода\n");
		scanf("%s", outTextFileName);
		printf("\nФайл выбран(%s)\n", outTextFileName);
		outTextFile = fopen(outTextFileName, "w");
	}
	else
		outTextFile = fopen(argv[ 2 ], "w");
	fprintf(outTextFile, "Выводной текстовый файл.\nПротокол обработки файла %s\n", inputFileName);
	printf("Текстовый файл открыт\n");
	
	outBmpFile = fopen("/home/out.bmp", "wb");
	
	//scanf("%s", inputFileName);
	printf("\nФайл выбран(%s)\n", inputFileName);
	readBmpHeader(inputFileName);
	printf("\nBmpBufer is done\n");
	printf("\nНачало чтения в буфер\n");
	if (readToBufer() !=  0 )
		return  2 ;
	printf("\nЧтение в буфер завершено\n");
	
		
	
	fflush(stdout);
	
	fclose(inputFile);
	fclose(outTextFile);
	fclose(outBmpFile);
	
	return  0 ;
}

int readBmpHeader(char* fileName){
	char buf;
	
	printf("\nНачало функции readBmpHeader\n");
	printf("\nНачало привязки к файлу %s\n", fileName);
	printf("\nНачало привязки к файлу %s\n", fileName);
	//inputFile = fopen(fileName, "rb");
	if (inputFile == NULL){
		printf("\nФайл %s отсутствует, или программа не может получить к нему доступ.\n", fileName);
		return  1 ;
	}
	
	//Здесь программа считывает ту часть заголовка где хранится информация о файле.
	fread(&inputFileHeader.File.bfType,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfSize,  1 ,  4 , inputFile);
	fread(&inputFileHeader.File.bfReserved1,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfReserved2,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfOffBits,  1 ,  4 , inputFile);
	//а здесь о изображении
	fread(&inputFileHeader.Info.biSize,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biWidth,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biHeight,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biPlanes,  1 ,  2 , inputFile);
	fread(&inputFileHeader.Info.biBitCount,  1 ,  2 , inputFile);
	fread(&inputFileHeader.Info.biCompression,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biSizeImage,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biXPelsPerMeter,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biYPelsPerMeter,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biClrUsed,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biClrImportant,  1 ,  4 , inputFile);
	
	printf("\nРазмер файла (по данным из заголовка): %d\n", inputFileHeader.File.bfSize );
	printf("Смещение на растровое изображение: %d\n", inputFileHeader.File.bfOffBits );
	printf("Размер структуры: %d\n", inputFileHeader.Info.biSize );
	printf("Ширина изображения: %d\n", inputFileHeader.Info.biWidth );
	printf("Высота изображения: %d\n", inputFileHeader.Info.biHeight );
	printf("Глубина цвета: %d\n", inputFileHeader.Info.biBitCount );
	printf("Сжатие: %d\n", inputFileHeader.Info.biCompression );
	
	if (inputFileHeader.File.bfOffBits !=  54 ){
		printf("\nФайл не пригоден для обработки.\n");
		printf("\nПрограмма завершит работу.\n");
		printf("\nНажмите любую клавишу.\n");
		scanf("%s", &buf);
		return  2 ;
	}
	
	printf("\nФункция readBmpHeader закончила свою работу. Управление передаётся в основную программу.\n");
	return  0 ;
}

int writeBmpHeader(){
	printf("\nОткрытие выводного BMP-файла.\n");
	fwrite(&inputFileHeader.File.bfType,  1 ,  2 , outBmpFile);
	fwrite(&inputFileHeader.File.bfSize,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.File.bfReserved1,  1 ,  2 , outBmpFile);
	fwrite(&inputFileHeader.File.bfReserved2,  1 ,  2 , outBmpFile);
	fwrite(&inputFileHeader.File.bfOffBits,  1 ,  4 , outBmpFile);
	
	fwrite(&inputFileHeader.Info.biSize,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biWidth,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biHeight,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biPlanes,  1 ,  2 , outBmpFile);
	fwrite(&inputFileHeader.Info.biBitCount,  1 ,  2 , outBmpFile);
	fwrite(&inputFileHeader.Info.biCompression,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biSizeImage,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biXPelsPerMeter,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biYPelsPerMeter,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biClrUsed,  1 ,  4 , outBmpFile);
	fwrite(&inputFileHeader.Info.biClrImportant,  1 ,  4 , outBmpFile);
	
}

int readToBufer(){
	int i;
	int IsBlack =  0 ;
	int j;
	unsigned short int WhereFnd =  1 , prevStolbec =  1 ;
	
	
	
	RGBQuad BlackPixel = { 1 ,  1 ,  255 ,  1 };
	RGBQuad WhitePixel = { 255 ,  255 ,  255 ,  255 };
	
	writeBmpHeader();
	
	printf("\nОткрытие выводного BMP-файла.\n");
	//fwrite(&IsBlack, 1, 4, outBmpFile);
	
	printf("\nЧтение и обработка файла началась.\n");
	for (i =  1 ; i <= inputFileHeader.Info.biWidth; i++){
		IsBlack =  0 ;
		for (j =  1 ; j <= inputFileHeader.Info.biHeight; j++){
			fread(&inputPixel.Blue,  1 ,  1 , inputFile);
			fread(&inputPixel.Green,  1 ,  1 , inputFile);
			fread(&inputPixel.Red,  1 ,  1 , inputFile);
			//printf("%d\n", WhereFnd);
			if (( isPixelGood() !=  0  ) && (IsBlack ==  0 ) && (j < (WhereFnd +  200 )) && (j > (WhereFnd -  200 ))){
				fwrite(&BlackPixel.Blue,  1 ,  1 , outBmpFile);
				fwrite(&BlackPixel.Green,  1 ,  1 , outBmpFile);
				fwrite(&BlackPixel.Red,  1 ,  1 , outBmpFile);
				IsBlack =  1 ;
				if (inputPixel.Blue !=  0 )
					printf("%3d %3d %3d %3.6f %3.6f %3.6f\n",inputPixel.Red, inputPixel.Green, inputPixel.Blue, (float)inputPixel.Red / (float)inputPixel.Blue,  (float)inputPixel.Green / (float)inputPixel.Blue, ((float)inputPixel.Red / (float)inputPixel.Blue) / ((float)inputPixel.Green / (float)inputPixel.Blue));
				if ((j -  300 ) > WhereFnd)
					fprintf(outTextFile, "\n///////////////////////////////////////////\nРазрыв более 300 пикселей\n");
				if ((i -  5 ) > prevStolbec)
					fprintf(outTextFile, "\n\n\n\n\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Разрав по столбцам\n\n\n\n\n");
				fprintf(outTextFile, "%d-%d----------------\n r: %d g: %d b: %d Find: %d\n", i, j, inputPixel.Red, inputPixel.Green, inputPixel.Blue, WhereFnd);
				
				WhereFnd = j;
				prevStolbec = i;
			}
			else{
				fwrite(&WhitePixel.Blue,  1 ,  1 , outBmpFile);
				fwrite(&WhitePixel.Green,  1 ,  1 , outBmpFile);
				fwrite(&WhitePixel.Red,  1 ,  1 , outBmpFile);
			}
		}
		//printf(".");
		fflush(stdout);
	}
	printf("\nЧтение и обработка файла закончилась.\n");
	fclose(outTextFile);
}

int isPixelGood(){
	int i;
	float rgbdiv;
	
	rgbdiv = ((float)inputPixel.Red / (float)inputPixel.Blue) / ((float)inputPixel.Green / (float)inputPixel.Blue);
	//rdiv
	
	i = (inputPixel.Red <  124 ) && (inputPixel.Green <  124 ) && (inputPixel.Blue <  124  ) && (rgbdiv >  0 . 95 ) && (rgbdiv <  1 . 05 );
	
	return i;
}

Заранее благодарю за любые замечания.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33141681
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе все несуразности говорить или только некоторые? :)
Ну замени хотя бы вот этот странный кусок
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	//Здесь программа считывает ту часть заголовка где хранится информация о файле.
	fread(&inputFileHeader.File.bfType,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfSize,  1 ,  4 , inputFile);
	fread(&inputFileHeader.File.bfReserved1,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfReserved2,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfOffBits,  1 ,  4 , inputFile);
	//а здесь о изображении
	fread(&inputFileHeader.Info.biSize,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biWidth,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biHeight,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biPlanes,  1 ,  2 , inputFile);
	fread(&inputFileHeader.Info.biBitCount,  1 ,  2 , inputFile);
	fread(&inputFileHeader.Info.biCompression,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biSizeImage,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biXPelsPerMeter,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biYPelsPerMeter,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biClrUsed,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biClrImportant,  1 ,  4 , inputFile);
На строку:
Код: plaintext
	fread(&inputFileHeader, sizeof(inputFileHeader),  1 , inputFile);
все полегче жить будет :)
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33141682
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результаты выполнение всех fopen, fread, fwrite нужно проверять и предупреждать, что "ну, не смогла я..."

scanf("%s", &buf); в readBmpHeader лучше заменить на getchar();

fread-оф многовато. Для такой небольшой программы это не скажется, но если нужно будет читать большее число раз, то будет солидная потеря производительности. Лучше один раз прочитать все в память, а потом копировать из нее куски в элементы структы с помощью memcpy. Понятно, что сразу читать в структуру нельзя, тк могут быть проблемы с выравниванием элементов в памяти. И вообще ночью спать надо.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33141780
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 White Owl
Эта фишка не проходит. Я уже пробовал. Вот что при выполнении получается:
Код: plaintext
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.
Вас приветствует эта чудная прога.
Введите имя файла для обработки.
 Файл должен быть несжатым BMP-файлом и иметь глубину цвета  24  бита
/home/ 1 

Файл выбран(/home/ 1 )
Введите имя текстового файла для вывода
/home/out5

Файл выбран(/home/out5)
Текстовый файл открыт

Файл выбран(/home/ 1 )

Начало функции readBmpHeader

Начало привязки к файлу /home/ 1 

Начало привязки к файлу /home/ 1 

Размер файла (по данным из заголовка):  18 
Смещение на растровое изображение:  2621440 
Размер структуры:  52428800 
Ширина изображения:  32768000 
Высота изображения:  65536 
Глубина цвета:  0 
Сжатие:  1333919744 

Файл не пригоден для обработки.

Программа завершит работу.

Нажмите любую клавишу.

А должно быть:
Код: plaintext
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.
Вас приветствует эта чудная прога.
Введите имя файла для обработки.
 Файл должен быть несжатым BMP-файлом и иметь глубину цвета  24  бита
/home/ 1 

Файл выбран(/home/ 1 )
Введите имя текстового файла для вывода
/home/out

Файл выбран(/home/out)
Текстовый файл открыт

Файл выбран(/home/ 1 )

Начало функции readBmpHeader

Начало привязки к файлу /home/ 1 

Начало привязки к файлу /home/ 1 

Размер файла (по данным из заголовка):  1200056 
Смещение на растровое изображение:  54 
Размер структуры:  40 
Ширина изображения:  800 
Высота изображения:  500 
Глубина цвета:  24 
Сжатие:  0 

Функция readBmpHeader закончила свою работу. Управление передаётся в основную программу.

BmpBufer is done

Начало чтения в буфер

Открытие выводного BMP-файла.

Открытие выводного BMP-файла.

Чтение и обработка файла началась.
  66    66   101   0 . 653465   0 . 653465   1 . 000000 
 ///
...
///
  51    49    59   0 . 864407   0 . 830508   1 . 040816 
  35    34    41   0 . 853659   0 . 829268   1 . 029412 

Чтение и обработка файла закончилась.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33141947
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin2 White Owl
Эта фишка не проходит. Я уже пробовал. Вот что при выполнении получается:
Код: plaintext
1.
...


Странно, должно быть усе нормально же ...
хмм
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33141970
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JibSkeartСтранно, должно быть усе нормально же ...
хмм

Не будет, если нет выравнивания элементов структуры на границу байта.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33142004
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп JibSkeartСтранно, должно быть усе нормально же ...
хмм

Не будет, если нет выравнивания элементов структуры на границу байта.

А я об этом даже как то и не подумал :)
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33142739
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int isPixelGood(){
	int i;
	float rgbdiv;
	
	rgbdiv = ((float)inputPixel.Red / (float)inputPixel.Blue) / ((float)inputPixel.Green / (float)inputPixel.Blue);
	//rdiv
	
	i = (inputPixel.Red <  124 ) && (inputPixel.Green <  124 ) && (inputPixel.Blue <  124  ) && (rgbdiv >  0 . 95 ) && (rgbdiv <  1 . 05 );
	
	return i;
}

1) Поймать деление на ноль не боишься ?
2) rgbdiv - что это за странный параметр ?
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33142922
mrDOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin
typedef struct RGBQuad{
unsigned char Blue;
unsigned char Green;
unsigned char Red;
unsigned char Reserved;
} RGBQuad;

RGBQuad BlackPixel = {1, 1, 255, 1};
RGBQuad WhitePixel = {255, 255, 255, 255};

Почему черный?? исходя из описания типа вроде как красный и наверна {0, 0, 0, 255};
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144003
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за внимание. Отвечу всем по порядку.
Землекоп
Проверку значений open, fread, fwrite обязательно добавлю. Я об этом сразу задумался. Руки не дошли ещё.

//Не будет, если нет выравнивания элементов структуры на границу байта.
Можно поподробней? Заманчивая мысль убрать столько лишних строк. И на будущее тож важно. А то ведь форматы есть у которых заголовок не 54 байта:)

Tracer
Деление на ноль уже словил. Ошибку исправил.

rgbdiv - фишка интересная. Поскольку график, построенный самописцем, должен быть серый (чёрный в идеале) то я сразу отсекаю "цветные" пиксели. Соотношение r/g/b в сером пикселе должно быть в идеале еденица. Но практике близко к еденице.

mrDOS
Чёрный на самом деле. Просто меня заколебало смотреть на чёрные графики и я решил "разукрасить" отладку:)

{0, 0, 0, 255} уделю особое внимание. В дескрипшене на БМП написанно что канал имеет значение от 1 до 255. Сам удивился. Ведь чёрный - это отсутствие цвета. А четвёртый байт оказался не нужен. Опять таки в дескрипшене я вычитал что четвёртый байт - баласт для оптимизации работы с процом. Однако применив познания в арифметике я понял, что что-то не так. Размер файла не сходится. Потом я напоролся на ошибку в проге (в процессе выполнения). Решил не читать баластный байт. Всё заработало, как и должно было. Отсюда вывод: в БМП, рождённом в шопе байт сей отсутствует. Поскольку шоп стандарту соответствует следует вывод, что байт сей исключён из формата.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144027
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin//Не будет, если нет выравнивания элементов структуры на границу байта.
Можно поподробней? Заманчивая мысль убрать столько лишних строк. И на будущее тож важно. А то ведь форматы есть у которых заголовок не 54 байта:)
Когда объявляешь структуру, компилятор может "оптимизировать" ее - добить слишком короткие элементы структуры до двух/четырех/восьми/шестнадцати байт. По идее это может поднять скорость обращений к памяти.
Управляется ключами компилятору или специальными командами препроцессора. По умолчанию обычно выравнивание равно единице или четырем (зависит от компилятора).
Для gcc это команда компилятора -fpack-struct[=<n>] , или прямо в коде перед объявлением структуры пишешь #pragma pack(n)


Sarin{0, 0, 0, 255} уделю особое внимание. В дескрипшене на БМП написанно что канал имеет значение от 1 до 255. Сам удивился. Ведь чёрный - это отсутствие цвета. А четвёртый байт оказался не нужен. Опять таки в дескрипшене я вычитал что четвёртый байт - баласт для оптимизации работы с процом. Однако применив познания в арифметике я понял, что что-то не так. Размер файла не сходится. Потом я напоролся на ошибку в проге (в процессе выполнения). Решил не читать баластный байт. Всё заработало, как и должно было. Отсюда вывод: в БМП, рождённом в шопе байт сей отсутствует. Поскольку шоп стандарту соответствует следует вывод, что байт сей исключён из формата.
Тебе не кажется, что ты читал кривое описание формата? BMP бывают разных типов. :)
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144032
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКогда объявляешь структуру, компилятор может "оптимизировать" ее - добить слишком короткие элементы структуры до двух/четырех/восьми/шестнадцати байт. По идее это может поднять скорость обращений к памяти.
Управляется ключами компилятору или специальными командами препроцессора. По умолчанию обычно выравнивание равно единице или четырем (зависит от компилятора).
Для gcc это команда компилятора -fpack-struct[=<n>] , или прямо в коде перед объявлением структуры пишешь #pragma pack(n)


Sarin{0, 0, 0, 255} уделю особое внимание. В дескрипшене на БМП написанно что канал имеет значение от 1 до 255. Сам удивился. Ведь чёрный - это отсутствие цвета. А четвёртый байт оказался не нужен. Опять таки в дескрипшене я вычитал что четвёртый байт - баласт для оптимизации работы с процом. Однако применив познания в арифметике я понял, что что-то не так. Размер файла не сходится. Потом я напоролся на ошибку в проге (в процессе выполнения). Решил не читать баластный байт. Всё заработало, как и должно было. Отсюда вывод: в БМП, рождённом в шопе байт сей отсутствует. Поскольку шоп стандарту соответствует следует вывод, что байт сей исключён из формата.
Тебе не кажется, что ты читал кривое описание формата? BMP бывают разных типов. :)
Если я что-то в чём-то понимаю, то int - это 4 байта, а short int 2. Соответственно структура, содержащая два поля типа вот:
Код: plaintext
1.
2.
{int i;
short int j;}

должна быть длинной 6 байтов. Что будет если её выравнять?

#pragma pack(n)
Буква n что значит?

Насчёт кривого описания - оч может быть. А бмп у меня 24ёх битный.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144036
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin
Буква n что значит?

Извини. Читал не внимательно.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144039
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
fread(&inputFileHeader, sizeof(inputFileHeader),  1 , inputFile);
Получилось:)
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144040
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinЕсли я что-то в чём-то понимаю, то int - это 4 байта, а short int 2.
Нет! :) Это зависит от того какой размер слова задан компилятору. Это может быть и 4/2, и 2/2, и 8/4, и 8/2. Единственное что можно сказать с уверенностью - short int не больше чем int, а int не больше чем long. Сколько байт они будут занимать в действительности зависит от того какой размер слова у целевого процессора с точки зрения компилятора. Хм... хорошо сказал... главное что верно :)
Большинство современных компиляторов имеют типы данных int8, int16 и так далее. Вот у них размер в битах будет точным вне зависимости от платформы. А простой int - может быть каким угодно.

Sarin
Соответственно структура, содержащая два поля типа вот:
Код: plaintext
1.
2.
{int i;
short int j;}

должна быть длинной 6 байтов. Что будет если её выравнять?
А ты попробуй :) Вот возьми и запусти такую программку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include <stdio.h>

#pragma pack( 1 )
struct s1 {int i; short int j;};

#pragma pack( 2 )
struct s2 {int i; short int j;};

#pragma pack( 4 )
struct s4 {int i; short int j;};

#pragma pack( 8 )
struct s8 {int i; short int j;};

#pragma pack( 16 )
struct s16 {int i; short int j;};

void main() {
   printf("int=%d  short int=%d\n", sizeof(int), sizeof(short int));
   printf("s1=%d\n", sizeof(struct s1));
   printf("s2=%d\n", sizeof(struct s2));
   printf("s4=%d\n", sizeof(struct s4));
   printf("s8=%d\n", sizeof(struct s8));
   printf("s16=%d\n", sizeof(struct s16));
}

SarinНасчёт кривого описания - оч может быть. А бмп у меня 24ёх битный.
Ну а как ты думаешь, почему он называется 24-х битным? Откуда взялась эта цифра в названии? А?
Одна точка описывается тремя восьмибитными байтами, один байт доля красного, один байт доля зеленого и один для доли синего цвета. 3*8 = получили 24. Просто и легко. Откуда в 24-х битном BMP возьмется четвертый байт? Нафига он там нужен? :)
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144160
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взял я это из дескрипшена. Там написанно было, что хоть байт этот и не используется никак! он введён для оптимизации работы с процессором. Так как x86 процы "фирмы Intel" быстрее делают выборку по чётным байтам. Логики, правда, не уследил. Где у них байтов чётных больше станет?

ЗЫ: спасибо большое.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144405
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinВзял я это из дескрипшена. Там написанно было, что хоть байт этот и не используется никак! он введён для оптимизации работы с процессором. Так как x86 процы "фирмы Intel" быстрее делают выборку по чётным байтам. Логики, правда, не уследил. Где у них байтов чётных больше станет?


ИМХО для структуры RGBQuad при работе в палитровых режимах, преобразование
палитра+растр -> контекст выполняется несколько быстрее, когда элементы
палитры выровняны на границу слова, двойного слова или учетверенного слова.
Так проще делать выборку по индексу (логическими операциями заместо

По поводу выравнивания строки на границу кратную 2 (или 4). ИМХО та-же
история. Проще делать сериализацию и парсинг. хотя непонятно, зачем Microsoft закладывал такие зависимости от аппаратуры. Наверное так проще
было для не сильно быстрых машин под Windows 3.1
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33144699
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторrgbdiv - фишка интересная. Поскольку график, построенный самописцем, должен быть серый (чёрный в идеале) то я сразу отсекаю "цветные" пиксели. Соотношение r/g/b в сером пикселе должно быть в идеале еденица. Но практике близко к еденице.

В коде я вижу r/b/g/b - это специальное усиления blue ?
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33145002
mrDOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самописец походу синими чернилами пишет наверна
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33145842
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinВзял я это из дескрипшена. Там написанно было, что хоть байт этот и не используется никак! он введён для оптимизации работы с процессором. Так как x86 процы "фирмы Intel" быстрее делают выборку по чётным байтам. Логики, правда, не уследил. Где у них байтов чётных больше станет?
А логика этого завязана на железо. От ОС здесь ничего не зависит.

Если тебе нужно БЫСТРО обработать картинку, то имеет смысл выровнять описание каждого пикселя в своем собственном буфере. То есть полноцветные 24-х битовые пиксели надо записывать в 32-х битовые ячейки массива. У тебя будет потеря производительности на чтении файла в память и записи картинки обратно в файл, но будет выигрыш на внутренней обработке картинки. Кстати, при посылке картиники из такого буфера на экран - скорее всего тоже будет падение производительности.
Тоже самое касается и палитровых картинок, но там имеет смысл выравнивать не только пиксели, но и палитры. Впрочем на палитровых картинках количество байт на пиксель обычно достаточно мало чтобы не заморачиватсья с выравниванием пикселей :)
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33146168
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TracerВ коде я вижу r/b/g/b - это специальное усиления blue ?
(r/b)/(g/b)
Логика: r/b ~ 1 => r~b; g/b ~ 1 => g ~ b => g ~ b ~ r. ~ - это у меня приближённо такое.

White Owl
У меня трабл со скоростью чтения. Но это в отдельной ветке решу.
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33146169
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ: ща ей файл гиговый скармливать буду:)
...
Рейтинг: 0 / 0
Исходники моей проги. (Может кто какую незуразность заметит)
    #33146184
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я обожаю Си!!! Я обожаю Линух!!! Малышь в 8 килобайт справился быстрее, чем монстр в 650. И монстр справлялся не всегда. На сильных компах только. А это творение!!! Я знал что её любой файл по плечу. Но что она обработает его в 6 раз быстрее!!!

Вот чем бы только открыть теперь полученную картинку:)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исходники моей проги. (Может кто какую незуразность заметит)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]