(100分求救,有全部代码),24位位图转换成8位位图

Stefine 2006-12-12 03:11:25
问题症状: 能正确转换成8位图,但转换后图片位置有所改变
发现原因: 应该是那偏移不对,也看了BMP结构,还是没弄出来,哪位大哥有心帮忙改下:THX

#include<stdio.h>

#include <afx.h>
#include <windows.h>

BYTE* ConvertTo8Bit(CString strFileName, DWORD *dwFileLength, BYTE *lpNewBmpData) ;
BOOL SaveFile(CString strFileName, DWORD dwFileLength);

BITMAPINFO* lpNewBmpInfo; //新8位位图信息头首指针
BYTE * lpOldBmp; //指向原来24位位图信息头
BYTE* lpNewBmpData; //指向新的8位位图的信息头指针


void main()
{
char strOpenFileName[200], strSaveFileName[200];
printf("请输入一幅24位位图的路径!\n");
gets( strOpenFileName );
printf("请输入你要保存转换后的8位位图的路径!\n");
gets( strSaveFileName );

DWORD dwFileLength;
lpNewBmpInfo = (BITMAPINFO*)ConvertTo8Bit( strOpenFileName, &dwFileLength, lpNewBmpData);
if( !lpNewBmpInfo )
{
printf( "转换出错,程序退出!\n");
return ;
}
if( !SaveFile( strSaveFileName, dwFileLength) )
{
printf( "保存文件出错!" );
return ;
}

if( lpNewBmpData != NULL)
delete []lpNewBmpData;
if( lpNewBmpInfo != NULL )
delete []lpNewBmpInfo;
if( lpOldBmp != NULL )
delete []lpOldBmp;
}


/*************************************************************************
* 功能: 将24位位图转换为8位位图

* 参数: strFileName: (in)24位位图文件所在路径
lpNewBmpData: (out)做为8位位图的实际数据的指针
*dwFileLength: (out)为原24位位图图像文件长度(从文件信息头开始,不含文件头的14个字节)

* 返回: 8位位图的信息头指针

************************************************************************/
BYTE* ConvertTo8Bit(CString strFileName, DWORD *dwFileLength, BYTE *lpNewBmpData)
{

if( lpNewBmpData != NULL )
{
delete []lpNewBmpData;
lpNewBmpData = NULL;
}

//创建文件句柄
HANDLE hFile = ::CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == 0)
{
printf("不能打开文件,请重新选择!\n");
return NULL;
}

//读取图像文件
DWORD dwWriteNum;
BITMAPFILEHEADER Bmp_file_head; //文件头
ReadFile(hFile,&Bmp_file_head,14,&dwWriteNum,NULL);//读取文件头,共14个字节
if((Bmp_file_head.bfType != 'MB')||(dwWriteNum != sizeof(BITMAPFILEHEADER)))
{
printf("不是BMP位图文件或数据有误!\n");
return NULL;
}
*dwFileLength = GetFileSize(hFile,NULL)-sizeof(BITMAPFILEHEADER); //获取文件的长度


lpOldBmp= new BYTE[ *dwFileLength]; //存放原24位位图像,包括图像的信息头、调色板和像素数据
ReadFile(hFile,lpOldBmp,*dwFileLength,&dwWriteNum,NULL); //读取图像数据


BYTE *lpOldBmpData = lpOldBmp + sizeof(BITMAPINFOHEADER) ; //指向图像数据的实际位置,其调色板为0
BITMAPINFO *lpOldBmpInfo = (BITMAPINFO*)lpOldBmp;

if( lpOldBmpInfo->bmiHeader.biBitCount != 24)
{
printf( "此图像非24位位图!");
return NULL;
}

int nScanWidth; //转换后其每行扫描宽度
int nLineWidth; //将其转换成8位位图后每行宽度(即每行字节数)
int nSrcWidth,nSrcHeight;

nSrcHeight=lpOldBmpInfo->bmiHeader.biHeight; //原24位位图高度
nSrcWidth=lpOldBmpInfo->bmiHeader.biWidth; //原24位位图宽度

nLineWidth = nSrcWidth*3/4*4;
if(nLineWidth<nSrcWidth*3)
nLineWidth=nLineWidth+4; //保证以DWORD对齐(为4的整数倍)

nScanWidth=nSrcWidth/4*4;
if(nScanWidth<nSrcWidth)
nScanWidth=nScanWidth+4; //保证以DWORD对齐(为4的整数倍)

//申请位图的空间
int nDataLen = nScanWidth*nSrcHeight+2;
lpNewBmpInfo=(BITMAPINFO *) new BYTE[ *dwFileLength];
lpNewBmpData=new BYTE[nDataLen];


//设置新的位图为8位位图,并设置其相应宽度与高度
lpNewBmpInfo->bmiHeader=lpOldBmpInfo->bmiHeader;
lpNewBmpInfo->bmiHeader.biBitCount=8;

//数据起始位置为原位图信息头起始+位图信息头大小+彩色表大小
lpNewBmpData = (BYTE*)(lpNewBmpInfo + sizeof(BITMAPINFOHEADER) /* 256* sizeof(RGBQUAD) ;*/ ); //指向图像数据的实际位置, 主要问题是在这里吧,看了BMP的结构...是应该加上256* sizeof(RGBQUAD)这个吧,还是不行..

int i,j;
//为其相应的彩色表赋值
for(i=0;i<256;i++)
{
lpNewBmpInfo->bmiColors[i].rgbRed=i;
lpNewBmpInfo->bmiColors[i].rgbGreen=i;
lpNewBmpInfo->bmiColors[i].rgbBlue=i;
lpNewBmpInfo->bmiColors[i].rgbReserved=0;
}

//按转换公式将其进行转换
for(i=0;i<nSrcHeight;i++)
{
for(j=0;j<nSrcWidth;j++)
{
BYTE color[3];
DWORD dwColorTemp;
for(int s=0; s<3; s++)
color[s]=lpOldBmpData[i*nLineWidth+j*3+s];

dwColorTemp=int(color[2]*0.299+color[1]*0.587+color[0]*0.114);

if(dwColorTemp>255)
dwColorTemp=255;
if( dwColorTemp< 0 )
dwColorTemp = 0;

lpNewBmpData[i*nScanWidth+j]=(unsigned char)dwColorTemp;
}
}
lpNewBmpData[nScanWidth*nSrcHeight]=0;
lpNewBmpData[nScanWidth*nSrcHeight+1]=0;

if( !CloseHandle( hFile ) )
printf("关闭文件时失败");


return (BYTE*)lpNewBmpInfo;

}

//传进文件名与文件长度,创建8位位图文件
BOOL SaveFile(CString strFileName, DWORD dwFileLength)
{
HANDLE hSaveFile = CreateFile( strFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( !hSaveFile )
{
printf( "创建文件出错\n");
return FALSE;
}

//
DWORD dwWriteNum;
BITMAPFILEHEADER BFH;
BFH.bfType = 'MB';
BFH.bfSize = dwFileLength + sizeof(BITMAPFILEHEADER);
BFH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256* sizeof(RGBQUAD) ; //256为调色表颜色数(0-255),这里没错吧
BFH.bfReserved1 = BFH.bfReserved2 = 0;

//写位图头信息
WriteFile( hSaveFile, &BFH, sizeof(BITMAPFILEHEADER), &dwWriteNum, NULL);

//写实际数据
WriteFile( hSaveFile, lpNewBmpInfo, dwFileLength, &dwWriteNum, NULL);
CloseHandle( hSaveFile );
return TRUE;

}
...全文
2532 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackke 2007-03-15
  • 打赏
  • 举报
回复
看了你的代码后,我修改了一下,经过测试,没有了你说的问题
///////////////////////////////////////////////////////
//创建文件句柄
HANDLE hFile = ::CreateFile("E:\\bitmap.bmp",GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == 0)
{
MessageBox("不能打开文件,请重新选择!");
}

DWORD dwWriteNum;
BITMAPFILEHEADER Bmp_file_head; //文件头
ReadFile(hFile,&Bmp_file_head,14,&dwWriteNum,NULL);//读取文件头,共14个字节

if((Bmp_file_head.bfType != 'MB')||(dwWriteNum != sizeof(BITMAPFILEHEADER)))
{
MessageBox("不是BMP位图文件或数据有误!");
}

BITMAPINFOHEADER Bmp_info_head; //信息头
ReadFile(hFile,&Bmp_info_head,40,&dwWriteNum,NULL);

if(dwWriteNum != sizeof(BITMAPINFOHEADER))
{
MessageBox("读取信息头错误!");
}

//读取24位图像素数据
DWORD Bitmap_bit_len;
Bitmap_bit_len = Bmp_file_head.bfSize-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER);

BYTE *lpOldBmpData = new BYTE[Bitmap_bit_len];
ReadFile(hFile,lpOldBmpData,Bitmap_bit_len,&dwWriteNum,NULL);

if(dwWriteNum != Bitmap_bit_len)
{
MessageBox("位图像素数据读取错误!");
}

int nScanWidth; //转换后其每行扫描宽度
int nLineWidth; //将其转换成8位位图后每行宽度(即每行字节数)
int nSrcWidth,nSrcHeight;

nSrcHeight = Bmp_info_head.biHeight; //原24位位图高度(像素数)
nSrcWidth = Bmp_info_head.biWidth; //原24位位图宽度(像素数)

nLineWidth = ((nSrcWidth*3)/4)*4;
if(nLineWidth<nSrcWidth*3)
nLineWidth=nLineWidth+4; //保证以DWORD对齐(为4的整数倍)(原图象每行字节数)

nScanWidth=(nSrcWidth/4)*4;
if(nScanWidth<nSrcWidth)
nScanWidth=nScanWidth+4; //保证以DWORD对齐(为4的整数倍)(转换图象每行像素数)

//申请8位图的空间
int intnDataLen = nScanWidth*nSrcHeight;//+2; //原图像素数

BYTE * lpNewBmpData = new BYTE[intnDataLen];

//为8位位图像素赋值
for(int i=0;i<nSrcHeight;i++) //像素
{
for(int j=0;j<nSrcWidth;j++) //像素
{
BYTE color[3];
unsigned int dwColorTemp;
for(int s=0; s<3; s++)
color[s]=lpOldBmpData[i*nLineWidth+j*3+s];

dwColorTemp=unsigned int(color[2]*0.299+color[1]*0.587+color[0]*0.114);

if(dwColorTemp>255)
dwColorTemp=255;
if( dwColorTemp< 0 )
dwColorTemp = 0;
//***************the problem is here****************************//
lpNewBmpData[i*nScanWidth+j]=(unsigned char)dwColorTemp;
}
}

//设置8位位图调色板
RGBQUAD *rgbQuad = new RGBQUAD[256];
for(i=0;i<256;i++)
{
rgbQuad[i].rgbBlue = i;
rgbQuad[i].rgbGreen = i;
rgbQuad[i].rgbRed = i;
rgbQuad[i].rgbReserved = 0;
}
//设置8位位图文件头
BITMAPFILEHEADER Bmp_new_file_head;
Bmp_new_file_head.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
Bmp_new_file_head.bfReserved1 = Bmp_file_head.bfReserved1;
Bmp_new_file_head.bfReserved2 = Bmp_file_head.bfReserved2;
Bmp_new_file_head.bfType = Bmp_file_head.bfType;
Bmp_new_file_head.bfSize = Bmp_new_file_head.bfOffBits+intnDataLen;

//设置8位位图信息头
Bmp_info_head.biBitCount=8;

//关闭24位位图文件
if( !CloseHandle( hFile ) )
MessageBox("关闭文件时失败");

HANDLE hSaveFile = CreateFile("E:\\bitmap_8.bmp", GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if( !hSaveFile )
{
MessageBox( "创建文件出错");
}

//写位图文件头
WriteFile( hSaveFile, &Bmp_new_file_head, sizeof(BITMAPFILEHEADER), &dwWriteNum, NULL);

//写位图信息头
WriteFile( hSaveFile, &Bmp_info_head, sizeof(BITMAPINFOHEADER), &dwWriteNum, NULL);

//写位图调色板
WriteFile( hSaveFile, rgbQuad, 256*sizeof(RGBQUAD), &dwWriteNum, NULL);

//写位图像素数据
WriteFile( hSaveFile, lpNewBmpData, intnDataLen, &dwWriteNum, NULL);

//关闭8位位图
CloseHandle( hSaveFile );
jtg98g3 2006-12-15
  • 打赏
  • 举报
回复
就是x坐标,y坐标各自翻转180度。
jtg98g3 2006-12-15
  • 打赏
  • 举报
回复
好像是这样的,以屏幕左上角为坐标,向下为y正,向右为x正。这是我们重画图像常用的坐标。实际上微软的画图软件的位图文件是以右下角为顺序存储的,跟上面的坐标刚好倒过来了。
Stefine 2006-12-15
  • 打赏
  • 举报
回复
实际上可以
CharlesPrince 2006-12-15
  • 打赏
  • 举报
回复
lpNewBmpInfo->bmiHeader=lpOldBmpInfo->bmiHeader;
lpNewBmpInfo->bmiHeader.biBitCount=8;
这样可以赋值吗?

typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

我认为不可以
sdhzzzzcd 2006-12-14
  • 打赏
  • 举报
回复
好久不看BMP了。。。
xuancaoer 2006-12-14
  • 打赏
  • 举报
回复
mark
IamRobert 2006-12-14
  • 打赏
  • 举报
回复
关注,最近遇到这方面的问题。
dvhome 2006-12-14
  • 打赏
  • 举报
回复
前一段时间我也曾为处理BMP文件弄的一头雾水…… -_-!!!

BMP像素数据对齐你做了吗?(我没有细看你的代码,瞎猜的)
lih163 2006-12-14
  • 打赏
  • 举报
回复
占位
sgzwiz 2006-12-14
  • 打赏
  • 举报
回复
?
liuqiyc 2006-12-13
  • 打赏
  • 举报
回复
第一处与转换后文件大小有关

第二处导致偏移
(BYTE*)(lpNewBmpInfo + 1)相当于 (BYTE*)lpNewBmpInfo + sizeof(BITMAPINFO)
所以,lpNewBmpData 不是紧更在调色表数据后
BenLeak 2006-12-13
  • 打赏
  • 举报
回复
我觉得是字节对齐问题

不要使用 sizeof() 宏定义比较好
直接写 8 位位图的 1078 字节看看什么效果?
vcmute 2006-12-13
  • 打赏
  • 举报
回复
//数据起始位置为原位图信息头起始+位图信息头大小+彩色表大小
lpNewBmpData = (BYTE*)((BYTE*)lpNewBmpInfo + sizeof(BITMAPINFOHEADER) + 256* sizeof(RGBQUAD) );
Stefine 2006-12-13
  • 打赏
  • 举报
回复
#include<stdio.h>

#include <afx.h>
#include <windows.h>

BYTE* ConvertTo8Bit(CString strFileName, DWORD *dwFileLength) ;
BOOL SaveFile(CString strFileName, DWORD dwFileLength);

BITMAPINFO* lpNewBmpInfo; //新8位位图信息头首指针
BYTE * lpOldBmp; //指向原来24位位图信息头
BYTE* lpNewBmpData; //指向新的8位位图的信息头指针

void main()
{

char strOpenFileName[200], strSaveFileName[200];
printf("请输入一幅24位位图的路径!\n");
gets( strOpenFileName );
printf("请输入你要保存转换后的8位位图的路径!\n");
gets( strSaveFileName );

DWORD dwFileLength;
lpNewBmpInfo = (BITMAPINFO*)ConvertTo8Bit( strOpenFileName, &dwFileLength);
if( !lpNewBmpInfo )
{
printf( "转换出错,程序退出!\n");
return ;
}
if( !SaveFile( strSaveFileName, dwFileLength) )
{
printf( "保存文件出错!" );
return ;
}

if( lpNewBmpInfo != NULL)
delete []lpNewBmpInfo;
if( lpOldBmp != NULL )
delete []lpOldBmp;
}


/*************************************************************************
* 功能: 将24位位图转换为8位位图

* 参数: strFileName: (in)24位位图文件所在路径
lpNewBmpData: (out)做为8位位图的实际数据的指针
*dwFileLength: (out)为原24位位图图像文件长度(从文件信息头开始,不含文件头的14个字节)

* 返回: 8位位图的信息头指针

************************************************************************/
BYTE* ConvertTo8Bit(CString strFileName, DWORD *dwFileLength)
{

if( lpNewBmpData != NULL )
{
delete []lpNewBmpData;
lpNewBmpData = NULL;
}

//创建文件句柄
HANDLE hFile = ::CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == 0)
{
printf("不能打开文件,请重新选择!\n");
return NULL;
}

//读取图像文件
DWORD dwWriteNum;
BITMAPFILEHEADER Bmp_file_head; //文件头
ReadFile(hFile,&Bmp_file_head,14,&dwWriteNum,NULL);//读取文件头,共14个字节
if((Bmp_file_head.bfType != 'MB')||(dwWriteNum != sizeof(BITMAPFILEHEADER)))
{
printf("不是BMP位图文件或数据有误!\n");
return NULL;
}
*dwFileLength = GetFileSize(hFile,NULL)-sizeof(BITMAPFILEHEADER); //获取文件的长度


lpOldBmp= new BYTE[ *dwFileLength]; //存放原24位位图像,包括图像的信息头、调色板和像素数据
ReadFile(hFile,lpOldBmp,*dwFileLength,&dwWriteNum,NULL); //读取图像数据


BYTE *lpOldBmpData = lpOldBmp + sizeof(BITMAPINFOHEADER) ; //指向图像数据的实际位置,其调色板为0
BITMAPINFO *lpOldBmpInfo = (BITMAPINFO*)lpOldBmp;

if( lpOldBmpInfo->bmiHeader.biBitCount != 24)
{
printf( "此图像非24位位图!");
return NULL;
}

int nScanWidth; //转换后其每行扫描宽度
int nLineWidth; //将其转换成8位位图后每行宽度(即每行字节数)
int nSrcWidth,nSrcHeight;

nSrcHeight=lpOldBmpInfo->bmiHeader.biHeight; //原24位位图高度
nSrcWidth=lpOldBmpInfo->bmiHeader.biWidth; //原24位位图宽度

nLineWidth = nSrcWidth*3/4*4;
if(nLineWidth<nSrcWidth*3)
nLineWidth=nLineWidth+4; //保证以DWORD对齐(为4的整数倍)

nScanWidth=nSrcWidth/4*4;
if(nScanWidth<nSrcWidth)
nScanWidth=nScanWidth+4; //保证以DWORD对齐(为4的整数倍)

//申请位图的空间
lpNewBmpInfo=(BITMAPINFO *) new BYTE[ *dwFileLength ];


//设置新的位图为8位位图,并设置其相应宽度与高度
lpNewBmpInfo->bmiHeader=lpOldBmpInfo->bmiHeader;
lpNewBmpInfo->bmiHeader.biBitCount=8;

//数据起始位置为原位图信息头起始+位图信息头大小+彩色表大小
lpNewBmpData = (BYTE*)lpNewBmpInfo + sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);
int i,j;
//为其相应的彩色表赋值
for(i=0;i<256;i++)
{
lpNewBmpInfo->bmiColors[i].rgbRed=i;
lpNewBmpInfo->bmiColors[i].rgbGreen=i;
lpNewBmpInfo->bmiColors[i].rgbBlue=i;
lpNewBmpInfo->bmiColors[i].rgbReserved=0;
}

//按转换公式将其进行转换
for(i=0;i<nSrcHeight;i++)
{
for(j=0;j<nSrcWidth;j++)
{
BYTE color[3];
DWORD dwColorTemp;
for(int s=0; s<3; s++)
color[s]=lpOldBmpData[i*nLineWidth+j*3+s];

dwColorTemp=int(color[2]*0.299+color[1]*0.587+color[0]*0.114);

if(dwColorTemp>255)
dwColorTemp=255;
if( dwColorTemp< 0 )
dwColorTemp = 0;

lpNewBmpData[i*nScanWidth+j]=(unsigned char)dwColorTemp;
}
}


if( !CloseHandle( hFile ) )
printf("关闭文件时失败");


return (BYTE*)lpNewBmpInfo;

}

//传进文件名与文件长度,创建8位位图文件
BOOL SaveFile(CString strFileName, DWORD dwFileLength)
{
HANDLE hSaveFile = CreateFile( strFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( !hSaveFile )
{
printf( "创建文件出错\n");
return FALSE;
}


DWORD dwWriteNum;
BITMAPFILEHEADER BFH;
BFH.bfType = 'MB';
BFH.bfSize = dwFileLength + sizeof(BITMAPFILEHEADER);
BFH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256* sizeof(RGBQUAD) ; //文件头+信息头+颜色表
BFH.bfReserved1 = BFH.bfReserved2 = 0;

//写位图头信息
WriteFile( hSaveFile, &BFH, sizeof(BITMAPFILEHEADER), &dwWriteNum, NULL);

//写实际数据
WriteFile( hSaveFile, lpNewBmpInfo, dwFileLength, &dwWriteNum, NULL);
CloseHandle( hSaveFile );
return TRUE;

}

大家接分吧...
Stefine 2006-12-13
  • 打赏
  • 举报
回复
非常感谢LS的这些兄弟...

特别是liuqiyc(cyiquil) ,laiyiling(陌生人)

现在已经弄出来了...

将其中几个地方纠正下:
主要问题就是这里
//数据起始位置为原位图信息头起始+位图信息头大小+彩色表大小
lpNewBmpData = (BYTE*)lpNewBmpInfo + sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);

