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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2013, 01:37   #1
спящий
Новичок
Джуниор
 
Регистрация: 19.03.2013
Сообщений: 2
По умолчанию Как bmp выдернуть массив

Собственно вопрос в теме,пользуюсь Visual c++ 2008 . Немогу понять.


#include<stdio.h>
#include <iostream>
#include<windows.h>
using namespace std;

int main(void){
BITMAPFILEHEADER hdr;
BITMAPINFOHEADER bih;
FILE *file;
char* file_name = "file.bmp";
int bih;

if((file = fopen(file_name, "w")) == NULL) //открываем файл bmp
{cout << "now open";
return 0;}
else{cout << "open!!";//открыт
//дальше непойму

fread(bih, sizeof(BITMAPINFOHEADER), 1, file);//sizeof(BITMAPINFOHEADER)- это что мы читаем(инфу о Размере данной структуры в байтах)?1-это количество ,bin-куда читаем


return 1;

}


Я в этом новичек как считать biWidth biHeight и собственно сам массив.
спящий вне форума Ответить с цитированием
Старый 19.03.2013, 09:43   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Наверно все-таки &bin...
Кроме того, файл вы открываете для записи, а не для чтения...
waleri вне форума Ответить с цитированием
Старый 20.03.2013, 18:55   #3
спящий
Новичок
Джуниор
 
Регистрация: 19.03.2013
Сообщений: 2
По умолчанию

чет немогу рразобраться программа проста читает bmp выводит массив на экран :


#include<stdio.h>
#include <iostream>
#include<windows.h>
using namespace std;



int main(void){
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
FILE *file;
int imageIdx=0;
char* file_name = "file1.bmp";
char *bitmapImage;
if((file = fopen(file_name, "r")) == NULL) //открываем файл
{cout << "now open";//открыт
return 0;}
else{cout << "open!!"<<endl; //закрыт
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER),1,file); // честно, хз что это,чтение типа о картинке?
fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,file);// честно, хз что это,чтение заголовок о картинке?
fseek(file, bitmapFileHeader.bfOffBits, SEEK_SET); //перенос курсора в начала массива bitmapInfoHeader.biWidth * bitmapInfoHeader.biHeight) в bitmapImage

fread(bitmapImage,(bitmapInfoHeader .biWidth * bitmapInfoHeader.biHeight),1,file);//читаем массив размером

for (imageIdx = 0; imageIdx < (int)(bitmapInfoHeader.biWidth * bitmapInfoHeader.biHeight ); imageIdx++) //собственно выводим массив расширением (bitmapInfoHeader.biWidth * bitmapInfoHeader.biHeight )
{
cout << bitmapImage[imageIdx];
}

fclose(file);
return 1;

}

}


выдает ошибку:
И еще такой вопрос:в буффер bitmapImage сюда записываем данные с .bmp это должно быть массивом? bitmapImage[];
Изображения
Тип файла: gif kosyak.GIF (87.8 Кб, 130 просмотров)
спящий вне форума Ответить с цитированием
Старый 21.03.2013, 21:35   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Прочитайте эту статью про структуру BMP файла.
Ну, а картинка с ошибкой говорит, что вы не выделили память под переменную bitmapImage, и используете её. Выделить памяти нужно Width*Height*количество бит на пиксель.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 20.09.2018, 15:20   #5
albertelena
 
Регистрация: 20.09.2018
Сообщений: 3
По умолчанию эксперимент удался

подправил вот так

Код:
char* file_name = "150.bmp";
		char *bitmapImage;
		if (sizeof(file_name)>0)
		{
			BITMAPFILEHEADER bitmapFileHeader;
			BITMAPINFOHEADER bitmapInfoHeader;
			FILE *file;
			int imageIdx = 0;
			if ((file = fopen(file_name, "r")) == NULL) //открываем файл
			{
				cout << "not open" << endl;// не открыт
				return 0;
			}
			else {
				cout << "open!!" << endl; //открыт
				fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, file); // чтение типа о картинке?
				fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, file);// чтение заголовок о картинке?
				fseek(file, bitmapFileHeader.bfOffBits, SEEK_SET); //перенос курсора в начала массива bitmapInfoHeader.biWidth * bitmapInfoHeader.biHeight) в bitmapImage
				bitmapImage = new char[bitmapInfoHeader.biWidth * bitmapInfoHeader.biHeight*bitmapInfoHeader.biBitCount];
				fread(bitmapImage, (bitmapInfoHeader.biWidth * bitmapInfoHeader.biHeight), 1, file);//читаем массив размером
				{
					cout << std::to_string( (LONG) bitmapInfoHeader.biWidth) << endl << std::to_string(bitmapInfoHeader.biHeight) << endl << std::to_string((unsigned short) bitmapInfoHeader.biBitCount) << endl;
				}
				fclose(file);
                }
Вопрос: как проверить результат?
Например размеры картинки, значения в разных пикселях
для контроля сделал печать в консоль
ширины, высоты и количества битов на пиксель получил ширину и высоту по -858993460, а битов на 52428

а ссылка на статью умерла :-(

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 20.09.2018 в 15:32.
albertelena вне форума Ответить с цитированием
Старый 20.09.2018, 19:38   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Файлы с картинками неплохо открывать в двоично режиме.
Прочитайте про аргументы fopen()
waleri вне форума Ответить с цитированием
Старый 22.09.2018, 08:31   #7
albertelena
 
Регистрация: 20.09.2018
Сообщений: 3
По умолчанию

спасибо, waleriПрофессионал, оба совета мимо т.к. были, разумеется, опробованы все ключи команды fopen(), всё равно спасибо.
А основной вопрос о способах контроля и методах поиска ошибки. В частности, в этом примере, почему ширина и высота обе отрицательны и одинаковы?

Последний раз редактировалось albertelena; 22.09.2018 в 08:34.
albertelena вне форума Ответить с цитированием
Старый 22.09.2018, 09:53   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от albertelena Посмотреть сообщение
в этом примере, почему ширина и высота обе отрицательны и одинаковы?
Потому что это неипроинициализированные переменные.
Скорее всего файл пустой, соответственно ничего не читается.
Цитата:
Сообщение от albertelena Посмотреть сообщение
о способах контроля и методах поиска ошибки
Проверять коды ошибок и проходить по коду отладчиком.
Цитата:
Сообщение от albertelena Посмотреть сообщение
были, разумеется, опробованы все ключи команды fopen(),
Я не знаю что было опробовано, я вижу код.

Последний раз редактировалось waleri; 22.09.2018 в 09:57.
waleri вне форума Ответить с цитированием
Старый 18.11.2018, 18:56   #9
albertelena
 
Регистрация: 20.09.2018
Сообщений: 3
По умолчанию

Здравствуйте.
Прочитанный мною файл bmp имеет следующий заголовок InfoHeader

bitmapInfoHeader.biSize 40
bitmapInfoHeader.biWidth 8
bitmapInfoHeader.biHeight 8
bitmapInfoHeader.biPlanes 1
bitmapInfoHeader.biBitCount 8
bitmapInfoHeader.biClrUsed 0
bitmapInfoHeader.biClrImportant 0
bitmapInfoHeader.biSizeImage 64

То есть таблица цветов нулевая при поле biBitCount =8.
как расшифровать значения цветов?

Для эксперимента я взял картинку 4х4 пикселя, которую прочел командой fread

В буфере оказались символы
дддд
Ыддд
ддўд
дддд

после преобразования в double
164 164 164 164
155 164 164 164
164 164 247 164
164 164 164 164

в то время как C# для этой же картинки даёт значения
128 128 128 128
96 128 128 128
128 128 160 128
128 128 128 128

Я предположил, что перевод картинки в соответствии версии C# зависит от таблицы, содержащейся в biClrUsed.
Но там 0. Как бы выяснить принципы перевода цветов, используемые в System.Drawing.Imaging::Bitmap и перевести картинку в цифры правильно?
albertelena вне форума Ответить с цитированием
Старый 18.11.2018, 18:59   #10
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Покажите сам файл
Black Fregat вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выдернуть текст из тега ? bakanaev Работа с сетью в Delphi 3 03.04.2012 07:47
Icon как строка, или как запихать его в INI а затем выдернуть оттуда? Человек_Борща Общие вопросы Delphi 4 11.12.2011 14:29
Как выдернуть капчу с dle Айдар Работа с сетью в Delphi 1 27.12.2010 20:52
Как выдернуть скрипт Maksas Работа с сетью в Delphi 1 27.11.2009 23:58
Как загрузить BMP в массив и обратно в С++ Ilja Общие вопросы C/C++ 8 07.03.2009 23:48