Форум программистов, компьютерный форум CyberForum.ru

Рисунок получается битым - C++

Восстановить пароль Регистрация
 
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
13.03.2013, 20:14     Рисунок получается битым #1
В ходе обучения создал простенький генератор точечных рисунков. Столкнулся с проблемой. Описание в комментариях.
C++
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
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;
 
#pragma pack (push, 1)
struct bmpHeader
{
    //header
    char type[2];
    DWORD fileSize;        
    WORD reserved1;
    WORD reserved2;
    DWORD offset;
    //info
    DWORD infoSize;
    unsigned long width;
    unsigned long height;
    WORD planes;
    WORD bitPerPixel;
    DWORD compression;
    DWORD imageSize;
    unsigned long xPerMeter;
    unsigned long yPerMeter;
    DWORD colorUsed;
    DWORD colorImportant;
    //color table       
};
#pragma pack (pop)
 
int main()
{
  FILE* file;
  bmpHeader headr;
  char color[3];
 
  rename(tmpnam(NULL),"temp.bmp");//создаём пустой файл и перемещаем в папку с программой
  file = fopen("temp.bmp", "wb+");//открываем для записи
  //генерируем заголовок
  headr.type[0]='B';
  headr.type[1]='M';
  headr.reserved1 = 0;
  headr.reserved2 = 0;
  headr.compression = 0;
  headr.colorUsed = 0;
  headr.colorImportant = 0;
  
  headr.width = 101;//если ширина больше 100, рисунок получается битым
  headr.height = 102;
  headr.bitPerPixel = 24;
  headr.offset = 54;
  headr.infoSize = 40;
  headr.planes = 1;
  headr.xPerMeter = 3780;
  headr.yPerMeter = 3780;
  
  headr.imageSize = headr.bitPerPixel / 8 * headr.width * headr.height;
  headr.fileSize = headr.imageSize + headr.offset;  
  //записываем заголовок
  cout<<"Writing header...\n";    
  fwrite(&headr,sizeof(headr),1,file);
  //генерация и запись изображения  
  for (int h=0;h<headr.height;h++)
  {
    for (int w=0;w<headr.width;w++)
    {
      // забиваем все точки белым цветом        
        color[0] = 255;
        color[1] = 255;
        color[2] = 255;
        fwrite(color,3,1,file);      
    }  
  }
    
  fclose(file);
  
  return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 20:14     Рисунок получается битым
Посмотрите здесь:

C++ любой рисунок.
C++ Рисунок в С++: Плывущий Корабль
Рисунок из звездочек C++
C++ Построить рисунок
C++ Графический Рисунок(нужно составить рисунок на С++ в форме желтой звезды)
Нарисовать рисунок C++
Нарисовать рисунок по формуле C++
Нарисовать рисунок C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,121
Записей в блоге: 3
13.03.2013, 20:18     Рисунок получается битым #2
Может вы с заголовком напартачили? В windows.h есть готовые структуры загловков для битмапов.
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
13.03.2013, 21:32  [ТС]     Рисунок получается битым #3
Если бы я хотел использовать заголовки из windows.h, я бы так и сделал, но по идее эта программа тоже должна работать! Вопрос открыт.

Добавлено через 29 минут
В ходе анализа правильного bmp-изображения в WinHex выяснилось, что в конце каждого ряда точек стоит нулевой байт. Программа заработала.

Добавлено через 27 минут
Всё оказалось хитрее, чем я думал изначально. Оказывается, ширина рисунка, помноженная на глубину цвета (байт/пиксель) должна быть кратна 4. Отсюда и дополнительные нули

Добавлено через 14 минут
Поправка: просто ширина должна быть кратна четырём, а не как написано здесь
Yandex
Объявления
13.03.2013, 21:32     Рисунок получается битым
Ответ Создать тему
Опции темы

Текущее время: 16:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru