8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
Go Back  Xtreme Visual Basic Talk > > > 8-bit Bitmaps: How to tweak the Color Table


Reply
 
Thread Tools Display Modes
  #1  
Old 01-22-2017, 09:16 AM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default 8-bit Bitmaps: How to tweak the Color Table


I have a PictureBox that is loaded via LoadPicture with an 8-bit mode BMP image.

By obtaining a copy of the BITMAP handle I then have direct access to the pixel array and can manipulate the image:

Code:
   Dim ImageBMP   As BITMAP
   ImageDC = PB.hdc
   N = GetObject(PB.Picture, 24, ImageBMP)
   pDIB = ImageBMP.bmBits  ' pDIB is pointer to the image pixel array
But one thing I can't seem to do is to change the color table. I tried SetDIBColorTable, that doesn't work. The only way I have found that works is to tweak the color table of the source BMP file, then reload it, and repat the procedure above to get a new pointer.

That's a real pain, for various reasons. It seems odd that I can seamlessly play with the image pixel data but not the color table.

Is there some way to change the color table on the fly?
__________________
Cogito, ergo codo
Reply With Quote
  #2  
Old 01-22-2017, 01:20 PM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Thumbs up Resolved - Color Table Access problem

Eureka, I found a way to do it.

I use the GDI LoadImage function to load the image and create a "DIB section", which then allows me to update the color table with SetDIBColortable. I also get a direct-access pointer to the DIB itself. The image is painted onto the PictureBox with BitBlt.

It seems I can have my color table and tweak it too!

--------------------------------------------------------------------

One minor annoyance, and one that had me scratching my head for some time, was that my DIB in memory didn't quite match my BMP file image - 2K pixels out of 630K were different.

It turns out that I had a couple of duplicate colour entries in my table. So where color numbers 123 and 234 were the same, GDI went to the trouble (totally undesired in this case) of changing all pixels with color index 234 to 123.
__________________
Cogito, ergo codo
Reply With Quote
  #3  
Old 01-22-2017, 04:44 PM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default Oh dear! Trouble ...

Sadly, the cure is worse, much much worse, than the disease ...

What I gained by removing a minor annoyance (inablity to change color table directly) was a whole shipload of trouble ...

My original method (described above) has one particularly elegant feature. The binding of the Picture object with DMA access to the image pixels is wonderfully seamless - my app is drawing full-screen redraws at a rate of over 100 per second, and it is visually as smooth as silk.

Switching to BitBlt as a painting method introduces a disturbing amount of screen flashing, and before anyone says "double buffering", that's not going to help, I'm not "drawing" anything at all, I just have a sequence of image frames prepared in memory that I need to display at 100-150 fps, so I'm already buffered to the max.

I imagine the reason is that the use of the Picture object DC avoids the translation process between device independent bitmap objects and the screen I'm drawing into. I should have smelled a rat when I noticed that my pixel array was being tweaked by GDI ....

Anyway, the upshot of it all is that I had the optimal method already, only now I really appreciate how powerful it is.
__________________
Cogito, ergo codo
Reply With Quote
  #4  
Old 01-22-2017, 07:02 PM
Cerian Knight's Avatar
Cerian Knight8-bit Bitmaps: How to tweak the Color Table Cerian Knight is offline
Polymath (in disciplina)

Super Moderator
* Expert *
 
Join Date: May 2004
Location: Michigan
Posts: 4,191
Default

I've been using DMA access to enable rendering (a simple full-screen change-all-pixels every frame demo) at more than 180 FPS (in 1080p mode) to support my new 120 Hz TV/Monitor. The key is to render to the same bit depth as Windows, which will usually be 32-bit, to prevent internal DIB to DDB conversion latency and simplify RGB mapping (no color table). This is enhanced by my configuring DMA using SafeArray1D, instead of SafeArray2D, as manual specification of x-offset into the y-raster line is more efficient (and status quo for recent cutting-edge APIs, I believe).

Even my 10 year old computer can render the same VB6 demo at ~85 FPS, but sadly, can only display ~56 FPS (on a 60 Hz monitor)... which leads to apparent stutter/flicker on rapidly changing high delta contrast images. I believe this might be less noticeable on monitors with 1-2 ms gate-to-gate delay, but not sure.

