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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2009, 20:09   #1
Mayday_007
 
Регистрация: 03.04.2008
Сообщений: 7
По умолчанию считывание bmp из файла на канву

Здравствуйте, прошу помочь со считованием моно 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;
Mayday_007 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ считывание с файла. tsergey Помощь студентам 20 24.04.2010 23:30
Обработка BMP файла sparkspark Помощь студентам 4 20.02.2009 11:46
Считывание с файла (assembler) Prizrak58 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 30.01.2008 18:40
Считывание из файла DimkinStd Общие вопросы Delphi 7 24.01.2007 19:18