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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RLE кодирований BMP, Помогите с RLE кодированием ВМР 
:(
    Опции темы
Dmi-Afonin
Дата 9.11.2004, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ такая проблема сделал прогу для открытия BMP, помогите сделать так чтобы она открывала Rle файлы формата BMP 16 и 256 цветов.
Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, StdCtrls, ExtCtrls, Math;

type

 TForm1 = class(TForm)
   ScrollBox1: TScrollBox;
   StaticText1: TStaticText;
   StaticText2: TStaticText;
   StaticText3: TStaticText;
   StaticText5: TStaticText;
   StaticText6: TStaticText;
   StaticText7: TStaticText;
   StaticText8: TStaticText;
   StaticText9: TStaticText;
   StaticText10: TStaticText;
   StaticText11: TStaticText;
   StaticText12: TStaticText;
   StaticText13: TStaticText;
   StaticText14: TStaticText;
   StaticText15: TStaticText;
   StaticText16: TStaticText;
   StaticText17: TStaticText;
   StaticText18: TStaticText;
   StaticText19: TStaticText;
   StaticText20: TStaticText;
   StaticText21: TStaticText;
   StaticText22: TStaticText;
   StaticText23: TStaticText;
   StaticText24: TStaticText;
   StaticText25: TStaticText;
   StaticText26: TStaticText;
   StaticText4: TStaticText;
   StaticText27: TStaticText;
   StaticText28: TStaticText;
   StaticText29: TStaticText;
   StaticText30: TStaticText;
   StaticText31: TStaticText;
   StaticText32: TStaticText;
   StaticText33: TStaticText;
   StaticText34: TStaticText;
   StaticText35: TStaticText;
   StaticText36: TStaticText;
   MainMenu1: TMainMenu;
   N1: TMenuItem;
   N2: TMenuItem;
   N3: TMenuItem;
   OpenDialog1: TOpenDialog;
   Image1: TImage;
   procedure N2Click(Sender: TObject);
   procedure N3Click(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 Bm: TBitmap;
implementation

{$R *.dfm}

procedure TForm1.N2Click(Sender: TObject);
var
 name: TFilename;

procedure readfile(name:TFilename);
type
 TBuf = array [0..MaxWord] of Byte;
 Palit256 = array[0..255] of Longword;
 Palit16 = array[0..15] of Longword;
 Palit1 = array[0..1] of Longword;

 filetitle=record
 FileType:word;
 FileSize:Longword;
 Reserve:Longword;
 BMPOffs:Longword;
 Size:Longword;
 Width:Longword;
 Height:Longword;
 Planes:word;
 BitPerPixel:word;
 Compress:Longword;
 SizeOfBMP:Longword;
 HorRez:Longword;
 VertRez:Longword;
 ColorUsed:Longword;
 ColorImportant:Longword;
 end;
 var
   buf: ^Tbuf;
   pal256: palit256;
   pal16: palit16;
   pal1: palit1;
   KK: array [1..8] of byte;
   f:file;
   ft:filetitle;
   BMPformat, Rle:boolean;
   i,j,x,y,t,z:integer;
   BitPerPixel:integer;
   K,L,M: byte;

begin
 StaticText3.Caption:=name;
 AssignFile(f,name);
 reset(f,1);

 {÷òåíèå çàãîëîâêà ôàéëà}
 blockread(f,ft.FileType,2);
 if ft.FileType=19778 then
 begin
 statictext16.caption:='BM';
 blockread(f,ft.FileSize,4);
 statictext17.caption:=format('%d',[ft.FileSize]);
 blockread(f,ft.Reserve,4);
 statictext18.caption:=format('%d',[ft.Reserve]);
 blockread(f,ft.BMPOffs,4);
 statictext19.caption:=format('%d',[ft.BMPOffs]);
 blockread(f,ft.Size,4);
 statictext20.caption:=format('%d',[ft.Size]);
 blockread(f,ft.Width,4);
 statictext21.caption:=format('%d',[ft.Width]);
 blockread(f,ft.Height,4);
 statictext22.caption:=format('%d',[ft.Height]);
 blockread(f,ft.Planes,2);
 statictext23.caption:=format('%d',[ft.Planes]);
 blockread(f,ft.BitPerPixel,2);
 statictext24.caption:=format('%d',[ft.BitPerPixel]);
 blockread(f,ft.Compress,4);
 statictext25.caption:=format('%d',[ft.Compress]);
 blockread(f,ft.SizeOfBMP,4);
 statictext26.caption:=format('%d',[ft.SizeOfBMP]);
 blockread(f,ft.HorRez,4);
 statictext30.caption:=format('%d',[ft.HorRez]);
 blockread(f,ft.VertRez,4);
 statictext32.caption:=format('%d',[ft.VertRez]);
 blockread(f,ft.ColorUsed,4);
 statictext34.caption:=format('%d',[ft.ColorUsed]);
 blockread(f,ft.ColorImportant,4);
 statictext36.caption:=format('%d',[ft.ColorImportant]);

 {ïðîâåðêà êîððåêòíîñòè çàãîëîâêà}
 BMPformat:=true;
 if BMPformat then
  begin
   statictext4.caption:='Ôàéë BMP';
   if(ft.BitPerPixel=24) then
     statictext27.caption:='Áåç ïàëèòðû'
     else statictext27.caption:='Ñ ïàëèòðîé';
   if ft.Compress=0 then
     begin
      statictext28.caption:='Áåç ñæàòèÿ';
      rle:=false;
     end
      else
       begin
        statictext28.caption:='Ñî ñæàòèåì';
        rle:=true;
       end;
   end // if BMPformat then
 else begin
   statictext4.Caption:='Íåèçâåñòíûé';
   statictext27.Caption:='ôîðìàò ôàéëà';
   statictext28.Caption:='';
   exit;
 end;

 {ïîñòðîåíèå èçîáðàæåíèÿ èç ôàéëà}
    BM := TBitMap.Create;
    BM.width := ft.width;
    BM.height := ft.height;
    Image1.AutoSize:=false;
    Image1.Width:=Bm.width;
    Image1.Height:=Bm.height;
    Image1.Visible:=true;

 {èçîáðàæåíèå áåç ïàëèòðû è áåç ñæàòèÿ}

 if (ft.BitPerPixel=24) and (ft.Compress=0) then

 begin
    {íà÷èíàåì ÷èòàòü ôàéë}
    GetMem(Buf, ft.SizeOfBMP);
    BlockRead(f, Buf^, ft.SizeOfBMP);
    BM.pixelformat := pf24bit;
    I:=0;
    for y := Bm.height - 1 downto 0 do
     begin
      for x := 0 to BM.width - 1  do
        begin
         t:=0;
         t:=Buf^[i] shl 16 + Buf^[i+1] shl 8 +  Buf^[i+2];
         Bm.Canvas.Pixels[x,y]:=t;
         Inc(i,3);
        end;
        Inc(i, BM.Width mod 4);
     end;
 Image1.Picture.Graphic:=Bm;
 FreeMem(buf);
 end;


 if (ft.BitPerPixel=8) and (ft.Compress=0) then
    begin
      {íà÷èíàåì ÷èòàòü ôàéë}
      BM.pixelformat := pf8bit;
      {ïðîïóñêàåì îïèñàíèå ôàéëà}
      for i:=0 to 255 do
         blockread(f,Pal256[i],4);
      GetMem(Buf, ft.SizeOfBMP);
      BlockRead(f, Buf^, ft.SizeOfBMP);
      I:=0;
      for y := Bm.height - 1 downto 0 do
        begin
          for x := 0 to BM.width - 1  do
             begin
              t:=0;
              z:=0;
              t:=pal256[Buf^[i]] shl 24;
              t:=t shr 8;
              z:=pal256[Buf^[i]] shl 16;
              z:=z shr 24;
              t:=t or z shl 8;
              t:=t or pal256[Buf^[i]] shr 16;
              Bm.Canvas.Pixels[x,y]:=t;
              Inc(i);
             end;
          If Bm.Width mod 4<>0 then Inc(i,4-BM.Width mod 4);
         end;
      Image1.Picture.Graphic:=Bm;
      Freemem(buf);
    end;

 if (ft.BitPerPixel=4) and (ft.Compress=0) then
    begin
      {íà÷èíàåì ÷èòàòü ôàéë}
      If Bm.Width mod 2=1 then Bm.Width:=Bm.Width+1;
      BM.pixelformat := pf4bit;
      {ïðîïóñêàåì îïèñàíèå ôàéëà}
      for i:=0 to 15 do
         blockread(f,Pal16[i],4);
      GetMem(Buf, ft.SizeOfBMP);
      BlockRead(f, Buf^, ft.SizeOfBMP);
      I:=0;
      for y := Bm.height - 1 downto 0 do
          begin
           x:=0;
            repeat
              T:=0;
              z:=0;
              KK[1]:=(Buf^[i]) shr 4;
              KK[2]:=(Buf^[i]) shl 4;
              KK[2]:=KK[2] shr 4;
              t:=pal16[kk[1]] shl 24;
              t:=t shr 8;
              z:=pal16[kk[1]] shl 16;
              z:=z shr 24;
              t:=t or z shl 8;
              t:=t or pal16[kk[1]] shr 16;
              Bm.Canvas.Pixels[x,y]:=t;

              t:=pal16[kk[2]] shl 24;
              t:=t shr 8;
              z:=pal16[kk[2]] shl 16;
              z:=z shr 24;
              t:=t or z shl 8;
              t:=t or pal16[kk[2]] shr 16;
              Bm.Canvas.Pixels[x+1,y]:=t;
              x:=x+2;
              Inc(i);
            until x>=BM.width - 1;
             If Bm.Width mod 8<>0 then Inc(i,4-Bm.Width mod 8 div 2);
           end;
      Image1.Picture.Graphic:=Bm;
      FreeMem(buf);
    end;

if (ft.BitPerPixel=1) and (ft.Compress=0) then
    begin
      {íà÷èíàåì ÷èòàòü ôàéë}
      If Bm.Width mod 2=1 then Bm.Width:=Bm.Width+1;
      BM.pixelformat := pf4bit;
      {ïðîïóñêàåì îïèñàíèå ôàéëà}
      for i:=0 to 1 do
         blockread(f,Pal1[i],4);
      GetMem(Buf, ft.SizeOfBMP);
      BlockRead(f, Buf^, ft.SizeOfBMP);
      I:=0;
      for y := Bm.height - 1 downto 0 do
          begin
           x:=0;
            repeat
              KK[1]:=Buf^[i] shr 7;
              KK[2]:=Buf^[i] shl 1;
              KK[2]:=KK[2] shr 7;
              KK[3]:=Buf^[i] shl 2;
              KK[3]:=KK[3] shr 7;
              KK[4]:=Buf^[i] shl 3;
              KK[4]:=KK[4] shr 7;
              KK[5]:=Buf^[i] shl 4;
              KK[5]:=KK[5] shr 7;
              KK[6]:=Buf^[i] shl 5;
              KK[6]:=KK[6] shr 7;
              KK[7]:=Buf^[i] shl 6;
              KK[7]:=KK[7] shr 7;
              KK[8]:=Buf^[i] shl 7;
              KK[8]:=KK[8] shr 7;
              For j:=1 to 8 do
               begin
                t:=0;
                z:=0;
                t:=pal1[KK[j]] shl 24;
                t:=t shr 8;
                z:=pal1[KK[j]] shl 16;
                z:=z shr 24;
                t:=t or z shl 8;
                t:=t or pal1[KK[j]] shr 16;
                Bm.Canvas.Pixels[x+j-1,y]:=t;
               end;
                x:=x+8;
                Inc(i);
            until x>=BM.width - 1;
           If Bm.Width mod 32<>0  then Inc(i,4-ceil(Bm.Width mod 32 / 8));
          end;
      Image1.Picture.Graphic:=Bm;
      Freemem(buf);
    end;
closefile(f);
 end
 else showmessage ('Îòêðûâàåìûé ôàéë íå ÿâëÿåòñÿ ôàéëîì BMP');

end;

begin
 if OpenDialog1.Execute then
   name:=OpenDialog1.FileName;
   readfile(name);
end;

procedure TForm1.N3Click(Sender: TObject);
begin
close();
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Bm.Free;
end;

end.



PM MAIL   Вверх
p0s0l
Дата 10.11.2004, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



В былые времена как-то делал загрузку BMP, тут RLE4 и RLE8 поддерживаются. Не предусмотрен случай, когда Bmp хранится в перевёрнутом виде...

Код
procedure ShowBMP (const FileName : string; bmp : TBitmap);
var
 xSize, ySize : word;
 Adr_Pal, LineSize, LastBytes, MaxEDI : Cardinal;
 Data : Pointer;

 procedure Line1bit; assembler;
 asm
   push ebx
   movzx ecx, [xSize]
   add ecx, 7
   shr ecx, 3
   xor edx, edx
   xor eax, eax
   dec edx
 @@Loop:
   mov bl, [esi]

 @@Bit0:
   shl bl, 1
   jc @@Set0_1
   stosd
   jmp @@Bit1
 @@Set0_1:
   mov [edi], edx
   add edi, 4

 @@Bit1:
   shl bl, 1
   jc @@Set1_1
   stosd
   jmp @@Bit2
 @@Set1_1:
   mov [edi], edx
   add edi, 4

 @@Bit2:
   shl bl, 1
   jc @@Set2_1
   stosd
   jmp @@Bit3
 @@Set2_1:
   mov [edi], edx
   add edi, 4

 @@Bit3:
   shl bl, 1
   jc @@Set3_1
   stosd
   jmp @@Bit4
 @@Set3_1:
   mov [edi], edx
   add edi, 4

 @@Bit4:
   shl bl, 1
   jc @@Set4_1
   stosd
   jmp @@Bit5
 @@Set4_1:
   mov [edi], edx
   add edi, 4

 @@Bit5:
   shl bl, 1
   jc @@Set5_1
   stosd
   jmp @@Bit6
 @@Set5_1:
   mov [edi], edx
   add edi, 4

 @@Bit6:
   shl bl, 1
   jc @@Set6_1
   stosd
   jmp @@Bit7
 @@Set6_1:
   mov [edi], edx
   add edi, 4

 @@Bit7:
   shl bl, 1
   jc @@Set7_1
   stosd
   jmp @@End
 @@Set7_1:
   mov [edi], edx
   add edi, 4

 @@End:
   inc esi
   loop @@Loop
   add esi, [LastBytes]
   pop ebx
 end;

 procedure Line4bit; assembler;
 asm
   push ebx
   movzx ecx, [xSize]
   inc ecx
   shr ecx, 1
   mov ebx, [Adr_Pal]
   xor edx, edx
 @@Loop:
   mov dl, [esi]
   and dl, $f0
   mov eax, [ebx + edx]
   mov dl, [esi]
   stosd
   shl dl, 4
   mov eax, [ebx + edx]
   inc esi
   stosd
   loop @@Loop
   add esi, [LastBytes]
   pop ebx
 end;

 procedure Line8bit; assembler;
 asm
   movzx ecx, xSize
   mov edx, [Adr_Pal]
 @@Loop:
   xor eax, eax
   lodsb
   shl ax, 2
   mov eax, [edx + eax]
   stosd
   loop @@Loop
   add esi, [LastBytes]
   ret
 end;

 procedure Line24bit; assembler;
 asm
   movzx ecx, xSize
 @@Loop:
   movsd
   dec esi
   loop @@Loop
   add esi, [LastBytes]
   ret
 end;

 procedure LineRLE4; assembler;
 asm
   push ebx
   mov eax, edi
   add eax, [LineSize]
   mov [MaxEDI], eax
   mov ebx, [Adr_Pal]
   xor ecx, ecx

 @@Loop:
   inc esi
   and esi, $fffffffe
   lodsb
   test al, al
   jz @@CopyMode

 @@RepeatMode:
   mov cl, al
   xor eax, eax
   xor edx, edx
   lodsb
   mov dl, al
   shl dl, 4
   and al, $f0
   cmp al, dl
   jne @@Different
   mov eax, [ebx + edx]
   rep stosd
   jmp @@End

 @@Different:
   mov eax, [ebx + eax]
   mov edx, [ebx + edx]
   shr cl, 1
   pushf
   test cl, cl
   jz @@Dif2
 @@Dif:
   stosd
   mov [edi], edx
   add edi, 4
   loop @@Dif
 @@Dif2:
   popf
   jnc @@End
   stosd
   jmp @@End

 @@CopyMode:
   lodsb
   test al, al
   jz @@End
   mov cl, al
   xor edx, edx

 @@Copy:
   xor eax, eax
   lodsb
   mov dl, al
   shl dl, 4
   and al, $f0
   mov eax, [ebx + eax]
   stosd
   loop @@Copy2
   jmp @@End
 @@Copy2:
   mov eax, [ebx + edx]
   stosd
   loop @@Copy

 @@End:
   cmp edi, [MaxEDI]
   jb @@Loop
   add esi, 2
   pop ebx
   ret
 end;

 procedure LineRLE8; assembler;
 asm
   push ebx
   mov edx, edi
   add edx, [LineSize]
   mov ebx, [Adr_Pal]
   xor ecx, ecx

 @@Loop:
   inc esi
   and esi, $fffffffe
   lodsb
   test al, al
   jz @@CopyMode

 @@RepeatMode:
   mov cl, al
   xor eax, eax
   lodsb
   shl ax, 2
   mov eax, [ebx + eax]
   rep stosd
   jmp @@End

 @@CopyMode:
   lodsb
   test al, al
   jz @@End
   mov cl, al

 @@Copy:
   xor eax, eax
   lodsb
   shl ax, 2
   mov eax, [ebx + eax]
   stosd
   loop @@Copy

 @@End:
   cmp edi, edx
   jb @@Loop
   add esi, 2
   pop ebx
   ret
 end;

type
 PHeaderBMP = ^THeaderBMP;
 THeaderBMP = record
   fh : TBitmapFileHeader;
   ih : TBitmapInfoHeader;
 end;
 TRGBQuadPalette = array [0..255] of TRGBQuad;

const
 BMPHeaderSize = SizeOf(THeaderBMP);
 
var
 Pal_, bmpLine, LineProc : Pointer;
 HeaderBMP : PHeaderBMP absolute Data;
 y, BPL, LineLen, PalSize, Bits : word;
 Pal : TRGBQuadPalette;
 Adr, _biCompression, fSize : Cardinal;
 f : File;

begin
 Adr_Pal := Cardinal (@Pal);

 AssignFile (f, FileName);
 Reset (f, 1);
 fSize := FileSize(f);
 GetMem (Data, fSize);
 BlockRead (f, Data^, fSize);
 CloseFile (f);

 // Вычисляем, сколько цветов и размер палитры
 asm
   push esi
   mov esi, [HeaderBMP]
   mov eax, [esi + THeaderBMP.ih.biClrUsed]
   test ax, ax
   jnz @@ok1
   mov cl, [esi + THeaderBMP.ih.biBitCount]
   cmp cl, 8
   ja @@ok1
   inc al
   shl ax, cl
@@ok1:
   shl ax, 2
   mov [PalSize], ax
   pop esi
 end;

 with HeaderBMP^ do
 begin
   xSize := ih.biWidth;
   ySize := ih.biHeight;
   Bits := ih.biBitCount;
   _biCompression := ih.biCompression;
 end;

 if PalSize <> 0 then
 begin
   Pal_ := Pointer (Cardinal(Data) + BMPHeaderSize);
   if Bits <> 4 then Move (Pal_^, Pal, PalSize)
   else
     asm
       push esi
       mov esi, [Data]
       add esi, BMPHeaderSize
       mov edx, Adr_Pal
       mov ecx, 16
     @@Loop:
       lodsd
       mov [edx], eax
       add edx, 16
       loop @@Loop
       pop esi
     end;
 end;

 LineSize := xSize*4;

 case Bits of
   1  :
     begin
       LineProc := @Line1bit;
       LineLen := (xSize + 7) div 8;
     end;
   4  :
     begin
       LineProc := @Line4bit;
       LineLen := (xSize + 1) div 2;
     end;
   8  :
     begin
       LineProc := @Line8bit;
       LineLen := xSize;
     end;
   24 :
     begin
       LineProc := @Line24bit;
       LineLen := xSize * 3;
     end;
 end;
 if _biCompression = BI_RLE4 then LineProc := @LineRLE4
   else if _biCompression = BI_RLE8 then LineProc := @LineRLE8;
 BPL := ((xSize * Bits) + 31) and not 31;
 BPL := BPL div 8;
 LastBytes := BPL - LineLen;

 Adr := Cardinal(Data) + BMPHeaderSize + PalSize;

 bmp.PixelFormat := pf32bit;
 BMP.Width := xSize;
 BMP.Height := ySize;

 for y := ySize-1 downto 0 do
 begin
   bmpLine := BMP.ScanLine[y];

   asm
     push esi
     push edi

     mov esi, [Adr]
     mov edi, [bmpLine]

     call [LineProc]

     mov [Adr], esi

     pop edi
     pop esi
   end;
 end;

 FreeMem (Data);
end;
(тогда у меня мания была на asm и на скорость...)

Пример использования: showbmp('c:\1.bmp', image1.Picture.Bitmap);

PS: а обычный TBitmap не грузит RLE-сжатые картинки ?
Ты можешь выслать одну такую картиночку мне ?


--------------------
С уважением, г-н Посол.
PM   Вверх
Dmi-Afonin
Дата 11.11.2004, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



POSOL я отправил тебе на e-mail RLE файл, и если можно то помоги мне не используя ассемблер. А стандартные компоненты типа Bitmap мне использовать напрямую нельзя.
PM MAIL   Вверх
p0s0l
Дата 12.11.2004, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Вот так будет...
На присланной картинке (RLE4) работает...
На RLE8 теоретически тоже должно работать smile
Пример использования:
LoadRLE ('c:\vgalogo.rle', Form1.Canvas);

Код
procedure LoadRLE (const FileName : string; Canvas : TCanvas);
type
 PRGBQuadArray = ^TRGBQuadArray;
 TRGBQuadArray = array [0..255] of TRGBQuad;

var
 f : file;
 Data : Pointer;
 fh : PBitmapFileHeader absolute Data;
 ih : PBitmapInfoHeader;
 Pal : PRGBQuadArray;
 PalSize, Adr : Cardinal;
 x, y, yy, Height : integer;
 b, c : Byte;
 cl1, cl2 : TColor;
 CopyMode, Flipped : Boolean;

 procedure MakeColors (Index : byte);
 var i : byte;
 begin
   if ih.biCompression = BI_RLE4 then
   begin
     i := c shr 4;
     cl1 := RGB( Pal[i].rgbRed, Pal[i].rgbGreen, Pal[i].rgbBlue);
     i := c and $0F;
     cl2 := RGB( Pal[i].rgbRed, Pal[i].rgbGreen, Pal[i].rgbBlue);
   end
   else
     cl1 := RGB( Pal[c].rgbRed, Pal[c].rgbGreen, Pal[c].rgbBlue);
 end;

begin
 AssignFile (f, FileName);
 Reset (f, 1);
 GetMem (Data, FileSize(f));
 BlockRead (f, Data^, FileSize(f));
 CloseFile (f);

 ih := Pointer( Cardinal(fh) + SizeOf(fh^) );
 Pal := Pointer( Cardinal(ih) + SizeOf(ih^) );
 PalSize := ih.biClrUsed * 4;
 Adr := Cardinal(Pal) + PalSize;

 Height := ih.biHeight;
 Flipped := Height >= 0;
 if not Flipped then Height := -Height;

 for yy := 0 to Height-1 do
 begin
   y := yy;
   if Flipped then y := Height-y;
   
   x := 0;
   repeat
     Adr := (Adr+1) and $FFFFFFFE;
     b := PByte(Adr)^;
     c := PByte(Adr+1)^;
     Inc (Adr, 2);

     CopyMode := (b = 0);
     if CopyMode then b := c;

     while b > 0 do
     begin
       if CopyMode then
       begin
         c := PByte(Adr)^;
         Inc (Adr);
       end;

       MakeColors (c);
       Canvas.Pixels[x, y] := cl1;
       Inc (x);
       Dec (b);
       if (b > 0) and (ih.biCompression = BI_RLE4) then
       begin
         Canvas.Pixels[x, y] := cl2;
         Inc (x);
         Dec (b);
       end;
     end;

   until x >= ih.biWidth;

   Inc (Adr, 2);
 end;

 FreeMem (Data);
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Dmi-Afonin
Дата 13.11.2004, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Запрещено:

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

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

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

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


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

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


 




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


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

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