INDEX


Reading a Bitmap file in Delphi


     If you ever need to maniipulate the bits and the information in a bitmap file you will need to go beyond the standard loading and saving functions available in Delphi. The following page describes the Bitmap file format and includes code for directly reading a bitmap file. Note that the code only applies to Windows bitmaps (not OS/2 bitmaps) and at the moment while it reads in Run Length Encoded bitmaps it does not decompress them (what you get is some garbled pixels along the bottom of the bitmap.) If you try to use the routine on an OS/2 bitmap, however, as it is currently written right now it will raise an exception. What I find I need at the moment is a way to directly manipulate Windows formatted bitmaps, and that is what the procedural code included here does.


You can download the source as a Delphi 3/ Delphi 5 project here -> bitmap.zip 9 KB

You can also download the source as a simple text file here -> bitmap.txt

Note that these files are also included in the larger zip files posted at the top of the Main Delphi index page on this site...


     The Bitmap file format begins with a file header, declared in the code as follows:

type

TBitmapFileHeader = record
  bmfIdentifier : Word; {'BM'}
  bmfFileSize : dWord;
  bmfReserved : dWord;
  bmfBitMapDataOffset : dWord; {from begin of file}
end;


     The first two bytes identify the file as a bitmap file, and contain the byte values for the letters 'BM'. OS/2 formatted bitmaps are supposed to use their own tags in this field, but I have found that they can also start with the letters 'BM', which isn't helpful if you want to avoid loading an OS/2 formatted bitmap, if you want to identify the bitmap as being in OS/2 format. The other possible values for this field are supposed to be as follows : ‘BA’ : OS/2 Bitmap Array; ‘CI’ : OS/2 Color Icon; ‘CP’ : OS/2 Color Pointer; ‘IC’ : OS/2 Icon; ‘PT’ : OS/2 Pointer... I have not encountered any OS/2 files matching these types, but as I mentioned, I have found that OS/2 bitmaps, rather than beginning with 'BA' can be found to start with 'BM' which is the Microsoft Windows format tag for their version of the Bitmap format (thus raising an exception when the code expects data in the specified format but finds something else instead.)

     The Filesize field specifies the total size of the file, including the header data, and the Offset field indicates where the actual bits that describe the bitmap begin, offset from the very beginning of the file.

     The file header is followed immediately by the Bitmap info header, declared in the accompanying code segment as follows:

TBitmapInfoHeader = record
  biSize: Longint; {size of tbitmapinfoheader = 40}
  biWidth: Longint; {bitmap width}
  biHeight: Longint; ( height of bitmap)
  biPlanes: Word; {always 1}
  biBitCount: Word; {number color bits 4 = 16 colors, 8 = 256 pixel is a byte}
  biCompression: Longint; {compression used, 0 }
  biSizeImage: Longint; ( size of the pixel data)
  biXPelsPerMeter: Longint; {not used, 0 }
  biYPelsPerMeter: Longint; {not used, 0 }
  biClrUsed: Longint; {number of colors used}
  biClrImportant: Longint; {important colors}
end;


     The first few fields are self explanatory. The Bitcount field specifies how a pixel is encoded in the pixel data. For example a nibble (4 bits) specifies that each 8 bit byte encodes two pixels, and so on, and the bitcount also directly relates to the color count (4 bits can encode 16 possible values giving the bitmap a total of 16 colors.) This field corresponds to the ClrUsed field if the bitmap is actually using all its possible colors, however if, for example an 8 bit bitmap, with 256 possible colors, has '200' in the ClrUsed field, then the size of the palette of the bitmap will be '200' and the additional 56 possible values are ignored. The PelsPerMeter fields doesn't seem to be particularly important, is often just set to zero, and is supposed to describe how many pixels are to be displayed in one meter of space (in case anyone has a monitor a meter wide). This seems to relate to how the bitmap was intended to be displayed and viewed. The ClrImportant field is intended to describe how many colors in the palette are important to properly display the bitmap, since it is possible for an operating system to map a bitmap to the system palette. The 'important colors' are supposed to be the first ones entered into the palette data of the bitmap which immediately follows the bitmap info header.

     The compression field can contain information on whether or not the bitmap is RLE compressed, and is also supposed to identify certain types of OS/2 compression (thus giving a person a second chance to identify an OS/2 encoded bitmap and avoid raising an exception). The possible values for the compression field are described as being :

