Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 28.03.2009, 21:08   #1
CHizzzER
 
Регистрация: 28.03.2009
Сообщений: 5
По умолчанию bmp файл читается не до конца

добрый день) в общем по порядку. задача: реализовать алгоритм выделения границ (любой). В общем то как реализовать - это я догадался, да и в принципе до всего остального догадался тоже, но тут вышла такая фигня. в общем код:

Код:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

void main(){
	unsigned char R,G,B;
	unsigned char **Y;
	int i,j,k=1;
	long int m,n;
	FILE *f;
	clrscr();
	f=fopen("dat/test.bmp","r");
	fseek(f,0x12,0);
	fread(&n,sizeof(long int),1,f);
	fread(&m,sizeof(long int),1,f);
	Y=(unsigned char**)malloc(sizeof(unsigned char*)*m);
	for(i=0;i<m;i++) Y[i]=(unsigned char*)malloc(sizeof(unsigned char)*n);
	printf("Razmer izobrazheniya\nShirina: %d\nVisota: %d",n,m);
	fseek(f,54,0);
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
		{B=getc(f);
		 G=getc(f);
		 R=getc(f);
		 Y[i][j]= R*0.3 + G*0.59 + B*0.11;
		 /*printf("\npixel:%d  R:%d G:%d B:%d  Y=%d",k++,R,G,B,Y[i][j]);
		 getch();*/
		}

	/*for(i=1;i<m;i++)
		for(j=0;j<n-1;j++)
			{
			 Y[i][j]=abs(Y[i][j]-Y[i-1][j+1])+abs(Y[i-1][j]-Y[i][j+1]);
		    }*/

	fclose(f);
	f=fopen("dat/test.bmp","r+");
	fseek(f,54,0);
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
			{fputc(Y[i][j],f);
			 fputc(Y[i][j],f);
			 fputc(Y[i][j],f);
		    }

fclose(f);
free(Y);
getch();
}
идея такая - открываю bmp файл, перемещаюсь на байт 0x12, беру ширину с высотой, потом прыгаю на начало массива RGB, читаю его и необходимо тут найти яркость пикселя, то есть по сути превратить его в ч\б вариант, для чего по известной формуле я складываю красный, зеленый и синий байты. что касается алгоритма выделения границ - бог с ним, у меня программа встает непонятно почему на стадии считывания байт из файла. читает некоторое количество (зависит по видимому от размера картинки), превращает их в ч\б, но вдруг на каком нибудь останавливается. причем для каждой картинки останавливается в строго определенном месте. То есть
Код:
 
B=getc(f);
G=getc(f);
R=getc(f);
возвращает мне белые пиксели до конца файла
Думал косяк в динамическом массиве - создал обычный 480*640, та же история. там есть закомменченные строки - в цикле это я проверку вставил, типа дебага =) а дальше это нерабочий алгоритм выделения границ. ну да и ладно, пусть пока не работает. мне бы чтоб картинка считалась нормально! для примера 2 файла

это то, что было:



это то, что получилось:

как видно, то что обработалось - стало ч\б.. но вот застревает постоянно там.. помогите в общем, надеюсь полно изложил проблему

Последний раз редактировалось CHizzzER; 28.03.2009 в 21:14.
CHizzzER вне форума
Старый 29.03.2009, 14:27   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Мне кажется, при чтении файла попадается какой-то "особенный" байт. Нулевой символ или символ конца файла, например. Попробуйте закрасить в тестовой картинке область в районе последнего правильно скопированного пикселя "замазать", например, салатовым цветом. Думаю, алгоритм пройдет дальше.
pu4koff вне форума
Старый 29.03.2009, 14:40   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Согласен с pu4koff
Но что бы этого не происходило, откройте файл в бинарном режиме
Код:
f=fopen("dat/test.bmp","r+b");
В этом режиме символы не преобразовываются в управляющие последовательности
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума
Старый 30.03.2009, 12:37   #4
CHizzzER
 
Регистрация: 28.03.2009
Сообщений: 5
По умолчанию

пасиба, помогло
CHizzzER вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не читается файл Акашаев Нурлан PHP 6 17.11.2008 12:58
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Сохранение в *.Bmp - файл Рустам Мультимедиа в Delphi 14 28.11.2007 21:32
Как сохранять bmp картинки в файл с данными andrey4623 Мультимедиа в Delphi 2 25.06.2007 08:36
Не могу прочитать файл до конца... FEAR Общие вопросы C/C++ 9 04.01.2007 21:46