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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2011, 14:27   #1
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию Работа с BMP

Бобрового дня уважаемые обитатели. Возникло некое недопонимание определения в работе с данным форматом.
Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>

using namespace std;

int main () 
{
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  //открываем файл
  pFile = fopen ( "1.bmp" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // определяем размер под файл:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // выделяем память для файла
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // копируем файл в буфер
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

 // копируем из буфера
  BITMAPFILEHEADER    BMP;
  BITMAPINFOHEADER    BMPinfo;
  memcpy(&BMP,buffer,sizeof(BITMAPFILEHEADER));
  memcpy(&BMPinfo,buffer,sizeof(BITMAPINFOHEADER));

  // закрывем файл, освобождаем память
  fclose (pFile);
  free (buffer);
   cout << "bfSize = " << BMP.bfSize << endl; //размер файла
  
  cout << "Width= " << BMPinfo.biWidth << endl; //ширина 
  cout << "Height= " << BMPinfo.biHeight << endl;//высота изображения
 
	return 0;

}
Данный не хитрый код должен выдать инфу о файле 1.bmp(размер, ширину, высоту) если с первым все в поредке то вот с вторым и третьем, что то явно не так. Возможно нужно использовать bfOffBits для опеределения начала непосредсвенно самого битового массива и уже его замерять? Если моя интуиция права то как это реализовать? если нет, то в чем я ошибся? Благодарю
Neolit1819 вне форума Ответить с цитированием
Старый 04.04.2011, 19:25   #2
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

сделал изменения
Код:
// BitMapRead.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>

using namespace std;

int main () 
{
  FILE * pFile;
  long lSize;
  char * buffer;
  char * buffer2;
  size_t result;

  unsigned char r;
  
  //открываем файл
  pFile = fopen ( "1.bmp" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // определяем размер под файл:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // выделяем память для файла
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // копируем файл в буфер
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

 // копируем из буфера
  BITMAPFILEHEADER    BMP;
  BITMAPINFOHEADER    BMPinfo;
  memcpy(&BMP,buffer,sizeof(BITMAPFILEHEADER));

  //-------------------------------------------------------
   // определяем размер под файл:
  fseek (pFile , BMP.bfOffBits , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // выделяем память для файла
  buffer2 = (char*) malloc (sizeof(char)*lSize);
  if (buffer2 == NULL) {fputs ("Memory error",stderr); exit (2);}

  // копируем файл в буфер
  result = fread (buffer2,1,lSize,pFile);      <---------------------------------------------- скорее всего ошибка(
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  
  
  memcpy(&BMPinfo,buffer2,sizeof(BITMAPINFOHEADER));
//-----------------------------------------------------------------------------
  // закрывем файл, освобождаем память
  
  fclose (pFile);
  
  free (buffer);
  free (buffer2);
  cout << "bfSize = " << BMP.bfSize << endl; //размер файла
  
  cout << "Width= " << BMPinfo.biWidth << endl; //ширина 
  cout << "Height= " << BMPinfo.biHeight << endl;//высота изображения
 
	return 0;

}
добавил выделенную область для второго бувера в который пытаюсь скоприровать как я думаю файл начиная с битового массива, скоприровать не получается(ошибка в помеченной строке), да и не знаю на верном ли я пути =(

Последний раз редактировалось Neolit1819; 04.04.2011 в 19:49.
Neolit1819 вне форума Ответить с цитированием
Старый 04.04.2011, 21:21   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Neolit1819 Посмотреть сообщение
Данный не хитрый код должен выдать инфу о файле 1.bmp(размер, ширину, высоту)
Если это - вся задача, зачем Вам весь файл в памяти?..

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

int main () { 

   FILE * pFile;
   BITMAPFILEHEADER bmfHeader ;
   BITMAPINFOHEADER bmiHeader ;

   pFile = fopen ( "1.bmp" , "rb" );
   if ( pFile==NULL ) {
      fputs( "File opening error.", stderr ) ; 
      return 1 ;
   }

   // Read file header
   if ( fread( (LPSTR)&bmfHeader, 1, sizeof(bmfHeader), pFile ) != sizeof(bmfHeader) ) {
      fputs( "File header corrupted?",stderr ); 
      return 1 ;
   }

   // Read BITMAPINFOHEADER header
   if ( fread( (LPSTR)&bmiHeader, 1, sizeof(bmiHeader), pFile ) != sizeof(bmiHeader) ) {
      fputs( "File info header corrupted?",stderr ) ; 
      return 1;
   }

   printf( "Size = %d bytes\n", bmfHeader.bfSize ) ;
   printf( "Width = %d\n", bmiHeader.biWidth ) ;
   printf( "Height = %d\n", bmiHeader.biHeight ) ;

   return 0 ;

}

Последний раз редактировалось Vago; 04.04.2011 в 21:42. Причина: BITMAPINFOHEADER, конечно. Не BITMAPCOREHEADER
Vago вне форума Ответить с цитированием
Старый 04.04.2011, 21:56   #4
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

Vago примного благодарен
Neolit1819 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка BMP в Simple Graph и сохранение в BMP формат artemavd Общие вопросы Delphi 10 02.10.2010 14:19
Работа с BMP рисунком. wr_vu Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 01.10.2010 13:05
работа с bmp файлами в С++ blackbanny Помощь студентам 5 16.06.2010 09:04
Работа с BMP файлами в PHP utrnjhyfgjktjy Помощь студентам 0 27.04.2010 00:58
работа с .bmp DeadWorm Общие вопросы C/C++ 4 16.04.2009 14:09