0 (or BI_RGB) : none
1 (or BI_RLE8) : RLE 8-bits per pixel
2 (or BI_ RLE4) : 4-bit / pixel
3 (or BI_BITFIELDS) : Bitfields


     You should note here that it is possible that the information I base this on was in error and that the values for 1 and 2 should be swapped (1 = RLE 4 and 2 = RLE 8). The only way to be sure is to decode a Run Length Encoded bitmap and see what happens, something I have not yet done, but I just mention this because it seems to me that 4 should come before 8. The algorithms for Run Length Encoding are standard and confirming this information one way or another is simply a matter of implementing the code. For the purposes of this code this field should be '0' (an uncompressed bitmap).

      The Bitmap info header is followed by a color palette if the bitcount of the graphic file is less than or equal to 8. Bitmaps with a palette of more than 256 colors do not include a palette but rather the bits of the map for each pixel encode values that are mapped to the system palette. Each entry in the palette consists of 4 bytes, a red value, a green value, and a blue value, and a normally unused value referred to as a 'flag'. The fourth value in the RGB quad appears to be in place because of the architecture of the Intel processors (which align data on four byte boundaries or something to that effect). However I have found that by setting the flag byte a bit map can be covered with a colored 'film', which seems to be a clue that if one wants to 'select' an icon, this can be done by setting a value in the flag section of the RGB quad, resulting in a blue 'film' over the selected object. (By setting this value to '255' if I remember right, I got a purplish film over an icon, not the familiar blue, and I haven't explored the matter much more after that, but as I said, this seems to be a clue as to how to go about changing the color of a selected graphic).

     The structure of an RGB quad is as follows:

TRGBQuad = record
  rgbRed: Byte;
  rgbGreen: Byte;
  rgbBlue: Byte;
  rgbReserved: Byte;
end;


     It is not actually required to declare an RGB quad in code, since it is encapsulated in Logical Palette structure of the API. RGB quads are not used directly by the system, but rather are converted to system color values by the API. In order to get a RGB quad palette converted by the API into a form actually used by the system it must be encapsulated in a 'LogPalette' structure:

tagLogPalette = record
  palVersion : word; { $300 hex is the standard version at present}
  palNumEntries : word; {the Color Count, number of entries in palette}
  palPalEntry : PALETTEENTRY; {first member of array of RGB quad structures}
end;


     An example of declaring this structure, reading in the palette values, converting it to system palette, and then passing the handle to this palette to a bitmap is included in the source code related to this page. It seems strange to me, but if you read in an RGB quad in the order, red, green, blue, you get a backwards colored bitmap, while if you read it in as 'blue, green, red' you get a normal colored bitmap after creating the palette.

     After the RGB quads which describe the palette (if the bitmap uses 8 bits or less and a palette exists) comes the actual bits which describe the pixels of the bitmap (the size of which is described in the 'SizeImage' field of the Bitmap Info Header). If there are more than 8 bits and more than 256 colors in the Bitmap the pixel data immediately follows the header.

      The code segment that accompanies this page should be pretty straightforward and easy to understand. Two memos are used to display the file header info, and the bitmap info header entries. The procedure opens the bitmap file as an untyped binary file set to read 1 byte and then proceeds to read in the values of the headers. It then allocates memory for the Logical Palette structure based on the color count and the number of entries in the palette (if one exists on disk). It then reads in the palette bytes, filling in the structure, calls the API to create the system palette, and uses the returned handle to assign this palette to the bitmap being created. The height, width, and pixel format of the bitmap are set as specified in the header file. Bitmaps are stored upside down (much as the palette seems to be as described above) and so finally the routine reads in each line of the bitmap from disk and fills in the created bitmap from the bottom up. The completed bitmap is displayed in an image.


Delphi INDEX




A Unified Field Theory

failed_gravity_theory.gif - 10361 Bytes



The Unified Field Theory
is also available as a zip file ->
unified.zip

Introduction :The Pioneer Effect and the New Physics. A brief description of the new physics required to explain the 'Pioneer Effect', which is the constant deceleration of space craft as they fly through space.




Principles of Evolution: A Study in the Evolution of Bedbugs



A couple of years ago my bedroom was invaded by bedbugs. There were two variant genetic lines. One type of bedbug was an enlongated, thin, tubular insect, and the second genetic line was a flat, perfectly circular insect. The result of the cross breeding of these two genetically distinct variants was the production of a bedbug with charcteristics of both, an enlongated, flat bedbug with a central bulge (such that the shape of the bedbug was somewhere between 'long' and 'circular'). The long skinny bedbugs were such strange and unfamiliar looking insects that at first I did not recognize them as being bedbugs, and considered them to be a seperate species of insect. However, as the photographs of bedbugs above indicate, enlongated and skinny bedbugs are not uncommon, and the photographs also show the variants that are produced by genetic combinations that result in an insect somewhere in between 'circular' and 'enlongated'.

Therefore it is my hypothesis that evolution occurs by means of the transfer of dominate genes, with the production of such dominant genes being the product of 'biological algorithms', a genetic software program that brings physical characteristics into harmony with behavior, such that when behavior changes, and a conflict then exists, this acts as a trigger and causes the release of dominant genes. The result is rapid evolution of species. The bedbug is a relatively new insect, not the product of millions of years of evolution but rather an insect that is evolving in real time. The newly emerging dominant form of the insect is the flat, round ciruclar insect, well adapted to living in human bedrooms (it is flat, rather than tubular, thus allowing it to hide in the smallest cracks, living a stealthy lifestyle, and it is round, which gives the insect a maximum storage capacity such that it must endanger itself only a few times a month by emerging to feed.

Other examples of rapid evolution include the development of long legs in an invasive species of toad in Australia. As the toads move into the mountainous regions of Australia, and their behvaior changes, making them 'climbing toads', over the course of just a couple of decades the toads in the highlands have grown long legs specially adapted to climbing. It is worth noting here that the toads are poisonous, and are a successful invasive species because they have no natural predators in Australia, and so it would not be the case that the toads with long legs were 'the fittest survivors', because all the toads are survivors, and therefore predation does not explain the rapid emergence and spread of such well adapted, long legged toads. Once again we see evidence for the existence of biological algorithms and the rapid spread of dominant genes through a population, which once introduced proceed to overwhelm the older genes which are being replaced (making toad long legged and a bed bug round and flat).


A Theological Experiment

My interest in pursuing the Unified Field Theory is spurred on by my need to discover the theoretical explanation of a new form of propulsion (as explained on this page: Why the Unified Field Theory?). The experiment involving the bedbugs came out of nowhere.

I also believe that it is possible to justify theological propositions using experimental methods. If a thing is an objective truth then it can be verified and proven true by means of experimentation. Such a theological proposition is of more value than a ‘divine revelation’, since such revelations depend upon nothing more than establishing authority figures which requires the creation of artificial hierarchies, for the only reason why I might be encouraged to believe an authority figure who orders me to believe unsubstantiated opinions is if I could somehow be convinced that this authority possessed a mind that was somehow superior to mine, and thus was fit to express opinions as though opinions were unquestionable facts and thus worthy of being elevated to the status of absolute dogma.

There is a self evident human inequality which is visibly apparent. Some people are ‘beautiful’ and thus are the true elite on this planet, and some people are not. It is this sexual inequality and the degeneration that follows upon beauty that is the true driving force behind all the evil that happens on earth. The need for ruthless oppression and the pursuit of wealth and the consequent creation of suffering and poverty which must follow upon this practice is for the purpose of creating an artificial alpha elite.

The true elites are the young and the beautiful. The artificial elite are the rich and the wealthy. The elite aging rich artificial alpha male has no good looks, for he is physically degenerate, but he will be found escorting beauty because he has a beautiful wallet. If he loses his wallet he will be found at home with all the other unattractive aged beta males sitting in a rocking chair watching reruns of Bonanza. No money, no sex. It is for this reason that the alpha males are found to be so ruthless and so violent in pursuit of their goal. The alpha male has fallen. The beta male has arisen and now the whole planet is full of ruinous destruction for it.

We see in religion a confused and contradictory reaction to this reality. On the one hand religion preaches a sexless heaven where castration and the clitorectomy create ‘pure spirits’. Muslims throw women under sacks. On the other hand religion supports hierarchy and is the prop of the elite alpha male. It is for this reason that religion is incoherent when it comes to speaking about sex.

Now we see this same principle at work in all of nature. Guppies dance and show off their colorful tails and the guppy who dances with the most colorful tail is the sexually successful guppy. Therefore it is the doctrine of the ruthless oppressor which teaches that the solution to human sexual violence is to be found in castration and the creation of pure ghosts. This would be equivalent to damning an aardvark for having the ‘sinful aardvark nature’ or prosecuting an anteater for the high crime of ‘ant genocide’.

Therefore it was my theological hypothesis that the correct solution to this problem is to give every guppy a beautiful colorful tail. I compare this solution to the classic religious solution which is to cut off every tail since having a tail is ‘sinful’. If having a tail is sinful then God must be sinful for no human being has any choice in deciding whether or not they would be born with a colorful tail, or whether they would not.

When I was young I was a beautiful guppy with a lovely tail. So everyone seemed to think. I am older now. My nose became very badly sunburned and destroyed. It seemed good to me to test my hypothesis by using these ‘biological algorithms’ to correct this problem. I healed half my nose as you can see by the line separating the still very dark patch on the side in the photograph below.





I documented my experiment on these pages. one two t hree four fi ve six


I have confirmed to my own satisfaction that my theological proposition is correct and that religious dogma is erroneous, being based as it was upon nothing more than ‘divine revelation’ which is just a form of opinionated speculation. For the time being I am not continuing this experiment, for I must wait until the weather on this planet improves, and the dark clouds of ruthless oppression break letting a little sun shine come through so that I can show the world the truth about God, by showing people how God goes about giving an old guppy back his beautiful colorful tail.


Until then I will have to sit on the sidelines, while all my scientific breakthroughs are deliberately ignored, while I wonder to myself what ever in the world could be wrong with the human race, because what this all will prove at the end of it all is that there definitely was something wrong with the people on this planet.