Герасим писал(а):Вот это меня и озадачивает. У школоты в школе PutImage работает, но дома нет.
Там картинка специальная заранее подготовленная. Формат другой, а расширения совпадают.
Модератор: Модераторы
Герасим писал(а):Вот это меня и озадачивает. У школоты в школе PutImage работает, но дома нет.
Игры последние -надцать лет используют по никсами opengl, а под виндой - ее же или directx.Лекс Айрин писал(а):Да и, допустим, игры часто требуют полного экрана.
Безусловно - это ясно из документации по PutImage, что там не стандартный bmp формат.Pavia писал(а):Там картинка специальная заранее подготовленная. Формат другой, а расширения совпадают.
{$MODE DELPHI}
{$APPTYPE CONSOLE}
program testwingraph;
uses WinGraph, WinCrt;
function GetBitmap(const AFilename: string):pointer;
var F: file;
size: Integer;
begin
Result:=nil;
AssignFile(F, AFilename);
Reset(F, 1);
size:=Filesize(F);
GetMem(Result, size);
BlockRead(F, Result^, size);
CloseFile(F);
end;
const cFilename = 'test.bmp';
var gd, gm: smallint;
p:pointer = nil;
bExit: Boolean = False;
ch:char = #0;
begin
gd:=Detect;
gm:=0;
InitGraph(gd, gm, 'Put Image demo');
if GraphResult <> grOk then begin
writeln(errOUtput, 'Initgraph error');
Halt(1);
end;
p:=GetBitmap(cFilename);
PutImage(0, 0, p^, normalput);
FreeMem(p);
repeat
bExit:=CloseGraphRequest;
if KeyPressed then begin
ch:=Readkey;
bExit:= bExit or (ch = #27);
end;
until bExit;
CloseGraph;
end.
PutImage(0, 0, p^, normalput);
Mavlyudov писал(а):Падает на FreeMem(p);
На форме риcуется же просто через Canvax.Pixels[x,y]:=clColor;
А тут нет. Может что с указателем?
Может надо указатель делать так var p:^TBitmap ?
procedure TForm1.FormPaint(Sender: TObject);
Const
B:TBitmap=nil;
begin
If B = nil then begin
B:=TBitmap.Create ;
B.LoadFromFile('Pic.bmp');
end;
Form1.Canvas.Draw(100,100,b);
//(освобождение памяти по B.free; но в этом коде это делать не нужно )
end;
Alex2013 писал(а):На форме рисуется же просто через Canvax.Pixels
Mavlyudov писал(а):Тут вся соль в том, чтобы файл прочитать не средствами TBitmap, а как файл, через BlockRead(F, Result^, size);
procedure Load_Bitmap_From_DUMP (Var B: TBitmap);
Var
F:File;
P:Pointer;
begin
Assign(F,'Pic.IMG');
Reset (F,1);
B.BeginUpdate(False);
P:= B.RawImage.Data;
BlockRead(F, P^, B.RawImage.DataSize);
B.EndUpdate(False);
close(f);
end;
Bmp: = TBitmap.Create ;
Bmp.PixelFormat:=pf24bit;// или pf32bit и т.п.
Bmp.SetSize(w,h);
var
Buf: array[0..32767] of Byte;
w,h,i:integer;
function TakeBitmap:pointer;
var F: file;
size: Integer;
// P1:Pointer;
AFilename: string;
begin
AFilename := 'i:\image.bmp';
AssignFile(F, AFilename);
Reset(F, 1);
//Пропускаем 14 байт заголовка BitMapFileHeader
//и 40 байт BitMapInfoHeader
Seek(F, 55);
BlockRead(F, buf, size);
CloseFile(F);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
w:=260;
h:=260;
Bmp:=TBitmap.Create ;
Bmp.PixelFormat:=pf8bit;
Bmp.Width:=w;
bmp.Height:=h;
p:=TakeBitmap;
Move(p, Bmp, w*h);
Form1.Canvas.Draw(100,100,Bmp);
end;
procedure TForm1.Button2Click(Sender: TObject);
Var
F:File;
PDUMP:Pointer;
Size:Integer;
bi:BitmapInfo;
begin
w:=260;
h:=260;
with bi.bmiHeader do begin
biSize:= SizeOf(TBitmapInfoHeader);
biWidth:= w;
biHeight:= h;
biPlanes:= 1;
biBitCount:= 4;
biCompression:= BI_RGB;
biSizeImage:= 0;
biXPelsPerMeter:= 0;
biYPelsPerMeter:= 0;
biClrUsed:= 0;
biClrImportant:= 0;
end;
AssignFile(F,'i:\image.bmp');
Reset (F,1);
Size:=FileSize(F);
GetMem(PDUMP,Size);
BlockRead(F, PDUMP^,Size);
CloseFile(F);
StretchDIBits(Form1.Canvas.Handle,
0,0, Form1.Width, Form1.Height,
0, 0, w, h,
PDUMP,
bi,
0, SRCCOPY);
end;
Move(PDUMP, Bmp, w*h*size);
Form1.Canvas.Draw(100,100,Bmp);
Move(PDUMP, Bmp.scanline[0]^, w*h*bpp);
Form1.Canvas.Draw(100,100,Bmp);
B.BeginUpdate(False);
Move(PDUMP, Bmp.scanline[0]^, w*h*bpp);
B.EndUpdate(False);
Form1.Canvas.Draw(100,100,Bmp);
Form1.PaintBox1.Canvas.Draw(100,100,Bmp);
Form1.PaintBox1.Refresh;
Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2