To eliminate flicker on the old/slow computer (and settle for a smooth 30 or 40 FPS), I have to set a suitable interval on a 1 ms precision timer to force a modified DWFlush API call (CDECL). After 100s of hours use, it has exhibited no issues without the normal requisite TLB Wrapper:
Private Declare Sub DwmFlush Lib "dwmapi.dll" ()

The need for DwmFlush presumes one is using Windows 10, or using the default DWM/Desktop Composition related settings in Windows Vista/7/8. Highly recommended, as then there is no need to manage v-blank/sync timing to prevent tearing, which is a distinctly different from refresh rate induced stutter/flicker.
__________________
I got all the answers wrong on the GLAT, apparently even #9 (where I put a period in the middle of the box and labeled it 'singularity ripe for rapid inflation').

Last edited by Cerian Knight; 01-22-2017 at 07:32 PM.
Reply With Quote
  #5  
Old 01-23-2017, 03:40 PM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default

Interesting stuff!

By the way:
Quote:
Originally Posted by Cerian Knight View Post
... to force a modified DWFlush API call (CDECL). After 100s of hours use, it has exhibited no issues without the normal requisite TLB Wrapper:

Private Declare Sub DwmFlush Lib "dwmapi.dll" ()
I wouldn't expect it to fail at all, since it has no arguments - that means it's not affected by the calling convention.

Now, back to my little problem. It seems to me that there must be a way of changing the colour table - if one could only know where the heck it was kept.

I notice that if I generate the frames and save them all in BMP format, then load them into an array of Picture objects, and render them with PaintPicture, then the desired effect is still achieved, ie the display is smooth.

If I could only bypass the write BMP and LoadPicture steps, that would be a fairly seamless solution.

I notice that dilettante has created a tool for converting 32-bit color StdPicture to 8-bit StdPicture objects. I'll have a look at how it works for clues.
__________________
Cogito, ergo codo
Reply With Quote
  #6  
Old 01-24-2017, 03:46 PM
Cerian Knight's Avatar
Cerian Knight8-bit Bitmaps: How to tweak the Color Table Cerian Knight is offline
Polymath (in disciplina)

Super Moderator
* Expert *
 
Join Date: May 2004
Location: Michigan
Posts: 4,191
Default