必须先将其转换成BYTE*后再加...

另外to : liuqiyc(cyiquil) ,laiyiling(陌生人)
你们都说申请空间时就只用那个nScanWidth*nSrcHeight + sizeof(BITMAPINFOHEADER) + 256* sizeof(RGBQUAD);但我试了,每次都不能得到位图文件,其创建后只有8KB,根本没有数据...
我直接用的文件长度了...

另外再TO: laiyiling(陌生人)
//设置新的位图为8位位图,并设置其相应宽度与高度
lpNewBmpInfo->bmiHeader=lpOldBmpInfo->bmiHeader;
lpNewBmpInfo->bmiHeader.biBitCount=8;
其实这样是可行的,因为bmiHeader就是BITMAPINFOHEADER结构..所以这个赋值将其24位位图的信息头全部赋给他了,然后就改变位图的灰度为8就行了..

至于另外的朋友叫我去用开源的CxImage,先谢了...马上看看

代码可读化程序不高,laiyiling(陌生人)说得正是,努力提高ing

下面是更改后的代码...

再次感谢所有的朋友...
combojiang 2006-12-13
  • 打赏
  • 举报
回复
用CxImage图像开源库,解决这个很简单。
wugencao520 2006-12-13
  • 打赏
  • 举报
回复
太长了 mark!
mood8125 2006-12-13
  • 打赏
  • 举报
回复
mark
deeplymove 2006-12-13
  • 打赏
  • 举报
回复
http://gforge.osdn.net.cn/projects/ipa-lib
上面的ipa-lib里面有代码
加载更多回复(14)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