Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Reading BMP and PCX

Posted on 1998-09-12
4
Medium Priority
?
408 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 400 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

Important Lessons on Recovering from Petya

In their most recent webinar, Skyport Systems explores ways to isolate and protect critical databases to keep the core of your company safe from harm.

Question has a verified solution.

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

Sometimes Administrators rights are not enough. These cases call for the SYSTEM account. The process in this article outlines the steps required to execute commands using the SYSTEM account.
Working from home is a dream for many people who aren’t happy about getting up early, going to the office, and spending long hours at work. There are lots of benefits of remote work for employees.
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : http://www.videocopilot.net/presets/after_shake/ All lightning effects with instructions : http://www.mediaf…
How to fix incompatible JVM issue while installing Eclipse While installing Eclipse in windows, got one error like above and unable to proceed with the installation. This video describes how to successfully install Eclipse. How to solve incompa…
Suggested Courses

610 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