[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
STEFAN XENOS

> I am able to load an image into a buffer and display it with PutImage ect.,
> but I would like to load the image from disk instead of with getimage.

Name: ImageStuff.Pas
Purpose: ImageStuff is a unit for storing bitmaps in dynamic variables and
         writing them to disk.
Progger: Stefan Xenos

This unit is public domain.}

Unit ImageStuff;

interface

Uses
 Graph;

Type
  Image = Record
    BitMap : Pointer;
    Size   : Word;
 end;

Procedure Get(X1, Y1, X2, Y2 : Word; Var aImage : Image);
Procedure Put(X, Y : Word; aImage : Image; BitBlt : Word);
Procedure Kill(Var aImage : Image);
Procedure Save(Var F : File; aImage : Image);
Procedure Load(Var F : File; Var aImage : Image);

implementation

Procedure Get(X1, Y1, X2, Y2 : Word; Var aImage : Image);
{Clips an image from the screen and store it in a dynamic variable}
Begin
  aImage.bitmap := nil;
  aImage.size   := ImageSize(X1, Y1, X2, Y2);
  GetMem(aImage.BitMap,aImage.Size);    {Ask for some memory}
  GetImage(X1, Y1, X2, Y2, aImage.BitMap^); {Copy the image}
End;

Procedure Put(X, Y : Word; aImage : Image; BitBlt : Word);
Begin
  PutImage(X, Y, aImage.BitMap^, BitBlt);   {Display image}
End;

Procedure Kill(Var aImage : Image);
{Frees up the memory used by an unwanted image}
Begin
  FreeMem (aImage.BitMap, aImage.Size); {Free up memory used by image}
  aImage.Size   := 0;
  aImage.BitMap := Nil;
End;

Procedure Save(Var F : File; aImage : Image);
{Saves an image to disk. File MUST already be opened for write}
Begin
  BlockWrite(F, aImage.Size, 2);             {Store the image's size so that
                                            it may be correctly loaded later}
  BlockWrite(F, aImage.BitMap^, aImage.Size); {Write image itself to disk}
End;

Procedure Load (Var F : File; Var aImage : Image);
{Loads an image off disk and stores it in a dynamic variable}
Begin
 BlockRead(F, aImage.Size, 2);              {Find out how big the image is}
 GetMem(aImage.BitMap, aImage.Size);        {Allocate memory for it}
 BlockRead(F, aImage.BitMap^, aImage.Size)  {Load the image}
End;

Begin
End.

{
Here's some source which should help you figure out how to use the unit I
just sent.
}

{By Stefan Xenos}
Program ImageTest;

Uses
  Graph,
  ImageStuff;

Var
  Pic      : Image;
  LineNum  : Byte;
  DataFile : File;
  GrDriver,
  GrMode   : Integer;

Const
 FileName = 'IMAGE.DAT';
 MaxLines = 200;

Begin
 {Initialise}
 DetectGraph(GrDriver, GrMode);
 InitGraph(GrDriver, GrMode, '');
 Randomize;

 {Draw some lines}
 For LineNum := 1 to MaxLines do
 begin
   setColor(random (maxcolors));
   line(random(getmaxx), random(getmaxy), random(getmaxx), random(getmaxy));
 end;

 {Copy image from screen}
 Get(100, 100, 150, 150, Pic);

 readLn;

 {Clear screen}
 ClearDevice;

 {Display image}
 Put(100, 100, Pic, NormalPut);

 readLn;

 {Clear screen}
 ClearDevice;

 {Save image to disk}
 Assign(DataFile, FileName);
 Rewrite(DataFile, 1);
 Save(DataFile, Pic);
 Close(DataFile);

 {Kill image}
 Kill(pic);

 {Load image from disk}
 Assign(DataFile, FileName);
 Reset(DataFile, 1);
 Load(DataFile, pic);
 Close(DataFile);

 {Display image}
 Put(200, 200, Pic, NormalPut);

 readLn;

 CloseGraph;
 WriteLn(Pic.size);
End.

[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]