⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ximapal.cpp

📁 It s a tool designed to extract as much information as possible from Bluetooth devices without the r
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	return RGB(c.rgbRed,c.rgbGreen,c.rgbBlue);}/////////////////////////////////////////////////////////////////////////////////** * Returns the color of the specified index. * \param i = palette index * \param r, g, b = output color channels */bool CxImage::GetPaletteColor(BYTE i, BYTE* r, BYTE* g, BYTE* b){	RGBQUAD* ppal=GetPalette();	if (ppal) {		*r = ppal[i].rgbRed;		*g = ppal[i].rgbGreen;		*b = ppal[i].rgbBlue; 		return true;	}	return false;}////////////////////////////////////////////////////////////////////////////////void CxImage::SetPalette(DWORD n, BYTE *r, BYTE *g, BYTE *b){	if ((!r)||(pDib==NULL)||(head.biClrUsed==0)) return;	if (!g) g = r;	if (!b) b = g;	RGBQUAD* ppal=GetPalette();	DWORD m=min(n,head.biClrUsed);	for (DWORD i=0; i<m;i++){		ppal[i].rgbRed=r[i];		ppal[i].rgbGreen=g[i];		ppal[i].rgbBlue=b[i];	}	info.last_c_isvalid = false;}////////////////////////////////////////////////////////////////////////////////void CxImage::SetPalette(rgb_color *rgb,DWORD nColors){	if ((!rgb)||(pDib==NULL)||(head.biClrUsed==0)) return;	RGBQUAD* ppal=GetPalette();	DWORD m=min(nColors,head.biClrUsed);	for (DWORD i=0; i<m;i++){		ppal[i].rgbRed=rgb[i].r;		ppal[i].rgbGreen=rgb[i].g;		ppal[i].rgbBlue=rgb[i].b;	}	info.last_c_isvalid = false;}////////////////////////////////////////////////////////////////////////////////void CxImage::SetPalette(RGBQUAD* pPal,DWORD nColors){	if ((pPal==NULL)||(pDib==NULL)||(head.biClrUsed==0)) return;	memcpy(GetPalette(),pPal,min(GetPaletteSize(),nColors*sizeof(RGBQUAD)));	info.last_c_isvalid = false;}/////////////////////////////////////////////////////////////////////////////////** * Sets (or replaces) the palette to gray scale palette. * The function doesn't change the pixels; for standard * gray scale conversion use GrayScale(). */void CxImage::SetGrayPalette(){	if ((pDib==NULL)||(head.biClrUsed==0)) return;	RGBQUAD* pal=GetPalette();	for (DWORD ni=0;ni<head.biClrUsed;ni++)		pal[ni].rgbBlue=pal[ni].rgbGreen = pal[ni].rgbRed = (BYTE)(ni*(255/(head.biClrUsed-1)));}/////////////////////////////////////////////////////////////////////////////////** * Colorize the palette. * \sa Colorize */void CxImage::BlendPalette(COLORREF cr,long perc){	if ((pDib==NULL)||(head.biClrUsed==0)) return;	BYTE* iDst = (BYTE*)(pDib) + sizeof(BITMAPINFOHEADER);	DWORD i,r,g,b;	RGBQUAD* pPal=(RGBQUAD*)iDst;	r = GetRValue(cr);	g = GetGValue(cr);	b = GetBValue(cr);	if (perc>100) perc=100;	for(i=0;i<head.biClrUsed;i++){		pPal[i].rgbBlue=(BYTE)((pPal[i].rgbBlue*(100-perc)+b*perc)/100);		pPal[i].rgbGreen =(BYTE)((pPal[i].rgbGreen*(100-perc)+g*perc)/100);		pPal[i].rgbRed =(BYTE)((pPal[i].rgbRed*(100-perc)+r*perc)/100);	}}/////////////////////////////////////////////////////////////////////////////////** * Returns true if the image has 256 colors and a linear grey scale palette. */bool CxImage::IsGrayScale(){	RGBQUAD* ppal=GetPalette();	if(!(pDib && ppal && head.biClrUsed)) return false;	for(DWORD i=0;i<head.biClrUsed;i++){		if (ppal[i].rgbBlue!=i || ppal[i].rgbGreen!=i || ppal[i].rgbRed!=i) return false;	}	return true;}/////////////////////////////////////////////////////////////////////////////////** * swap two indexes in the image and their colors in the palette */void CxImage::SwapIndex(BYTE idx1, BYTE idx2){	RGBQUAD* ppal=GetPalette();	if(!(pDib && ppal)) return;	//swap the colors	RGBQUAD tempRGB=GetPaletteColor(idx1);	SetPaletteColor(idx1,GetPaletteColor(idx2));	SetPaletteColor(idx2,tempRGB);	//swap the pixels	BYTE idx;	for(long y=0; y < head.biHeight; y++){		for(long x=0; x <= head.biWidth; x++){			idx=GetPixelIndex(x,y);			if (idx==idx1) SetPixelIndex(x,y,idx2);			if (idx==idx2) SetPixelIndex(x,y,idx1);		}	}}////////////////////////////////////////////////////////////////////////////////bool CxImage::IsTransparent(long x, long y){	if (!pDib) return false;	if (info.nBkgndIndex>=0){		if (head.biClrUsed){			if (GetPixelIndex(x,y) == info.nBkgndIndex) return true;		} else {			RGBQUAD ct = info.nBkgndColor;			RGBQUAD c = GetPixelColor(x,y,false);			if (*(long*)&c==*(long*)&ct) return true;		}	}#if CXIMAGE_SUPPORT_ALPHA	if (pAlpha) return AlphaGet(x,y)==0;#endif	return false;}/////////////////////////////////////////////////////////////////////////////////** * Checks if image has the same palette, if any. * \param img = image to compare. * \param bCheckAlpha = check also the rgbReserved field. */bool CxImage::IsSamePalette(CxImage &img, bool bCheckAlpha){	if (head.biClrUsed != img.head.biClrUsed)		return false;	if (head.biClrUsed == 0)		return false;	RGBQUAD c1,c2;	for (DWORD n=0; n<head.biClrUsed; n++){		c1 = GetPaletteColor((BYTE)n);		c2 = img.GetPaletteColor((BYTE)n);		if (c1.rgbRed != c2.rgbRed) return false;		if (c1.rgbBlue != c2.rgbBlue) return false;		if (c1.rgbGreen != c2.rgbGreen) return false;		if (bCheckAlpha && (c1.rgbReserved != c2.rgbReserved)) return false;	}	return true;}/////////////////////////////////////////////////////////////////////////////////** * \sa SetClrImportant */DWORD CxImage::GetClrImportant() const{	return head.biClrImportant;}/////////////////////////////////////////////////////////////////////////////////** * sets the maximum number of colors that some functions like * DecreaseBpp() or GetNearestIndex() will use on indexed images * \param ncolors should be less than 2^bpp, * or 0 if all the colors are important. */void CxImage::SetClrImportant(DWORD ncolors){	if (ncolors==0 || ncolors>256) {		head.biClrImportant = 0;		return;	}	switch(head.biBitCount){	case 1:		head.biClrImportant = min(ncolors,2);		break;	case 4:		head.biClrImportant = min(ncolors,16);		break;	case 8:		head.biClrImportant = ncolors;		break;	}	return;}/////////////////////////////////////////////////////////////////////////////////** * Returns pointer to pixel. Currently implemented only for truecolor images. *   * \param  x,y - coordinates * * \return pointer to first byte of pixel data * * \author ***bd*** 2.2004 */void* CxImage::BlindGetPixelPointer(const long x, const long y){  if (!IsIndexed())    return info.pImage + y*info.dwEffWidth + x*3;  else    return 0;}////////////////////////////////////////////////////////////////////////////////void CxImage::DrawLine(int StartX, int EndX, int StartY, int EndY, COLORREF cr){	DrawLine(StartX, EndX, StartY, EndY, RGBtoRGBQUAD(cr));}////////////////////////////////////////////////////////////////////////////////void CxImage::DrawLine(int StartX, int EndX, int StartY, int EndY, RGBQUAD color, bool bSetAlpha){	if (!pDib) return;	//////////////////////////////////////////////////////	// Draws a line using the Bresenham line algorithm	// Thanks to Jordan DeLozier <JDL>	//////////////////////////////////////////////////////	int x1 = StartX;	int y1 = StartY;	int x = x1;                       // Start x off at the first pixel	int y = y1;                       // Start y off at the first pixel	int x2 = EndX;	int y2 = EndY;	int xinc1,xinc2,yinc1,yinc2;      // Increasing values	int den, num, numadd,numpixels;   	int deltax = abs(x2 - x1);        // The difference between the x's	int deltay = abs(y2 - y1);        // The difference between the y's	// Get Increasing Values	if (x2 >= x1) {                // The x-values are increasing		xinc1 = 1;		xinc2 = 1;	} else {                         // The x-values are decreasing		xinc1 = -1;		xinc2 = -1;	}	if (y2 >= y1) {                // The y-values are increasing		yinc1 = 1;		yinc2 = 1;	} else {                         // The y-values are decreasing		yinc1 = -1;		yinc2 = -1;	}	// Actually draw the line	if (deltax >= deltay)         // There is at least one x-value for every y-value	{		xinc1 = 0;                  // Don't change the x when numerator >= denominator		yinc2 = 0;                  // Don't change the y for every iteration		den = deltax;		num = deltax / 2;		numadd = deltay;		numpixels = deltax;         // There are more x-values than y-values	}	else                          // There is at least one y-value for every x-value	{		xinc2 = 0;                  // Don't change the x for every iteration		yinc1 = 0;                  // Don't change the y when numerator >= denominator		den = deltay;		num = deltay / 2;		numadd = deltax;		numpixels = deltay;         // There are more y-values than x-values	}		for (int curpixel = 0; curpixel <= numpixels; curpixel++)	{		// Draw the current pixel		SetPixelColor(x,y,color,bSetAlpha);				num += numadd;              // Increase the numerator by the top of the fraction		if (num >= den)             // Check if numerator >= denominator		{			num -= den;               // Calculate the new numerator value			x += xinc1;               // Change the x as appropriate			y += yinc1;               // Change the y as appropriate		}		x += xinc2;                 // Change the x as appropriate		y += yinc2;                 // Change the y as appropriate	}}/////////////////////////////////////////////////////////////////////////////////** * Sets a palette with standard colors for 4 and 8 bpp images. */void CxImage::SetStdPalette(){	if (!pDib) return;	switch (head.biBitCount){	case 8:		{			const BYTE pal256[1024] = {0,0,0,0,0,0,128,0,0,128,0,0,0,128,128,0,128,0,0,0,128,0,128,0,128,128,0,0,192,192,192,0,			192,220,192,0,240,202,166,0,212,240,255,0,177,226,255,0,142,212,255,0,107,198,255,0,			72,184,255,0,37,170,255,0,0,170,255,0,0,146,220,0,0,122,185,0,0,98,150,0,0,74,115,0,0,			50,80,0,212,227,255,0,177,199,255,0,142,171,255,0,107,143,255,0,72,115,255,0,37,87,255,0,0,			85,255,0,0,73,220,0,0,61,185,0,0,49,150,0,0,37,115,0,0,25,80,0,212,212,255,0,177,177,255,0,			142,142,255,0,107,107,255,0,72,72,255,0,37,37,255,0,0,0,254,0,0,0,220,0,0,0,185,0,0,0,150,0,			0,0,115,0,0,0,80,0,227,212,255,0,199,177,255,0,171,142,255,0,143,107,255,0,115,72,255,0,			87,37,255,0,85,0,255,0,73,0,220,0,61,0,185,0,49,0,150,0,37,0,115,0,25,0,80,0,240,212,255,0,			226,177,255,0,212,142,255,0,198,107,255,0,184,72,255,0,170,37,255,0,170,0,255,0,146,0,220,0,			122,0,185,0,98,0,150,0,74,0,115,0,50,0,80,0,255,212,255,0,255,177,255,0,255,142,255,0,255,107,255,0,			255,72,255,0,255,37,255,0,254,0,254,0,220,0,220,0,185,0,185,0,150,0,150,0,115,0,115,0,80,0,80,0,			255,212,240,0,255,177,226,0,255,142,212,0,255,107,198,0,255,72,184,0,255,37,170,0,255,0,170,0,			220,0,146,0,185,0,122,0,150,0,98,0,115,0,74,0,80,0,50,0,255,212,227,0,255,177,199,0,255,142,171,0,			255,107,143,0,255,72,115,0,255,37,87,0,255,0,85,0,220,0,73,0,185,0,61,0,150,0,49,0,115,0,37,0,			80,0,25,0,255,212,212,0,255,177,177,0,255,142,142,0,255,107,107,0,255,72,72,0,255,37,37,0,254,0,			0,0,220,0,0,0,185,0,0,0,150,0,0,0,115,0,0,0,80,0,0,0,255,227,212,0,255,199,177,0,255,171,142,0,			255,143,107,0,255,115,72,0,255,87,37,0,255,85,0,0,220,73,0,0,185,61,0,0,150,49,0,0,115,37,0,			0,80,25,0,0,255,240,212,0,255,226,177,0,255,212,142,0,255,198,107,0,255,184,72,0,255,170,37,0,			255,170,0,0,220,146,0,0,185,122,0,0,150,98,0,0,115,74,0,0,80,50,0,0,255,255,212,0,255,255,177,0,			255,255,142,0,255,255,107,0,255,255,72,0,255,255,37,0,254,254,0,0,220,220,0,0,185,185,0,0,150,150,0,			0,115,115,0,0,80,80,0,0,240,255,212,0,226,255,177,0,212,255,142,0,198,255,107,0,184,255,72,0,			170,255,37,0,170,255,0,0,146,220,0,0,122,185,0,0,98,150,0,0,74,115,0,0,50,80,0,0,227,255,212,0,			199,255,177,0,171,255,142,0,143,255,107,0,115,255,72,0,87,255,37,0,85,255,0,0,73,220,0,0,61,185,0,			0,49,150,0,0,37,115,0,0,25,80,0,0,212,255,212,0,177,255,177,0,142,255,142,0,107,255,107,0,72,255,72,0,			37,255,37,0,0,254,0,0,0,220,0,0,0,185,0,0,0,150,0,0,0,115,0,0,0,80,0,0,212,255,227,0,177,255,199,0,			142,255,171,0,107,255,143,0,72,255,115,0,37,255,87,0,0,255,85,0,0,220,73,0,0,185,61,0,0,150,49,0,0,			115,37,0,0,80,25,0,212,255,240,0,177,255,226,0,142,255,212,0,107,255,198,0,72,255,184,0,37,255,170,0,			0,255,170,0,0,220,146,0,0,185,122,0,0,150,98,0,0,115,74,0,0,80,50,0,212,255,255,0,177,255,255,0,			142,255,255,0,107,255,255,0,72,255,255,0,37,255,255,0,0,254,254,0,0,220,220,0,0,185,185,0,0,			150,150,0,0,115,115,0,0,80,80,0,242,242,242,0,230,230,230,0,218,218,218,0,206,206,206,0,194,194,194,0,			182,182,182,0,170,170,170,0,158,158,158,0,146,146,146,0,134,134,134,0,122,122,122,0,110,110,110,0,			98,98,98,0,86,86,86,0,74,74,74,0,62,62,62,0,50,50,50,0,38,38,38,0,26,26,26,0,14,14,14,0,240,251,255,0,			164,160,160,0,128,128,128,0,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,255,0,255,0,255,255,0,0,255,255,255,0};			memcpy(GetPalette(),pal256,1024);			break;		}	case 4:		{			const BYTE pal16[64]={0,0,0,0,0,0,128,0,0,128,0,0,0,128,128,0,128,0,0,0,128,0,128,0,128,128,0,0,192,192,192,0,								128,128,128,0,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,255,0,255,0,255,255,0,0,255,255,255,0};			memcpy(GetPalette(),pal16,64);			break;		}	}	return;}////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -