|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
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 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Наверно все-таки &bin...
Кроме того, файл вы открываете для записи, а не для чтения... |
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[]; |
21.03.2013, 21:35 | #4 |
Негодник
Форумчанин
Регистрация: 10.11.2009
Сообщений: 880
|
Прочитайте эту статью про структуру BMP файла.
Ну, а картинка с ошибкой говорит, что вы не выделили память под переменную bitmapImage, и используете её. Выделить памяти нужно Width*Height*количество бит на пиксель.
Если помог, проси поставить минус. Будь оригинален!
|
20.09.2018, 15:20 | #5 |
Регистрация: 20.09.2018
Сообщений: 3
|
эксперимент удался
подправил вот так
Код:
Например размеры картинки, значения в разных пикселях для контроля сделал печать в консоль ширины, высоты и количества битов на пиксель получил ширину и высоту по -858993460, а битов на 52428 а ссылка на статью умерла :-( _____ Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ) Модератор Последний раз редактировалось Serge_Bliznykov; 20.09.2018 в 15:32. |
20.09.2018, 19:38 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Файлы с картинками неплохо открывать в двоично режиме.
Прочитайте про аргументы fopen() |
22.09.2018, 08:31 | #7 |
Регистрация: 20.09.2018
Сообщений: 3
|
спасибо, waleriПрофессионал, оба совета мимо т.к. были, разумеется, опробованы все ключи команды fopen(), всё равно спасибо.
А основной вопрос о способах контроля и методах поиска ошибки. В частности, в этом примере, почему ширина и высота обе отрицательны и одинаковы? Последний раз редактировалось albertelena; 22.09.2018 в 08:34. |
22.09.2018, 09:53 | #8 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Цитата:
Скорее всего файл пустой, соответственно ничего не читается. Проверять коды ошибок и проходить по коду отладчиком. Я не знаю что было опробовано, я вижу код. Последний раз редактировалось waleri; 22.09.2018 в 09:57. |
|
18.11.2018, 18:56 | #9 |
Регистрация: 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 и перевести картинку в цифры правильно? |
18.11.2018, 18:59 | #10 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
Покажите сам файл
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как выдернуть текст из тега ? | 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 |