Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> побитовое чтение bmp файла 
:(
    Опции темы
Mayday007
Дата 19.4.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



Здравствуйте, прошу помочь со считованием моно bmp картинки на канву напрямую с файлом, с 24 битным изображением затруднений не возникло, представляю код на делфи, как реализовать вывод на канву однобитного файла и какова структурная разница между ними?
Я понял только то, что в отличии от 24 б изображения, моно картинка читается по байту на цвет, а не триплексом, и еще: почему абсолютное смещение в моно картинке 62, а не 54 как в 24 б изобр.
Код

bmFileHeader = packed record    {заголовок файла}
    Typf : word;        {сигнатура }
    Size : longint;     {длина файла в байтах}
    Res1 : word;        {зарезервировано}
    Res2 : word;        {зарезервировано}
    OfBm : longint;     {смещение изображения в байтах (1078)}
  end;
  bmInfoHeader =packed record   {информационный заголовок}
    Size : longint;       {длина заголовка в байтах (40)}
    Widt : longint;       {ширина изображения (в точках)}
    Heig : longint;       {высота изображения (в точках)}
    Plan : word;          {число плоскостей (1)}
    BitC : word;          {глубина цвета (бит на точку) (8)}
    Comp : longint;       {тип компрессии (0 - нет)}
    SizI : longint;       {размер изображения в байтах}
    XppM : longint;       {горизонтальное разрешение}
                  {(точек на метр - обычно 0)}
    YppM : longint;       {вертикальное разрешение}
                  {(точек на метр - обычно 0)}
    NCoL : longint;       {число цветов}
                  {(если максимально допустимое - 0)}
    NCoI : longint;       {число основных цветов}
  end;
  bmRGBTriple = packed record
    blue :byte;
    green :byte;
    red :byte;
  end;

  bmHeader24 =packed record       {полный заголовок файла}
    f : bmFileHeader;     {заголовок файла}
    i : bmInfoHeader;     {информационный заголовок}
  end;

  bmhptr = ^bmHeader24;

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
bmpfile:file;
i,j,x1,y1,t:integer;
h:bmheader24;
begin
opendialog1.Execute;
 assignfile(bmpfile,opendialog1.filename);
 image1.Refresh;
  reset(bmpfile,1);
  blockread(bmpfile,h,sizeof(h));   {чтение заголовка}
  label2.Caption:=inttostr(h.f.OfBm);
  label1.Caption:='Размер файла   -   '+inttostr(h.f.Size)+' байт'+#13+
                  'Разрешение      -   '+inttostr(h.i.Widt)+'x'+inttostr(h.i.Heig)+' пикс'+#13+
                  'Количество бит -  '+inttostr(h.i.BitC)+' бит';
  image1.Width:=h.i.Widt;
  image1.Height:=h.i.Heig;
    x1:=-1;
    y1:=-1;
if h.i.BitC=24 then begin
///////////////////////////////////
 for i:=1 to (h.i.widt*h.i.Heig) do
  begin
    blockread(bmpfile,r,sizeof(r));
     if i mod h.i.widt=1 then inc(y1);
     x1:=i mod h.i.Widt;
    image1.Canvas.Pixels[h.i.Widt-x1,h.i.Heig-y1]:=r.blue Shl 16 Or r.green Shl 8 Or r.red;
  end;

PM MAIL   Вверх
Alexeis
Дата 19.4.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Почитайте тут подробнее, может станет понятнее http://forum.vingrad.ru/topic-94227.html



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mayday007
Дата 19.4.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



Я наверное тупой, но так и не понял структуру моно битмапа, как доступиться к самим цветам??? Заранее спасибо.
PM MAIL   Вверх
Alexeis
Дата 19.4.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



1 пиксель 1 бит, в одном байте 8 пикселей. Старший бит в байте крайне левый пиксель, младший крайне правый. Если часть бит не использовано в последнем байте строки, то они могут иметь произвольные значения. Число байт в строке должно быть кратно четырем, если реально получилось не так то дополнительно добавляется от одного до 3х байт, так чтобы полученная длинна была кратна 4м. Цвет пиксела определяется индексом в палитре, которая идет сразу за инфохередом и содержит 2е записи.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mayday007
Дата 19.4.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



Но почему смещение до начала изображения, если судить по файлу 62, а в 24 битном изображ. - смещение 54, что за разница в этих 8 битах??? Палитра.... а еще???
PM MAIL   Вверх
Alexeis
Дата 19.4.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Палитра это 4 байта на цвет. Монохром 2 цвета, итого 4 * 2 = 8 байт. Палитра всегда идет за инфохедером 54 + 8 байт палитры = 62

Добавлено через 22 секунды
24 битном изображении нет палитры, поэтому нет смещения на 8 байт

Добавлено через 3 минуты и 16 секунд
P.S. Mayday007 это случаем не вы? Сцылко


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mayday007
Дата 19.4.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



Нет, это не я.)))
и еще если не сложно последний вопрос, как кодируеться сама информация опосля 62 байт???
Вот данные после 62 бит(hex):
C0 37 E9 01 C0 00 00 00 00 39 E9 01 00 00 00 00
Палитра 00 00 00 00 FF FF FF 00.
Как же расшифровать-то данные?

