网站开发的技术要求,网站首页的功能,国内永久免费crm系统破解,外贸公司如何做网站介绍
CxImage是一个可非常简单快速的加载,保存,显示和转换图像的C类.
文件格式和链接的C库
Cximage对象基本上是加了一些成员变量来保存有用信息的一个位图: class CxImage{...protected:void* pDib;
//包含标题,调色板,像素BITMAPINFOHEADER head;
//标准头文件CXIMAGEINFO…介绍
CxImage是一个可非常简单快速的加载,保存,显示和转换图像的C类.
文件格式和链接的C库
Cximage对象基本上是加了一些成员变量来保存有用信息的一个位图: class CxImage{...protected:void* pDib;
//包含标题,调色板,像素BITMAPINFOHEADER head;
//标准头文件CXIMAGEINFO info;
//扩展信息BYTE* pSelection;
//所选区域BYTE* pAlpha;
//α通道CxImage** ppLayers;
//通用图层CxImage** ppFrames;
//动画帧}CxImage::head是位图头,CxImage::pDib是普通位图(如CxImageBMP::Encode的实现所示). CxImage::info是,包含不同格式间共享的许多信息及所有成员函数.
typedef struct tagCxImageInfo {DWORD dwEffWidth;
//双字对齐的扫描行宽度BYTE* pImage;
//图像位void* pGhost;
//如果这是重影,则pGhost指向身体DWORD dwType;
//原图像格式char szLastError[256];
//调试long nProgress;
//监听long nEscape;
//转义long nBkgndIndex;
//GIF,PNG,MNGRGBQUAD nBkgndColor;
//RGB透明BYTE nQuality;
//JPEGlong nFrame;
//TIF,GIF,MNG:实际帧long nNumFrames;
//用于TIF,GIF,MNG:总帧数DWORD dwFrameDelay;
//GIF,MNGlong xDPI;
//水平分辨率long yDPI;
//垂直分辨率RECT rSelectionBox;
//约束矩形BYTE nAlphaMax;
//最大暗度(淡化)bool bAlphaPaletteEnabled;
//如果启用了调色板中的α值,则为真.bool bEnabled;
//启用绘画函数long xOffset;long yOffset;DWORD dwEncodeOption;
//对GIF,TIF:0def.1unc,2fax3,3fax4,4pack,5jpgRGBQUAD last_c;
//用来GetNearestIndex优化BYTE last_c_index;bool last_c_isvalid;long nNumLayers;DWORD dwFlags;
} CXIMAGEINFO;CxImage对象也是一组层.仅在必要时才分配每层中的缓冲.
CxImage::pDib是背景图像.CxImage::pAlpha是透明图层.CxImage::pSelection是创建处理图像的感兴趣区域的选择图层.
在这3个特定平面上,可添加在CxImage::ppLayers中保存的其他通用图层.通用层是完整的CxImage对象,因此可构建嵌套层的复杂结构. CxImage::ppFrames用来保存(GIF)动画图像.
CxImage类成员和操作
CxImage是使用Doxygen记录的,但是因为历史原因,仍未记录许多不常见的功能.
支持的格式和选项
整个库非常大,在ximcfg.h主头文件中,可找到启用或禁止特定图形格式或特征的开关.每个JPG,PNG和TIFF库都会对最终应用增加约100KB,而CxImage影响约为50KB.
因此,应该只支持和链接应用真正需要的格式.
格式#define必需的库[KB]大小BMP,GIF,ICO,TGA,PCX,WBMP,WMF,SKACXIMAGE_SUPPORT_BMP,CXIMAGE_SUPPORT_GIF,CXIMAGE_SUPPORT_ICO,CXIMAGE_SUPPORT_TGA,CXIMAGE_SUPPORT_PCX,CXIMAGE_SUPPORT_WBMP,CXIMAGE_SUPPORT_WMF,CXIMAGE_SUPPORT_SKA内置24JPEG格式CXIMAGE_SUPPORT_JPGjpeg88PNGCXIMAGE_SUPPORT_PNGpng,zlib104MNGCXIMAGE_SUPPORT_MNGmng,zlib,jpeg148TIFFCXIMAGE_SUPPORT_TIFTIFF,zlib,jpeg124JBIGCXIMAGE_SUPPORT_JBGjbig28PNM,PPM,PGM,RASCXIMAGE_SUPPORT_PNM,CXIMAGE_SUPPORT_RASjasper176JPEG-2000格式CXIMAGE_SUPPORT_JP2CXIMAGE_SUPPORT_JPCCXIMAGE_SUPPORT_PGX同上176RAWCXIMAGE_SUPPORT_RAWlibdcr132
选项#define[KB]大小CxImage核心所有开关关闭20几何变换CXIMAGE_SUPPORT_TRANSFORMATION16处理图像CXIMAGE_SUPPORT_DSP24绘画和窗口相关功能CXIMAGE_SUPPORT_WINDOWS12透明CXIMAGE_SUPPORT_ALPHA4选区CXIMAGE_SUPPORT_SELECTION4多层CXIMAGE_SUPPORT_LAYERS4图形格式转换CXIMAGE_SUPPORT_DECODE,CXIMAGE_SUPPORT_ENCODE4插值功能CXIMAGE_SUPPORT_INTERPOLATION4处理异常CXIMAGE_SUPPORT_EXCEPTION_HANDLING4
在项目中使用CxImage
CxImgLib.dsw客户区显示了构建应用(demo.exe)期望库,包括CxImage中可用的几乎所有函数和格式.必须先编译所有库,才能链接最终应用.
在源码中,你必须添加#includeximage.h
在CxImage中添加自定义功能
使用CxImage编写处理图像的新功能并不难.在此,我描述了非常简单的CxImage::Jitter,但它显示了在CxImage中工作时注意的许多方面.
首先,当然是声明:在ximage.h的CXIMAGE_SUPPORT_DSP部分中声明bool Jitter(longradius2);,你可在类的公域中声明该函数. 现在是定义:
bool CxImage::Jitter(long radius)
{
//检查图像是否有效,这应该总是是函数中的第一行if (!pDib) return false;
//局部变量long nx,ny;
//临时图像来保存算法的部分结果CxImage tmp(*this,pSelection!0,true,true);//仅在包含所选区域的最小矩形中限制函数的效果(使用Selection...()函数),这加快循环速度.long xmin,xmax,ymin,ymax;if (pSelection){xmin info.rSelectionBox.left; xmax info.rSelectionBox.right;ymin info.rSelectionBox.bottom; ymax info.rSelectionBox.top;} else {xmin ymin 0;xmax head.biWidth; ymaxhead.biHeight;}
//主循环:在垂直方向扫描图像for(long yymin; y ymax; y){
//监听循环的进度info.nProgress (long)(100*y/head.biHeight);
//让应用快速退出if (info.nEscape) break;
//主循环:在水平方向扫描图像for(long xxmin; xxmax; x){
//如果启用该函数,则仅处理所选区域内的像素
#if CXIMAGE_SUPPORT_SELECTIONif (SelectionIsInside(x,y))
#endif
//CXIMAGE_SUPPORT_SELECTION{
//主要算法nxx(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));nyy(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));if (!IsInside(nx,ny)) {nxx;nyy;}//在临时图像中保存结果.如果可以,请仅对24bpp图像使用PixelColor,对8,4和1bpp图像使用PixelIndex:这样更快if (head.biClrUsed0){tmp.SetPixelColor(x,y,GetPixelColor(nx,ny));} else {tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny));}
//如果启用了该功能,则还要处理α图层中的像素
#if CXIMAGE_SUPPORT_ALPHAtmp.AlphaSet(x,y,AlphaGet(nx,ny));
#endif
//CXIMAGE_SUPPORT_ALPHA}}}
//保存结果并退出Transfer(tmp);return true;
}示例:如何…
…按另一个格式转换一个格式.
CxImage image;
//BMP-JPG
image.Load(image.bmp, CXIMAGE_FORMAT_BMP);
if (image.IsValid()){if(!image.IsGrayScale()) image.IncreaseBpp(24);image.SetJpegQuality(80);image.Save(image.jpg,CXIMAGE_FORMAT_JPG);
}
//PNG-TIF
image.Load(image.png, CXIMAGE_FORMAT_PNG);
if (image.IsValid()){image.Save(image.tif,CXIMAGE_FORMAT_TIF);
}…加载图像资源
//从PNG资源类型加载资源IDR_PNG1
CxImage* newImage new CxImage();
newImage-LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1), PNG),CXIMAGE_FORMAT_PNG);
//或
//从DLL加载资源IDR_JPG1
CxImage* newImage new CxImage();
HINSTANCE hdllLoadLibrary(imagelib.dll);
if (hdll){HRSRC hresFindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),JPG);newImage-LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);FreeLibrary(hdll);
}
//或:
//加载位图资源;
HBITMAP bitmap ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1)));
CxImage *newImage new CxImage();
newImage-CreateFromHBITMAP(bitmap);
… 从内存解码图片
CxImage image((BYTE*)buffer,size,image_type);
//或
CxMemFile memfile((BYTE*)buffer,size);
CxImage image(memfile,image_type);
//或
CxMemFile memfile((BYTE*)buffer,size);
CxImage* image new CxImage();
image-Decode(memfile,type);…在内存中编码图像
long size0;
BYTE* buffer0;
image.Encode(buffer,size,image_type);
...
image.FreeMemory(buffer);
//或
CxMemFile memfile;
memfile.Open();
image.Encode(memfile,image_type);
BYTE* buffer memfile.GetBuffer();
long size memfile.Size();
...
image.FreeMemory(buffer);… 创建多页TIFF
CxImage *pimage[3];
pimage[0]image1;
pimage[1]image2;
pimage[2]image3;
FILE* hFile;
hFile fopen(multipage.tif,wb);
CxImageTIF multiimage;
multiimage.Encode(hFile,pimage,3);
fclose(hFile);//或
FILE* hFile;
hFile fopen(c:\\multi.tif,wb);
CxImageTIF image;
image.Load(c:\\1.tif,CXIMAGE_FORMAT_TIF);
image.Encode(hFile,true);
image.Load(c:\\2.bmp,CXIMAGE_FORMAT_BMP);
image.Encode(hFile,true);
image.Load(c:\\3.png,CXIMAGE_FORMAT_PNG);
image.Encode(hFile);
fclose(hFile);…复制/粘贴图像
//复制
HANDLE hDIB image-CopyToHandle();
if (::OpenClipboard(AfxGetApp()-m_pMainWnd-GetSafeHwnd())) {if(::EmptyClipboard()) {if (::SetClipboardData(CF_DIB,hDIB) NULL ) {AfxMessageBox( Unable to set Clipboard data );
} } }
CloseClipboard();
//糊
HANDLE hBitmapNULL;
CxImage *newima new CxImage();
if (OpenClipboard()) hBitmapGetClipboardData(CF_DIB);
if (hBitmap) newima-CreateFromHANDLE(hBitmap);
CloseClipboard();
在图片框中显示文件
HBITMAP m_bitmap NULL;
CxImage image(myfile.png, CXIMAGE_FORMAT_PNG);
...
CDC* hdc m_picture.GetDC();
HBITMAP m_bitmap image.MakeBitmap(hdc-m_hDC);
HBITMAP hOldBmp m_picture.SetBitmap(m_bitmap);
if (hOldBmp) DeleteObject(hOldBmp);
if (hdc-m_hDC) m_picture.ReleaseDC(hdc);
...
if (m_bitmap) DeleteObject(m_bitmap);