Not sure if this helps (or is what you've already tried), but I downloaded this example:
http://www.vb-helper.com/howto_make_8bit_dib.html
Then I modified 'SetColorTable' to allow user defined colors pallet specification.
From there, on a Timer event, to redefine the pallet and display (without needing to reload/redraw pixels) I call:
1. 'SetColorTable' Sub (w/pallet spec).
2. 'CreateDIB' Sub
3. 'DrawDIB' Sub

I don't see any other mechanisms to short-cut the process, but the LoadPicture seems like it can be avoided.
__________________
I got all the answers wrong on the GLAT, apparently even #9 (where I put a period in the middle of the box and labeled it 'singularity ripe for rapid inflation').
Reply With Quote
  #7  
Old 01-26-2017, 05:30 AM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default

Ok, thanks, I'll look into that ... but it draws with StretchBlt which is like BitBlt so is essentially the drawing method with which I got the shocking screen-flash problem mentioned above.


dilettante's code features palette functions, and I thought, of course! that must be the missing link - I just neeed to CreatePalette and SelectPalette.

I really expected that after loading an 8-bit picture, the PB.Picture.hPal property would return a LOGPALETTE handle, but no, it returns 0.

I then went via the GDI to see if PB.Picture.hDC had a palette handle selected into it, and it gave me a result ... but nothing changed when I replaced that palette with my own.

At this stage, to be honest, I am actually quite happy with my re-LoadPicture solution, it is virtually instantaneous and doesn't seem to cause any screen disturbance. I might even move away from 8-bit mode altogether and work with 24-bit BMP's

I'm just CURIOUS as to where and in what form the color table is being "managed". Is it a LOGPALETTE or a color table (BMPINFO.bmiColors(255)), and why is its location such a well-kept secret?
__________________
Cogito, ergo codo
Reply With Quote
  #8  
Old 01-26-2017, 12:02 PM
Cerian Knight's Avatar
Cerian Knight8-bit Bitmaps: How to tweak the Color Table Cerian Knight is offline
Polymath (in disciplina)

Super Moderator
* Expert *
 
Join Date: May 2004
Location: Michigan
Posts: 4,191
Default

Probably not much help, but all (I think) I know is that the original palette for 8-bit (and some 15/16-bit) modes was set at the hardware register level of the VGA controller... Moving forward, in order to handle variations in hardware implementation and conversion between different bit depths, an abstraction layer had to be created to manage the display (DDB) separately from the storage (DIB) format. (please forgive any technical inaccuracy)

In order for that to work in all cases, including those where the palette needs to be written out to the old VGA hardware palette registers (and affects the whole screen simultaneously), there must be different paths (software vs. hardware) for taking the appropriate action.

Granted, there should be some good documentation somewhere on the actuals (hopefully someone else will chime in), but I stopped keeping up after all the worked I did with custom 2x6-bit (RrGgBb with EGA) virtual palettes using two adjacent pixels was obsoleted by the advent of 8-bit analog VGA. Since 32-bit ARGB, I haven't looked back.
__________________
I got all the answers wrong on the GLAT, apparently even #9 (where I put a period in the middle of the box and labeled it 'singularity ripe for rapid inflation').
Reply With Quote
  #9  
Old 02-12-2017, 06:44 PM
dilettante's Avatar
dilettante8-bit Bitmaps: How to tweak the Color Table dilettante is offline
Underclocked lifestyle

Forum Leader
* Guru *
 
Join Date: Feb 2005
Location: Michigan, USA
Posts: 4,520
Default

Sorry to be late to the party, I guess I got busy and didn't have as much spare time for forums and just didn't get over here.

So far I have nothing to add, but I'll take a look. We're talking about 8-bit depth images right?

Calling SetDIBColortable() is the only option I'm aware of. If you don't have a DIB perhaps the color table is sitting in the GPU's memory (or software equivalent for a printer hDC)? If so perhaps the graphics driver model never described a way to retrieve/write it directly so device drivers might not even have calls supporting retrieval/updating directly or even semi-directly.
Reply With Quote
  #10  
Old 02-16-2017, 03:44 AM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default

Quote:
Originally Posted by dilettante View Post
If you don't have a DIB perhaps the color table is sitting in the GPU's memory
That would certainly explain it.


Jusr to re-state the original question - if we have an 8-bit color depth image loaded into a PictureBox, why can't we change the color table?
__________________
Cogito, ergo codo
Reply With Quote
  #11  
Old 02-16-2017, 11:50 AM
passel's Avatar
passel8-bit Bitmaps: How to tweak the Color Table passel is offline
Sinecure Expert

Super Moderator
* Guru *
 
Join Date: Jun 2003
Location: Upstate New York, usa
Posts: 8,024
Default

Quote:
Originally Posted by Mathimagics View Post
...
I then went via the GDI to see if PB.Picture.hDC had a palette handle selected into it, and it gave me a result ... but nothing changed when I replaced that palette with my own.
...
I'm nowhere near where you guys are in the low level details of DIBs and Picture.hDC, but I'm kind of wondering if you did a PB.Refresh after changing the palette.

As far as I know, when you load a picture into the .Picture context of a picturebox, the image in that context is converted to a Screen compatible resolution and stored in the .Image context of the Picturebox. If you move windows over the picturebox, or move it off screen, or minimize/restore so that the picturebox has to update its screen image, it is refreshed from the .Image context.
If you changed the .Picture context through an API, i.e. updating the palette, I think VB would be unaware of that so you wouldn't see a change. I don't think you would see a change with a normal screen area update either, as the control would probably just update the screen from the .Image copy of the original image loaded.
If you set .AutoRedraw to True, and then issued a PB.Cls, I think that would force the control to convert the .Picture context into a screen compatible image again and update the .Image "cache" with the palette modified version of the .Picture.

I don't know if what I've said above is true, but it is my impression of the way the Picturebox works based on my early years of empirical experience using the Picturebox control.
__________________
There Is An Island Of Opportunity In The Middle of Every Difficulty.
Miss That, Though, And You're Pretty Much Doomed.
Reply With Quote
  #12  
Old 02-16-2017, 12:43 PM
Cerian Knight's Avatar
Cerian Knight8-bit Bitmaps: How to tweak the Color Table Cerian Knight is offline
Polymath (in disciplina)

Super Moderator
* Expert *
 
Join Date: May 2004
Location: Michigan
Posts: 4,191
Default

To add to passel's notes above, there are some nuggets of related information here:
https://msdn.microsoft.com/en-us/lib...(v=vs.60).aspx
https://msdn.microsoft.com/en-us/lib...(v=vs.60).aspx
__________________
I got all the answers wrong on the GLAT, apparently even #9 (where I put a period in the middle of the box and labeled it 'singularity ripe for rapid inflation').
Reply With Quote
  #13  
Old 02-18-2017, 04:27 AM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default

Thanks, guys.

I have Autoredraw = 0, and issue a PB.Refresh whenever I change the image.
__________________
Cogito, ergo codo
Reply With Quote
  #14  
Old 02-19-2017, 03:41 PM
dilettante's Avatar
dilettante8-bit Bitmaps: How to tweak the Color Table dilettante is offline
Underclocked lifestyle

Forum Leader
* Guru *
 
Join Date: Feb 2005
Location: Michigan, USA
Posts: 4,520
Default

Quote:
Originally Posted by Mathimagics View Post
Just to re-state the original question - if we have an 8-bit color depth image loaded into a PictureBox, why can't we change the color table?
I suspect that you might if the screen device driver is in "palette mode" which is when:

CBool(GetDeviceCaps(hDC, RASTERCAPS) And RC_PALETTE) = True

Otherwise when an 8-bit image is loaded the colors get remapped, i.e. you get a 24-bit, 32-bit, etc. bitmap with the colors set in each pixel. There is no color table.

In palette mode you might be able to make use of SelectPalette() followed by RealizePalette() but these days most PCs have display devices set to 24- or 32-bit color.
Reply With Quote
  #15  
Old 02-19-2017, 04:48 PM
passel's Avatar
passel8-bit Bitmaps: How to tweak the Color Table passel is offline
Sinecure Expert

Super Moderator
* Guru *
 
Join Date: Jun 2003
Location: Upstate New York, usa
Posts: 8,024
Default

Quote:
Originally Posted by Mathimagics View Post
Thanks, guys.

I have Autoredraw = 0, and issue a PB.Refresh whenever I change the image.
Which is the opposite of what I mentioned might show the color table update.
Not that what I said will definitely work, or be faster, but is based on my impression of how the Picturebox control updates the screen.

I believe you are modifying the .Picture context which would hold the 8-bit per pixel image.
With AutoRedraw = 0 and doing a PB.Refresh, the screen would be refreshed from the .Image context, not the .Picture context.

My supposition was that you would have to have AutoRedraw = 1, and do a PB.Cls, so that the Picturebox would refresh the .Image context (and then the screen) from the .Picture context, so you would see the change to the .Picture context.

My supposition is that doing a PB.Refresh will not access the .Picture context of the picturebox since the control is already maintaining a cached version of that bitmap (already converted to a screen compatible bitmap) so doesn't do that 8-bit to screen compatible bitmap conversion for a refresh.
The only ways (I'm still supposing here) to cause a .Picture to .Image update is to issue a .Cls method call with AutoRedraw set to True, or to reload the .Picture context in a way that VB knows it has changed, so it will do the .Picture to .Image conversion as part of the .Picture update.
__________________
There Is An Island Of Opportunity In The Middle of Every Difficulty.
Miss That, Though, And You're Pretty Much Doomed.
Reply With Quote
  #16  
Old 02-20-2017, 09:09 PM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default

Ok, for my purposes anything involving a PB.Cls is unacceptable, since my objective is a visually seamless image update.

Now regarding the .Picture vs .Image properties, recall that I get access to the botmap handle via this simple method:
Code:
   Dim PictureBMP   As BITMAP
   Dim hBitmap    As Long
   Dim pBits   As Long

   N = GetObject(PB.Picture, 24, PictureBMP)
   pBits = PictureBMP.bmBits
I then fudge up a SAFEARRAY descriptor with pBits, and hey presto, I have DMA access to the bitmap via a BYTE array.

So dilettante's scenario would appear on the surface to be problematic, since my display is operating in TrueColor, yet I am able to simply change the (8-bit depth) byte array at will, issue a PB.Refresh, and see the display change.

Perhaps this is correct, and VB is secretly doing the color mapping, but not making the color table accessible.

I tried all the palette functions but couln't get a result. I think I described above how there does seem to be a palette selected into the PB's DC, but I can't use SelectPalette to change to a new one, and VB returns 0 for the hPal property (secret VB business?).
__________________
Cogito, ergo codo
Reply With Quote
  #17  
Old 02-21-2017, 12:10 PM
Cerian Knight's Avatar
Cerian Knight8-bit Bitmaps: How to tweak the Color Table Cerian Knight is offline
Polymath (in disciplina)

Super Moderator
* Expert *
 
Join Date: May 2004
Location: Michigan
Posts: 4,191
Default

Failing some method of interacting with that palette, I recommend a blanket approach:
1. Convert to using a 32-bit DIB Bitmap (which also simplifies UBoundX calculation, making step 2 easier to implement, especially for dynamically resizable bitmaps).
2. Use SAFEARRAY1D to obtain DMA access to a LONG array. (SAFEARRAY2D/LONG will work, but is slower)
3. Create sets of (A)RGB masks for each 256 color palette you want to use.
4. Use the Alpha channel (since transparency is not being enabled and you are only using 256 colors) as a quick palette entry identifier.
5. Sweep the 'A's in the array to lookup and mask in the updated palette.
6. Perhaps reserve some of the 256 'A's for static colors or future expansion.

This should be capable of anywhere from 120-400 FPS@1080P for a full screen palette update.
__________________
I got all the answers wrong on the GLAT, apparently even #9 (where I put a period in the middle of the box and labeled it 'singularity ripe for rapid inflation').
Reply With Quote
  #18  
Old 02-22-2017, 01:02 PM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default

Thanks, I'll give that some serious consideration.

The app in question is my Turntable simulator, which is configured for 180 updates per revolution, which corresponds to 135fps at 45rpm, 100fps at 33rpm.
__________________
Cogito, ergo codo
Reply With Quote
  #19  
Old 02-22-2017, 02:59 PM
Cerian Knight's Avatar
Cerian Knight8-bit Bitmaps: How to tweak the Color Table Cerian Knight is offline
Polymath (in disciplina)

Super Moderator
* Expert *
 
Join Date: May 2004
Location: Michigan
Posts: 4,191
Default

Using the above (step 1 & 2 only) with alternating FillMemory 0 and 255 on the entire Long array (i.e. no processing of existing pixel data) and no DWMFlush, I get:
~ 1100 fills/s @ 1080p resolution
500 Refresh/s (because my 1 ms timer is out of sync with normal background DWM refresh)
Actual refresh rate on both my 120Hz and 60Hz monitors (of course). When use of DWMFlush is enabled, the screen is solid gray on my 120Hz TV monitor (i.e. no flicker).

Most normal per-pixel processing would not drop the fills/s to less than 1/3 the above figure (i.e. still > 300) on a modern PC. Divide by about 3.5 again on a 10 year old PC (i.e. still much greater than the 60Hz of most monitors).
__________________
I got all the answers wrong on the GLAT, apparently even #9 (where I put a period in the middle of the box and labeled it 'singularity ripe for rapid inflation').
Reply With Quote
  #20  
Old 02-22-2017, 08:06 PM
Mathimagics's Avatar
Mathimagics8-bit Bitmaps: How to tweak the Color Table Mathimagics is offline
Algorithms 'R' Us

Forum Leader
* Guru *
 
Join Date: Jun 2002
Location: Canberra
Posts: 4,159
Default

Sounds cool!

I don't actually have much work to do in the way of pixel processing - at least half of the screen display is static - the platter area is simply overlaid with the (pre-generated) rotational image, and then the tonearm on top, so it's essentially a simple 3-image merge and display.

It may be some time until I can tear myself away from my current diversion, but I will be sure to let you know how I go ...
__________________
Cogito, ergo codo
Reply With Quote
Reply

Tags
table, color, image, pixel, bitmap, array, imagebmp, 8-bit, pointer, change, pdib, tweak, bmp, repat, fly, reload, found, source, data, file, odd, pain, seamlessly, real, reasons


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off

Forum Jump

Advertisement:





Free Publications
The ASP.NET 2.0 Anthology
101 Essential Tips, Tricks & Hacks - Free 156 Page Preview. Learn the most practical features and best approaches for ASP.NET.
subscribe
Programmers Heaven C# School Book -Free 338 Page eBook
The Programmers Heaven C# School book covers the .NET framework and the C# language.
subscribe
Build Your Own ASP.NET 3.5 Web Site Using C# & VB, 3rd Edition - Free 219 Page Preview!
This comprehensive step-by-step guide will help get your database-driven ASP.NET web site up and running in no time..
subscribe
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table 8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
 
8-bit Bitmaps: How to tweak the Color Table
8-bit Bitmaps: How to tweak the Color Table
 
-->