PM MAIL   Вверх
Alexeis
Дата 19.4.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Если очередной бит нулевой то пиксель нужно рисовать первым цветом, т.е. (0, 0, 0), если 1, то вторым 
(255, 255, 255)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mayday007
Дата 20.4.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



Допустим вот наш файл:
42 42 00 00 00 00 00 00 00 3E 
00 00 00 28 00 00 00 04 00 00 
00 01 00 00 00 01 00 01 00 00 
00 00 00 04 00 00 00 00 00 00 
00 00 00 00 00 02 00 00 00 02
00 00 00 00 00 00 00 FF  FF FF 
00 50 69 EA 01
Это моно картинка высотой в 1 пикс, и шириной в четыре.
1 пикс-черный, 2-белый, 3-черный, 4 - белый.
Эти 4 пиксела описывают 50 69 EA 01, 1пикс - 50, 2- 69, 3 - ЕА, 4 -01.
т.е черный цвет это и 50 и ЕА ??? Почему??? не пойму(((((
PM MAIL   Вверх
Alexeis
Дата 20.4.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Mayday007, вы путаете биты и байты. 1й байт "50" содержит в себе все 4 пиксела.
50 в десятичной системе равно 1010000 в двоичной. 
1010 - это 4 пиксела 0000 это дополняют биты до байта
69 EA 01 - 3 байта дополняющие строку до кратности 4м. Так как у нас только 1 рабочий байт, то чтобы дополнить до 4х байт добавляем еще 3. Значение 3х дополнительных байтов может быть произвольным. На практике так и вышло. Там просто мусор.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mayday007
Дата 20.4.2009, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



огромное спасибо, все вышло.)))) 
PM MAIL   Вверх
Mayday007
Дата 22.4.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



И последний вопрос
наш файл:
42 4D 46 00 00 00 00 00 00 00 
3E 00 00 00 28 00 00 00 05 00 
00 00 02 00 00 00 01 00 01 00 
00 00 00 00 08 00 00 00 00 00 
00 00 00 00 00 00 02 00 00 00 
02 00 00 00 00 00 00 00 FF FF 
FF 00 88 F5 EB 01 20 73 EB 01
Это моно картинка высотой в 2 пикс, и шириной в 5.
[1,1]pix-черный
[1,2]pix-черный
[1,3]pix-белый
[1,4]pix-черный
[1,5]pix-черный
[2,1]pix-белый
[2,2]pix-черный
[2,3]pix-черный
[2,4]pix-черный
[2,5]pix-белый
10 пикселей - 88 F5 EB 01 20 73 EB 01, 
88=10001000, уже с нашей картинкой не сходиться. Как тут быть???
PM MAIL   Вверх
Alexeis
Дата 22.4.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Строки в битмапе идут слева направо, снизу вверх, а не сверху вниз как в обычной матрице.
так что 1я строка сверху это число 20 = 0010 0000


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mayday007
Дата 22.4.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



1) Почему мы взяли именно пятый байт?
2) 0010 0000 - первая строка 00100, а на вторую переноситься 000?
PM MAIL   Вверх
Alexeis
Дата 22.4.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Mayday007 @  22.4.2009,  20:52 Найти цитируемый пост)
1) Почему мы взяли именно пятый байт?

  Ой, ну сколько раз повторять. Строка в битмапе выравнивается на 4 байта. Строка не может быть меньше 4х байт. 1я строка она последняя, а последняя строка первая. Тут всего 2е строки, значит последняя вторая. 5пикселов это всего 1 байт, выравнили на границу 4х, получили 4 байта, значит 2я строка начинается с 5го байта, но вторая строка в битмапе она будет первой сверху.

Цитата(Mayday007 @  22.4.2009,  20:52 Найти цитируемый пост)
2) 0010 0000 - первая строка 00100, а на вторую переноситься 000? 

  1 байт это 8 бит, не 4 никуда ничего не переносится, просто порядки разделил пробелом smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.