argbheader,argb header

http://www.itjxue.com  2023-01-22 12:42  来源:未知  点击次数: 

华硕主板上的RGB_HEADER是用来接什么的?

华硕主板上的RGB_HEADER 这个接头用来连接rgb指示灯带(需自购),支持5050 RGB多彩灯带。

需要安装aura 软件进行设置和控制。

c# 数字图象处理24位转8位并标记计数出现了问题,急!

可以参考下面的程序,其中bitCount!=8 bitCount!=24指的就是8位与24位

//BMP与IplImage相互转换

///////////////////////////////头文件bmp2ipl.h

//bmp2ipl.h

#ifndef BMP2IPL_H

#define BMP2IPL_H

class BMP {

public:

BMP():bmpData(NULL) {

memset(biHeader, 0, sizeof(biHeader));

}

BMP(const BMP img);

BMP(const IplImage img);

BMP(int width, int height, int bitCount);

~BMP(){ delete [] bmpData; }

bool CreateImage(const BITMAPINFOHEADER biHeader);

//Export

IplImage * BMP2Ipl();

//void Show(HWND hWnd, int nID);

//void Show(CDC *pDC, CRect rect);

//void Show(HWND hWnd);

void ReSize(int newW, int newH);

private:

void CopyData(char *dest, const char *src, int dataByteSize,

bool isConvert, int height);

// isConvert=true 进行顶左和底左之间的转换(顶左到底左或底左到顶左),否则不转换

// biSizeImage may be set to zero for BI_RGB bitmaps, so calculate it.

int ImgSize() {

return ( biHeader.biHeight * ((biHeader.biWidth * biHeader.biBitCount / 8 + 3) (-4)));

}

public:

void Clear();

BITMAPINFOHEADER biHeader;

unsigned char * bmpData;

};

#endif

/////////////////////////////////////////////////////////////////////实现文件bmp2ipl.cpp

#include "bmp2ipl.h"

/**************************************************************************************************

* *

* NOTE: *

* Only use the "8 bit, 1 or 3 channels" image, the BitMap use LowerLeft (底左), *

* the IplImage use TopLeft (顶左) *

* IplImage: *

* nChannels = 1 or 3 number of channels *

* depth = IPL_DEPTH_8U pixel depth (8 bit), IPL_DEPTH_8U=8 *

* dataOrder = 0 交叉存取颜色通道 *

* origin = IPL_ORIGIN_TL 图像数据保存形式,IPL_ORIGIN_BL底左结构, IPL_ORIGIN_TL顶左结构 *

* align = 4 行数据对齐方式,保证下一行数据从整4字节位置开始 *

* width *

* height *

* widthStep 图像数据行大小,单位字节 *

* imageSize 图像数据大小(=height*widthStep),单位字节 *

* imageData 指向图像数据区,char * *

* BITMAPINFOHEADER: *

* biSize Specifies the number of bytes required by the structure *

* biWidth *

* biHeight(0) biHeight0底左结构;biHeight0顶左结构 *

* biPlanes = 1 Specifies the number of planes for the target device. This value *

* must be set to 1. *

* biBitCount =8 or 24 bits-per-pixel,8-(pixelDepth=8,channels=1), *

* 24-(pixelDepth=8,channels=3) *

* biCompression = BI_RGB An uncompressed format *

* biSizeImage Specifies the size, in bytes, of the image.This may be set to zero *

* for BI_RGB bitmaps. *

* biXPelsPerMeter = 0 *

* biYPelsPerMeter = 0 *

* biClrUsed = 0 *

* biClrImportant = 0 *

* *

***************************************************************************************************/

BMP::BMP(const BMP img)

{

if(!IsSupport(img)) {

BMP();

return;

}

//biHeader = img.biHeader;

PBITMAPINFOHEADER pBmpH = (PBITMAPINFOHEADER)img.biHeader;

memcpy(biHeader, pBmpH, sizeof(BITMAPINFOHEADER));

biHeader.biSizeImage = ImgSize();

bool isLowerLeft = biHeader.biHeight0;

//int rowSize=0;

if(!isLowerLeft) biHeader.biHeight=-biHeader.biHeight;

if(bmpData!=NULL) delete[] bmpData;

bmpData = new unsigned char [biHeader.biSizeImage];

//memcpy(bmpData, img.bmpData, img.biHeader.biSizeImage);

CopyData((char *)bmpData, (char*)img.bmpData, biHeader.biSizeImage,

!isLowerLeft, biHeader.biHeight);

}

