Solved

Reading BMP and PCX

Posted on 1998-09-12
4
382 Views
Last Modified: 2012-06-27
Can someone send me a code in Turbo PASCAL 6.0 for reading and drawing pictures in BMP and PCX format, with resolution 640X480, and 256 colour?
0
Comment
Question by:milance
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 
LVL 2

Expert Comment

by:omsec
ID: 1215537
I've actually have loaders for 320x200x256 with sources. I will see if I can find something in your desired mode ;)
0
 

Accepted Solution

by:
Bernard_Lee earned 100 total points
ID: 1215539
Try searching the internet for the stuff. "x2ftp.oulu.fi" is one of the best resources on graphics and games programming. While I can not promise you will find what you want, you will get both explanation of PCX and BMP file format.

p.s PCX and BMP and others file format exists in x2ftp.oulu.fi in the directory /msdos/programming/format
0
 

Expert Comment

by:Raid
ID: 1215540
{ This is my first answer to Experts-Exchange(I'm New)
  By Raid

BMP File Loader: (256 color)
 There is 3 parts to a BMP.
  1st Part: Header
  2nd Part: Color Declaration
  3rd Part: Graphic }

Uses
 Crt, graph;

Type
 ColorType = Record
  Blue: Byte;
  Green: Byte;
  Red: Byte;
  Reserved: Byte;
 End;

Procedure LoadBMP(FileName: String);
Var
 Color: Byte;
 LoopVar: Byte;
 ReadVar: Byte;
 BitsPerPlane: Word;
 BitsPerPixel: Word;
 LoopX: Word;
 LoopY: Word;
 BMPSizeX: Longint;
 BMPSizeY: Longint;
 BitCompression: Longint;
 ColorsUsed: Longint;
 ColorsImportant: Longint;
 ImageSize: Longint;
 ResX: Longint;
 ResY: Longint;
 Colors: array[0 .. 255] of ColorType;
 FileVar: File;
Begin
 assign(FileVar, FileName); reset(FileVar, 1); { Open BMP }
 { Now, lets load the header(1st Part) }
 { The first 18 bytes in the file }
 { have nothing to do with the graphic }
 for LoopVar := 1 to 18 do blockread(FileVar, ReadVar, 1);
 { Read The next 4 Bytes(Longint) which is the width of the BMP }
 blockread(FileVar, BMPSizeX, 4);

 { Read The next 4 Bytes(Longint) which is the length of the BMP }
 blockread(FileVar, BMPSizeY, 4);

 { Read The next 2 Bytes(Word) for the number of Bits per plane }
 blockread(FileVar, BitsPerPlane, 2);

 { Read The next 2 Bytes(Word) for the number of Bits per pixel }
 { Bits per pixel example }
 { Lets say the value is 8, that means 8 Bits per pixel, in other }
 { words that means 256 Colors }
 { 8-Bits is a Byte(256 Values) }
 { 16-Bits is a Word(65536 Values) }
 { 24-Bits is a Lonting(-2 Million to 2 Million, Roughly) }
 blockread(FileVar, BitsPerPixel, 2);

 { Next, we read the bit compression Value, which is 4 Bytes(Longint) }
 { Don't worry about this, because most BMPS don't have bit compression }
 blockread(FileVar, BitCompression, 4);

 { The next 4 Bytes(Longint) is the size of the BMP Graphic }
 { Size of Graphic should be BMPSizeX * BMPSizeY }
 blockread(FileVar, ImageSize, 4);

 { The next 4 Bytes(Longint) is the resolution width }
 { Don't worry about this, because it has to do with windows }
 { I presume. }
 blockread(FileVar, ResX, 4);

 { And the next 4 Bytes(Longint) is the resolution length }
 { also don't worry about it }
 blockread(FileVar, ResY, 4);

 { The next 4 Bytes(Longint) is how many colors there are used }
 { in the BMP. }
 blockread(FileVar, ColorsUsed, 4);

 { And the Next 4 Bytes(Longint) is how many colors are important }
 { This is the value that you are looking for of how many colors }
 { There are in the BMP }
 blockread(FileVar, ColorsImportant, 4);

 { -Phew- done loading the Header.  Now lets go on to loading the colors }
 { which is the 2nd Part }
 { The colors are saved like this: }
 { Color 0:        }
 {  Blue(Byte)     }
 {  Green(Byte)    }
 {  Red(Byte)      }  
 {  Reserved(Byte) }
 { Color 1:        }
 {  Blue(Byte)     }
 {  Green(Byte)    }
 {  Red(Byte)      }  
 {  Reserved(Byte) }
 { Color 2:        }
 {  Blue(Byte)     }
 {  Green(Byte)    }
 {  Red(Byte)      }  
 {  Reserved(Byte) }
 { etc. }
 { Load Colors into Variable }
 for LoopVar := 0 to ColorsImportant - 1 do begin
  blockread(FileVar, Colors[LoopVar], SizeOf(ColorType));
 end;
 { To Palette the Colors Quickly, do this }
 port[$3c8] := 0; { Start at color 0 }
 for LoopVar := 0 to ColorsImportant - 1 do begin
  port[$3c9] := Colors[LoopVar].Red;
  port[$3c9] := Colors[LoopVar].Green;
  port[$3c9] := Colors[LoopVar].Blue;
 end;
 { or you could set the palette using SetRGBPalette }
 { eep! }

 { Then, (Finally) we load the 3rd part, which is the graphic }
 { The graphic is saved funny, I don't know why the people who }
 { designed the BMP saved from left-right, down-up.  Instead of }
 { left-right, up-down.  I guess they wanted to be different }
 { Ok, lets draw it }

 for LoopY := BMPSizeY downto 1 do begin
  for LoopX := 1 to BMPSizeX do begin
   blockread(FileVar, Color, 1);
   putpixel(LoopX - 1, LoopY - 1, Color);
  end;
 end;

 close(FileVar); { Close BMP }

 { If you have any questions, contact RAID }
End;




0
 

Expert Comment

by:Raid
ID: 1215541
{ Sorry Miliance, The one above was not tested
  and it does not work }
{ So here is the working version }
{ You will have to set the screen mode yourself though }
{ If you want a program and a driver of 256 colors (.BGI) }
{ I can give you one. }

{BMP File Loader: (256 color)
 There is 3 parts to a BMP.
  1st Part: Header
  2nd Part: Color Declaration
  3rd Part: Graphic }

Uses
 Crt, graph;

Type
 ColorType = Record
  Blue: Byte;
  Green: Byte;
  Red: Byte;
  Reserved: Byte;
 End;

Procedure LoadBMP(FileName: String);
Var
 Color: Byte;
 LoopVar: Word;
 ReadVar: Byte;
 BitsPerPlane: Word;
 BitsPerPixel: Word;
 LoopX: Word;
 LoopY: Word;
 BMPSizeX: Longint;
 BMPSizeY: Longint;
 BitCompression: Longint;
 ColorsUsed: Longint;
 ColorsImportant: Longint;
 ImageSize: Longint;
 ResX: Longint;
 ResY: Longint;
 Colors: array[0 .. 255] of ColorType;
 FileVar: File;
Begin
 assign(FileVar, FileName); reset(FileVar, 1); { Open BMP }
 { Now, lets load the header(1st Part) }
 { The first 18 bytes in the file }
 { have nothing to do with the graphic }
 for LoopVar := 1 to 18 do blockread(FileVar, ReadVar, 1);
 { Read The next 4 Bytes(Longint) which is the width of the BMP }
 blockread(FileVar, BMPSizeX, 4);

 { Read The next 4 Bytes(Longint) which is the length of the BMP }
 blockread(FileVar, BMPSizeY, 4);

 { Read The next 2 Bytes(Word) for the number of Bits per plane }
 blockread(FileVar, BitsPerPlane, 2);

 { Read The next 2 Bytes(Word) for the number of Bits per pixel }
 { Bits per pixel example }
 { Lets say the value is 8, that means 8 Bits per pixel, in other }
 { words that means 256 Colors }
 { 8-Bits is a Byte(256 Values) }
 { 16-Bits is a Word(65536 Values) }
 { 24-Bits is a Lonting(-2 Million to 2 Million, Roughly) }
 blockread(FileVar, BitsPerPixel, 2);

 { Next, we read the bit compression Value, which is 4 Bytes(Longint) }
 { Don't worry about this, because most BMPS don't have bit compression }
 blockread(FileVar, BitCompression, 4);

 { The next 4 Bytes(Longint) is the size of the BMP Graphic }
 { Size of Graphic should be BMPSizeX * BMPSizeY }
 blockread(FileVar, ImageSize, 4);

 { The next 4 Bytes(Longint) is the resolution width }
 { Don't worry about this, because it has to do with windows }
 { I presume. }
 blockread(FileVar, ResX, 4);

 { And the next 4 Bytes(Longint) is the resolution length }
 { also don't worry about it }
 blockread(FileVar, ResY, 4);

 { The next 4 Bytes(Longint) is how many colors there are used }
 { in the BMP. }
 blockread(FileVar, ColorsUsed, 4);

 { And the Next 4 Bytes(Longint) is how many colors are important }
 { This is the value that you are looking for of how many colors }
 { There are in the BMP }
 blockread(FileVar, ColorsImportant, 4);

 { -Phew- done loading the Header.  Now lets go on to loading the colors }
 { which is the 2nd Part }
 { The colors are saved like this: }
 { Color 0:        }
 {  Blue(Byte)     }
 {  Green(Byte)    }
 {  Red(Byte)      }  
 {  Reserved(Byte) }
 { Color 1:        }
 {  Blue(Byte)     }
 {  Green(Byte)    }
 {  Red(Byte)      }  
 {  Reserved(Byte) }
 { Color 2:        }
 {  Blue(Byte)     }
 {  Green(Byte)    }
 {  Red(Byte)      }  
 {  Reserved(Byte) }
 { etc. }
 { Load Colors into Variable }
 if ColorsImportant = 0 then ColorsImportant := 256;
 for LoopVar := 0 to ColorsImportant - 1 do begin
  blockread(FileVar, Colors[LoopVar], SizeOf(ColorType));
 end;
 { To Palette the Colors Quickly, do this }
 port[$3c8] := 0; { Start at color 0 }
 for LoopVar := 0 to ColorsImportant - 1 do begin
  port[$3c9] := Colors[LoopVar].Red div 4;
  port[$3c9] := Colors[LoopVar].Green div 4;
  port[$3c9] := Colors[LoopVar].Blue div 4;
 end;
 { or you could set the palette using SetRGBPalette }
 { eep! }

 { Then, (Finally) we load the 3rd part, which is the graphic }
 { The graphic is saved funny, I don't know why the people who }
 { designed the BMP saved from left-right, down-up.  Instead of }
 { left-right, up-down.  I guess they wanted to be different }
 { Ok, lets draw it }

 for LoopY := BMPSizeY downto 1 do begin
  for LoopX := 1 to BMPSizeX do begin
   blockread(FileVar, Color, 1);
   putpixel(LoopX - 1, LoopY - 1, Color);
  end;
 end;

 close(FileVar); { Close BMP }

 { If you have any questions, contact RAID }
End;

Begin
 { Example }
 { LoadBMP('C:\WINDOWS\CLOUDS.BMP'); }
End.
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article provides a convenient collection of links to Microsoft provided Security Patches for operating systems that have reached their End of Life support cycle. Included operating systems covered by this article are Windows XP,  Windows Server…
We take a look at some of the most common obstacles that IT teams run into as they work relentlessly to keep all the alarms and sirens from going off at once.
Monitoring a network: why having a policy is the best policy? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the enormous benefits of having a policy-based approach when monitoring medium and large networks. Software utilized in this v…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question