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


> I am looking for a way to get an Image into a pointer (besides arrays)
> and write it to my disk. I am using arrays right now, and works fine, but
> When  I get big images I run out of mem fast...  :: IBUF : array [1..30000]
> of byte; getimage(x1,y1,x2,y2,IBUF); repeat Write(f,IBUF[NUM]); num:=num+1;
> until num=sizeof(ibuf);
> This works as long as I dont try to grab a large image.

These "large images" are in fact stored in "planes", chunks of up to 64 kByte
in size. You must understand the VGA architecture to store these in a file.
The only VGA video mode that keeps all data (from the programmer's point of
view) into a single data space is mode 13h (320x200 with 256 colours): a simple
array [1..200, 1..320] of Byte.  The other video modes require you to access
the VGA hardware: take for example 640x480 by 16 colours: 4 planes of 38,400
bytes (Red, Green, Blue and Intensity).  Together with the colour information
as returned by BIOS call INT 10h/AX=1012h they make up the picture.

Here's how you select a plane:

Procedure SwitchBitplane(plane : Byte); Assembler;

  MOV   DX, 3C4h
  MOV   AL, 2
  OUT   DX, AL
  INC   DX
  MOV   AL, plane
  OUT   DX, AL

Assume the video mode to be 12h (640x480/16 colours), BitplaneSize = 38400, and
Bitplane is an Array[0..3] of pointer to an array [1..38400] of Byte:
      For i := 0 to 3 Do
          SwitchBitplane(1 shl i);
          Move(Bitplane[i]^, Ptr($A000, $0000)^, BitplaneSize);
This is a snippet of code lifted from my VGAGRAB package; a TSR that dumps
graphic information (any standard VGA mode) to a disk file by pressing
<PrtScr>, plus a few demo programs written in TP - with source code.  Available
on FTP sites.

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