改变位图颜色深度

原创 2001年02月08日 09:06:00

Changing Bitmaps Color Depth


This article was contributed by Gerd Esser, Germany.

Environment: MSVC 6.0

The basic problem of this code was to decrease a color depth of great bitmaps (like 8000 x 8000 pixels) to - for example - 4 bits per pixel and solving nearly (! see below) the original color palette. The first attempt was to use the method as shown in DDBtoDIB. But such great bitmaps produce an error: They do nothing sencefull in functions like GetDIBits. So I handle the bitmap in bands of smaller bitmap data and make direct file reading/saving operations of the bitmaps.

Because of the internal mapping of the color palette to the system palette I got some strange results. Also, by realizing the whole number of really used colors, I ve got another problem with the previous banding of the bitmap, which show me only a small part of the overall used colors. This was the second problem. So I create a color palette by counting and adding the colors of each band to a global color palette of the bitmap.

A small problem still remains: By mapping the source bitmap into memory, the color palette cannot be solved exactly. If the color palette cannot be mapped into the system palette, the result color palette may differ by a view percent. But I didn't spend more time to this fact because the present solution was sufficient for me.

The result is a class BitmapLib with two (static) methods, ChangeColorDepth() and GetUsedColors().

BOOL CBitmapLib::ChangeColorDepth(CString const& stSrcBitmapFile,
                                  CString const& stDstBitmapFile,
                                  WORD const wDstBitCount,
                                  CProgressCtrl* pProgressCtrl=NULL);
ChangeColorDepth() changes a color depth of a file based bitmap and saves the result into a destination file. The operation is done by increasing or decreasing the bits per pixel through the whole range from 1 to 32 (thus converting also from device dependent into device independent or the way back). The progress control is only used if nescessary and showing the work progress (great bitmaps last a few seconds ...)

int CBitmapLib::GetUsedColors(CString const & stSrcBitmapFile,
                              RGBQUAD *       pColorTable,
                              WORD const      wMaxColorTableSize,
                              CProgressCtrl *pProgressCtrl = NULL);
int CBitmapLib::GetUsedColors(BITMAPINFO const * pBmi,
                              BYTE const *       pBits,
                              UINT const         nStartScanLine,
                              UINT const         nScanLines,
                              RGBQUAD *          pColorTable,
                              WORD const         wMaxColorTableSize,
                              WORD &             wUsedColors );
A byproduct of the operation ChangeColorDepth() is the method GetUsedColors(), which count the the really used colors and produces a color table of the used colors.

Both methods abort its operation, if the destination color depth is not sufficient enough for the number of used colors in the source bitmap.

Downloads

Download source - 6 Kb

History

Date Posted: February 6, 2001

使用Photoshop变化一张图片的颜色深浅

本文主要描述了通过使用Photoshop软件让一张图片变深或变淡的过程。很多时候都要用变深或变淡的图片制作背景,本例中通过调整图像的明度,让图片发生改变。 工具/原料 ...
  • andyjiang2008
  • andyjiang2008
  • 2014年11月22日 13:56
  • 1233

ggplot2学习笔记之颜色标度

除了位置标度之外,最常用的图形属性就是颜色了。对于连续型变量有三种基于渐变的方法,对于离散型有两种方法。rgb 编码的色彩空间使用了红、绿、蓝三种光的强度来表示一种颜色,这种色彩空间存在个问题:视觉感...
  • songzhilian22
  • songzhilian22
  • 2015年10月24日 21:42
  • 9529

css3实现hover颜色,背景色,宽度等平滑变动(transition)

CSS3.0平滑变动 li { float:left; border:1px #FFFFFF solid; text-align:center; } li a { -moz-tr...
  • i792439187
  • i792439187
  • 2013年04月20日 00:53
  • 16103

【译】Android位图颜色模式的问题

最近开始了android上的编程之旅,在了解2D图形编程时,令人蛋疼的发觉android上仅支持ARGB8888、ARGB4444、RGB565以及Alpha 8这么几种颜色模式,而不支持RGB888...
  • redouba
  • redouba
  • 2014年03月14日 17:40
  • 1026

CorelDRAW中的位图颜色遮罩该怎么进行运用

位图颜色遮罩命令可以将选择的颜色隐藏或显示,一般可用来抠图,这个颜色遮罩功能可以帮助您只改变选中的颜色而不改变图像中的其他颜色...
  • coreldraw2016
  • coreldraw2016
  • 2016年11月10日 14:07
  • 1309

精通Visual C++图像编程之位图颜色处理(学习笔记)

自然界物体的颜色可分为黑白(包括灰度级)和彩色。黑白是彩色的一种特例,因此,颜色处理主要是指彩色处理。 6、1  颜色处理的理论基础 采用定量的方法来描述颜色,即建立颜色模型。目前广泛采用的颜色模...
  • canhui2009
  • canhui2009
  • 2012年07月31日 15:29
  • 1683

android位图颜色模式的问题

【译】Android位图颜色模式的问题   原文http://android.nakatome.net/      最近开始了android上的编程之旅,在了解2D图形编程...
  • Jamse19860909
  • Jamse19860909
  • 2012年03月09日 18:05
  • 1503

【译】Android位图颜色模式的问题

原文: http://android.nakatome.net/ 转载 http://www.cnblogs.com/Dahaka/archive/2012/03/03/2374799.html ...
  • ID19870510
  • ID19870510
  • 2016年12月29日 11:42
  • 471

Android位图颜色模式的问题

最近开始了android上的编程之旅,在了解2D图形编程时,令人蛋疼的发觉android上仅支持ARGB8888、ARGB4444、RGB565以及Alpha 8这么几种颜色模式,而不支持RGB888...
  • zhuojianhai88
  • zhuojianhai88
  • 2015年04月03日 13:43
  • 305

图片位图颜色反转

//遍历图片像素,更改图片颜色 void ProviderReleaseData (void *info, const void *data, size_t size) { free((voi...
  • u012519228
  • u012519228
  • 2016年05月24日 17:03
  • 1273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:改变位图颜色深度
举报原因:
原因补充:

(最多只允许输入30个字)