Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исходники моей проги. (Может кто какую незуразность заметит) / 23 сообщений из 23, страница 1 из 1
30.06.2005, 01:56
    #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
30.06.2005, 02:04
    #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
30.06.2005, 02:09
    #33141682
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исходники моей проги. (Может кто какую незуразность заметит)
Результаты выполнение всех fopen, fread, fwrite нужно проверять и предупреждать, что "ну, не смогла я..."

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

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


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

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

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

А я об этом даже как то и не подумал :)
...
Рейтинг: 0 / 0
30.06.2005, 14:07
    #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
30.06.2005, 14:56
    #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
30.06.2005, 23:38
    #33144003
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исходники моей проги. (Может кто какую незуразность заметит)
Спасибо за внимание. Отвечу всем по порядку.
Землекоп
Проверку значений open, fread, fwrite обязательно добавлю. Я об этом сразу задумался. Руки не дошли ещё.

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

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

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

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

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


Sarin{0, 0, 0, 255} уделю особое внимание. В дескрипшене на БМП написанно что канал имеет значение от 1 до 255. Сам удивился. Ведь чёрный - это отсутствие цвета. А четвёртый байт оказался не нужен. Опять таки в дескрипшене я вычитал что четвёртый байт - баласт для оптимизации работы с процом. Однако применив познания в арифметике я понял, что что-то не так. Размер файла не сходится. Потом я напоролся на ошибку в проге (в процессе выполнения). Решил не читать баластный байт. Всё заработало, как и должно было. Отсюда вывод: в БМП, рождённом в шопе байт сей отсутствует. Поскольку шоп стандарту соответствует следует вывод, что байт сей исключён из формата.
Тебе не кажется, что ты читал кривое описание формата? BMP бывают разных типов. :)
...
Рейтинг: 0 / 0
01.07.2005, 01:00
    #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
01.07.2005, 01:04
    #33144036
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исходники моей проги. (Может кто какую незуразность заметит)
Sarin
Буква n что значит?

Извини. Читал не внимательно.
...
Рейтинг: 0 / 0
01.07.2005, 01:19
    #33144039
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исходники моей проги. (Может кто какую незуразность заметит)
Код: plaintext
1.
fread(&inputFileHeader, sizeof(inputFileHeader),  1 , inputFile);
Получилось:)
...
Рейтинг: 0 / 0
01.07.2005, 01:23
    #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
01.07.2005, 08:42
    #33144160
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исходники моей проги. (Может кто какую незуразность заметит)
Взял я это из дескрипшена. Там написанно было, что хоть байт этот и не используется никак! он введён для оптимизации работы с процессором. Так как x86 процы "фирмы Intel" быстрее делают выборку по чётным байтам. Логики, правда, не уследил. Где у них байтов чётных больше станет?

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


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

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

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

Если тебе нужно БЫСТРО обработать картинку, то имеет смысл выровнять описание каждого пикселя в своем собственном буфере. То есть полноцветные 24-х битовые пиксели надо записывать в 32-х битовые ячейки массива. У тебя будет потеря производительности на чтении файла в память и записи картинки обратно в файл, но будет выигрыш на внутренней обработке картинки. Кстати, при посылке картиники из такого буфера на экран - скорее всего тоже будет падение производительности.
Тоже самое касается и палитровых картинок, но там имеет смысл выравнивать не только пиксели, но и палитры. Впрочем на палитровых картинках количество байт на пиксель обычно достаточно мало чтобы не заморачиватсья с выравниванием пикселей :)
...
Рейтинг: 0 / 0
01.07.2005, 23:26
    #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
01.07.2005, 23:28
    #33146169
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исходники моей проги. (Может кто какую незуразность заметит)
ЗЫ: ща ей файл гиговый скармливать буду:)
...
Рейтинг: 0 / 0
02.07.2005, 00:07
    #33146184
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исходники моей проги. (Может кто какую незуразность заметит)
Я обожаю Си!!! Я обожаю Линух!!! Малышь в 8 килобайт справился быстрее, чем монстр в 650. И монстр справлялся не всегда. На сильных компах только. А это творение!!! Я знал что её любой файл по плечу. Но что она обработает его в 6 раз быстрее!!!

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


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