BMP::BMP(const IplImage img) {

if(!IsSupport(img)) {

BMP();

return;

}

bool isTopLeft = (img.origin == IPL_ORIGIN_TL);

biHeader.biSize = sizeof(BITMAPINFOHEADER);

biHeader.biWidth = img.width;

biHeader.biHeight = img.height;

biHeader.biPlanes = 1;

biHeader.biBitCount = img.depth * img.nChannels;

biHeader.biCompression = BI_RGB;

biHeader.biSizeImage = img.imageSize;

biHeader.biXPelsPerMeter = 0;

biHeader.biYPelsPerMeter = 0;

biHeader.biClrUsed = 0;

biHeader.biClrImportant = 0;

if(bmpData!=NULL) delete[] bmpData;

bmpData = new unsigned char [img.imageSize];

//memcpy(bmpData, img.ImageData, img.imageSize);

CopyData((char*)bmpData, (char*)img.imageData, img.imageSize,

isTopLeft, img.height);

/*int i,j;

CvScalar s;

for(i=0;iimg.width;i++)

for(j=0;jimg.height;j++){

s=cvGet2D(img,i,j);

}

*/

}

BMP::BMP(int width, int height, int bitCount) {

if(bitCount!=8 bitCount!=24) return;

biHeader.biSize = sizeof(BITMAPINFOHEADER);

biHeader.biWidth = width;

biHeader.biHeight = height;

biHeader.biPlanes = 1;

biHeader.biBitCount = bitCount;

biHeader.biCompression = BI_RGB;

biHeader.biSizeImage = ImgSize();

biHeader.biXPelsPerMeter = 0;

biHeader.biYPelsPerMeter = 0;

biHeader.biClrUsed = 0;

biHeader.biClrImportant = 0;

if(bmpData!=NULL) delete[] bmpData;

bmpData = new unsigned char [biHeader.biSizeImage];

Clear();

}

// dest: the destination image

// dataByteSize: the Source image

// height: source image height

void BMP::CopyData(char *dest, const char *src, int dataByteSize,

bool isConvert, int height) {

char * p = dest;

if(!isConvert) {

memcpy(dest, src, dataByteSize);

return;

}

if(height=0) return;

//int height = dataByteSize/rowByteSize;

int rowByteSize = dataByteSize / height;

src = src + dataByteSize - rowByteSize ;

for(int i=0; iheight; i++) {

memcpy(dest, src, rowByteSize);

dest += rowByteSize;

src -= rowByteSize;

}

}

IplImage * BMP::BMP2Ipl() {

if(!IsSupport(*this)) return NULL;

IplImage *iplImg;

int height;

bool isLowerLeft = biHeader.biHeight0;

height = (biHeader.biHeight0) ? biHeader.biHeight : -biHeader.biHeight;

iplImg = cvCreateImage( cvSize(biHeader.biWidth, height), IPL_DEPTH_8U, biHeader.biBitCount / 8);

//iplImg = cvCreateImageHeader( cvSize(biHeader.biWidth, height), IPL_DEPTH_8U, biHeader.biBitCount / 8);

//cvSetData(iplImg,(char*)bmpData,biHeader.biSizeImage/height);

CopyData( iplImg-imageData, (char*)bmpData, biHeader.biSizeImage,

isLowerLeft, height);

/*int i,j;

CvScalar s;

int channels=biHeader.biBitCount / 8;

int step=(biHeader.biWidth*channels+3) -4;

int loc=0;

for(i=0;iiplImg-height;i++){

for(j=0;jiplImg-width;j++){

loc=i*step + j*channels;

s.val[0]=bmpData[loc];

if(channels==3){

s.val[1]=bmpData[loc+1];

s.val[2]=bmpData[loc+2];

}

cvSet2D(iplImg,i,j,s);

}

}*/

return iplImg;

}

void BMP::Clear() {

if(bmpData == NULL) return;

memset(bmpData, 0, ImgSize());

}

void BMP::ReSize(int newW, int newH) {

biHeader.biWidth = newW;

biHeader.biHeight = newH;

biHeader.biSizeImage = ImgSize();

if(bmpData!=NULL) delete[] bmpData;

bmpData = new unsigned char [biHeader.biSizeImage];

Clear();

}

bool BMP::CreateImage(const BITMAPINFOHEADER bih) {

memset(biHeader,0,sizeof(BITMAPINFOHEADER));

delete[] bmpData;

bmpData = NULL;

memcpy(biHeader, bih, sizeof(BITMAPINFOHEADER));

biHeader.biSizeImage = ImgSize();

bmpData = new unsigned char [ biHeader.biSizeImage ];

if(bmpData == NULL) return false;

else{

Clear();

return true;

}

}

C++中应该怎么样处理32位位图?有函数可以直接访问ARGB吗?需要将32位位图转为8位来做处理吗?

不需要啊,虽然没有内置函数,但是CreateDIBSection基本无敌了。

读文件的话,你只需要把位图文件按顺序读入BITMAPFILEHEADER和BITMAPINFO,用BITMAPINFO结构可以创建一个HBITMAP,然后把文件剩下的内容拷贝进Create得出的那个缓冲区就行了。

至于操作,缓冲区内的像素排布是从左上角横向排到右下角的,按这样的顺序:ARGBARGBARGB...每个通道的位数由BITMAPINFO.bmiHeader.biBitCount决定,自己用数组的方式读写就行了;

如果你已经清楚该怎么做了,我就不给出代码咯

(责任编辑:IT教学网)

更多

相关杀毒防毒文章

推荐杀毒防毒文章