MFC显示一幅位图

penghuahuijuan 2016-10-06 10:52:57
目前想实现的功能是:读取一幅ppm格式的图像,然后再MFC 的控件上进行显示;
程序如下:
	//Init bitmap head;
m_bmpInfo.bmiHeader.biHeight = m_Hei;
m_bmpInfo.bmiHeader.biWidth = m_Wid;
m_bmpInfo.bmiHeader.biCompression = BI_RGB;
m_bmpInfo.bmiHeader.biBitCount = 24;
m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_bmpInfo.bmiHeader.biPlanes = 1;
m_bmpInfo.bmiHeader.biSizeImage = m_Hei*m_Wid*3;
m_bmpInfo.bmiHeader.biClrUsed = 0;
m_bmpInfo.bmiHeader.biClrImportant = 0;
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
if(1 == m_Channel)
{
for(int i = 0; i < m_Hei; i++)
for(int j = 0; j < m_Wid; j++)
for(int c = 0; c < 3; c++)
{
m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
}
}

//save pixels' rgb value in sequence;reverse sequence;
//unsigned char* image = new unsigned char[m_Hei*m_Wid*3];
unsigned char*** image = qx_allocu_3(m_Hei,m_Wid,3);
memset(image[0][0],0,sizeof(unsigned char)*m_Hei*m_Wid*3);
for(int i = 0; i < m_Hei; i++)
for(int j = 0; j < m_Wid; j++)
for(int c = 0; c < 3; c++)
{
image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
//image[(m_Hei-i-1)*m_Wid*3 +j*3+c] = m_srcImagergb[i][j][2-c];//b,g,r;
}
//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);

CDC *pDC = m_srcWnd->GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
CBitmap *pOldBmp = MemDC.SelectObject(&bmp);

DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), 0, 0, m_bmpInfo.bmiHeader.biWidth,
m_bmpInfo.bmiHeader.biHeight, image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
qx_freeu_3(image);

但是结果不正确:如下:

原始图像:如下:

通过保存转换后的图片(这句saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid););说明倒置后的图片是正确的;说明应该是线面显示的问题。
我找了好久没找出来,看着结果应该是从图像的最后一行都进行了一个平移,而且平移量逐渐增加。还有颜色也不正确,是为什么呢??谢谢大家!!!
...全文
324 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
penghuahuijuan 2016-10-09
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
都有:

#if 1  // biBitCount = 24 
void CEdgeDetectionDlg::ShowSrcImage()
{
	//Init bitmap head;
    ZeroMemory(&m_bmpInfo, sizeof(BITMAPINFO));
	int wid1=(m_Wid + 3) & ~3;// 420 !!
	m_bmpInfo.bmiHeader.biHeight = m_Hei;
	m_bmpInfo.bmiHeader.biWidth = wid1;//420 !!
	m_bmpInfo.bmiHeader.biCompression = BI_RGB;
	m_bmpInfo.bmiHeader.biBitCount = 24;// !!
	m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_bmpInfo.bmiHeader.biPlanes = 1;
	m_bmpInfo.bmiHeader.biSizeImage = m_Hei*wid1*3;// !!
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
	if(1 == m_Channel)
	{
		for(int i = 0; i < m_Hei; i++)
			for(int j = 0; j < m_Wid; j++)
				for(int c = 0; c < 3; c++)
				{
					m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
				}
	}

	//save pixels' rgb value in sequence;reverse sequence;
	//unsigned char* image = new unsigned char[m_Hei*m_Wid*3];
	unsigned char*** image = qx_allocu_3(m_Hei,wid1,3);
	memset(image[0][0],0,sizeof(unsigned char)*m_Hei*wid1*3);
	for(int i = 0; i < m_Hei; i++)
		for(int j = 0; j < m_Wid; j++)
			for(int c = 0; c < 3; c++)
			{
				image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
			}
	//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);
	CDC *pDC = m_srcWnd->GetDC();
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
	CBitmap *pOldBmp = MemDC.SelectObject(&bmp);
//
	DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(),
		0, 0, m_Wid /* not Wid1 ! */, m_Hei,image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
	if(ERR==GDI_ERROR)
	{
		DWORD errcode=GetLastError();
	}
	pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
	qx_freeu_3(image);
}
#else // biBitCount = 32
void CEdgeDetectionDlg::ShowSrcImage()
{
	//Init bitmap head;
    ZeroMemory(&m_bmpInfo, sizeof(BITMAPINFO));
	m_bmpInfo.bmiHeader.biHeight = m_Hei;
	m_bmpInfo.bmiHeader.biWidth = m_Wid;// 417 !!
	m_bmpInfo.bmiHeader.biCompression = BI_RGB;
	m_bmpInfo.bmiHeader.biBitCount = 32;// !!
	m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_bmpInfo.bmiHeader.biPlanes = 1;
	m_bmpInfo.bmiHeader.biSizeImage = m_Hei*m_Wid*4;// !!
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
	if(1 == m_Channel)
	{
		for(int i = 0; i < m_Hei; i++)
			for(int j = 0; j < m_Wid; j++)
				for(int c = 0; c < 3; c++)
				{
					m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
				}
	}
// *4 !!!
	unsigned char*** image = qx_allocu_3(m_Hei,m_Wid,4);
	memset(image[0][0],0,sizeof(unsigned char)*m_Hei*m_Wid*4);
	for(int i = 0; i < m_Hei; i++)
		for(int j = 0; j < m_Wid; j++)
			for(int c = 0; c < 3; c++)
			{
				image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
				//image[(m_Hei-i-1)*m_Wid*3 +j*3+c] = m_srcImagergb[i][j][2-c];//b,g,r;
			}
	//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);
	CDC *pDC = m_srcWnd->GetDC();
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
	CBitmap *pOldBmp = MemDC.SelectObject(&bmp);
	//ScreenToClient(&m_srcWndRect);
	DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), 0, 0,
							m_Wid, m_Hei, image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
	if(ERR==GDI_ERROR)
	{
		DWORD errcode=GetLastError();
	}
	pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
	qx_freeu_3(image);
}
#endif
我实验,按32位处理显示是正常的,但按照24位显示,会显示错误,不同尺寸的图像,错误产生的显示效果也不一样;
penghuahuijuan 2016-10-09
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
都有:

#if 1  // biBitCount = 24 
void CEdgeDetectionDlg::ShowSrcImage()
{
	//Init bitmap head;
    ZeroMemory(&m_bmpInfo, sizeof(BITMAPINFO));
	int wid1=(m_Wid + 3) & ~3;// 420 !!
	m_bmpInfo.bmiHeader.biHeight = m_Hei;
	m_bmpInfo.bmiHeader.biWidth = wid1;//420 !!
	m_bmpInfo.bmiHeader.biCompression = BI_RGB;
	m_bmpInfo.bmiHeader.biBitCount = 24;// !!
	m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_bmpInfo.bmiHeader.biPlanes = 1;
	m_bmpInfo.bmiHeader.biSizeImage = m_Hei*wid1*3;// !!
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
	if(1 == m_Channel)
	{
		for(int i = 0; i < m_Hei; i++)
			for(int j = 0; j < m_Wid; j++)
				for(int c = 0; c < 3; c++)
				{
					m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
				}
	}

	//save pixels' rgb value in sequence;reverse sequence;
	//unsigned char* image = new unsigned char[m_Hei*m_Wid*3];
	unsigned char*** image = qx_allocu_3(m_Hei,wid1,3);
	memset(image[0][0],0,sizeof(unsigned char)*m_Hei*wid1*3);
	for(int i = 0; i < m_Hei; i++)
		for(int j = 0; j < m_Wid; j++)
			for(int c = 0; c < 3; c++)
			{
				image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
			}
	//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);
	CDC *pDC = m_srcWnd->GetDC();
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
	CBitmap *pOldBmp = MemDC.SelectObject(&bmp);
//
	DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(),
		0, 0, m_Wid /* not Wid1 ! */, m_Hei,image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
	if(ERR==GDI_ERROR)
	{
		DWORD errcode=GetLastError();
	}
	pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
	qx_freeu_3(image);
}
#else // biBitCount = 32
void CEdgeDetectionDlg::ShowSrcImage()
{
	//Init bitmap head;
    ZeroMemory(&m_bmpInfo, sizeof(BITMAPINFO));
	m_bmpInfo.bmiHeader.biHeight = m_Hei;
	m_bmpInfo.bmiHeader.biWidth = m_Wid;// 417 !!
	m_bmpInfo.bmiHeader.biCompression = BI_RGB;
	m_bmpInfo.bmiHeader.biBitCount = 32;// !!
	m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_bmpInfo.bmiHeader.biPlanes = 1;
	m_bmpInfo.bmiHeader.biSizeImage = m_Hei*m_Wid*4;// !!
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
	if(1 == m_Channel)
	{
		for(int i = 0; i < m_Hei; i++)
			for(int j = 0; j < m_Wid; j++)
				for(int c = 0; c < 3; c++)
				{
					m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
				}
	}
// *4 !!!
	unsigned char*** image = qx_allocu_3(m_Hei,m_Wid,4);
	memset(image[0][0],0,sizeof(unsigned char)*m_Hei*m_Wid*4);
	for(int i = 0; i < m_Hei; i++)
		for(int j = 0; j < m_Wid; j++)
			for(int c = 0; c < 3; c++)
			{
				image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
				//image[(m_Hei-i-1)*m_Wid*3 +j*3+c] = m_srcImagergb[i][j][2-c];//b,g,r;
			}
	//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);
	CDC *pDC = m_srcWnd->GetDC();
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
	CBitmap *pOldBmp = MemDC.SelectObject(&bmp);
	//ScreenToClient(&m_srcWndRect);
	DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), 0, 0,
							m_Wid, m_Hei, image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
	if(ERR==GDI_ERROR)
	{
		DWORD errcode=GetLastError();
	}
	pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
	qx_freeu_3(image);
}
#endif
谢谢你啊!我没想到这个,以前看到过,用的时候就忘了。真是谢谢你啊!!!
schlafenhamster 2016-10-09
  • 打赏
  • 举报
回复
都有:

#if 1  // biBitCount = 24 
void CEdgeDetectionDlg::ShowSrcImage()
{
	//Init bitmap head;
    ZeroMemory(&m_bmpInfo, sizeof(BITMAPINFO));
	int wid1=(m_Wid + 3) & ~3;// 420 !!
	m_bmpInfo.bmiHeader.biHeight = m_Hei;
	m_bmpInfo.bmiHeader.biWidth = wid1;//420 !!
	m_bmpInfo.bmiHeader.biCompression = BI_RGB;
	m_bmpInfo.bmiHeader.biBitCount = 24;// !!
	m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_bmpInfo.bmiHeader.biPlanes = 1;
	m_bmpInfo.bmiHeader.biSizeImage = m_Hei*wid1*3;// !!
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
	if(1 == m_Channel)
	{
		for(int i = 0; i < m_Hei; i++)
			for(int j = 0; j < m_Wid; j++)
				for(int c = 0; c < 3; c++)
				{
					m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
				}
	}

	//save pixels' rgb value in sequence;reverse sequence;
	//unsigned char* image = new unsigned char[m_Hei*m_Wid*3];
	unsigned char*** image = qx_allocu_3(m_Hei,wid1,3);
	memset(image[0][0],0,sizeof(unsigned char)*m_Hei*wid1*3);
	for(int i = 0; i < m_Hei; i++)
		for(int j = 0; j < m_Wid; j++)
			for(int c = 0; c < 3; c++)
			{
				image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
			}
	//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);
	CDC *pDC = m_srcWnd->GetDC();
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
	CBitmap *pOldBmp = MemDC.SelectObject(&bmp);
//
	DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(),
		0, 0, m_Wid /* not Wid1 ! */, m_Hei,image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
	if(ERR==GDI_ERROR)
	{
		DWORD errcode=GetLastError();
	}
	pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
	qx_freeu_3(image);
}
#else // biBitCount = 32
void CEdgeDetectionDlg::ShowSrcImage()
{
	//Init bitmap head;
    ZeroMemory(&m_bmpInfo, sizeof(BITMAPINFO));
	m_bmpInfo.bmiHeader.biHeight = m_Hei;
	m_bmpInfo.bmiHeader.biWidth = m_Wid;// 417 !!
	m_bmpInfo.bmiHeader.biCompression = BI_RGB;
	m_bmpInfo.bmiHeader.biBitCount = 32;// !!
	m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_bmpInfo.bmiHeader.biPlanes = 1;
	m_bmpInfo.bmiHeader.biSizeImage = m_Hei*m_Wid*4;// !!
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
	if(1 == m_Channel)
	{
		for(int i = 0; i < m_Hei; i++)
			for(int j = 0; j < m_Wid; j++)
				for(int c = 0; c < 3; c++)
				{
					m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
				}
	}
// *4 !!!
	unsigned char*** image = qx_allocu_3(m_Hei,m_Wid,4);
	memset(image[0][0],0,sizeof(unsigned char)*m_Hei*m_Wid*4);
	for(int i = 0; i < m_Hei; i++)
		for(int j = 0; j < m_Wid; j++)
			for(int c = 0; c < 3; c++)
			{
				image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
				//image[(m_Hei-i-1)*m_Wid*3 +j*3+c] = m_srcImagergb[i][j][2-c];//b,g,r;
			}
	//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);
	CDC *pDC = m_srcWnd->GetDC();
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
	CBitmap *pOldBmp = MemDC.SelectObject(&bmp);
	//ScreenToClient(&m_srcWndRect);
	DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), 0, 0,
							m_Wid, m_Hei, image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
	if(ERR==GDI_ERROR)
	{
		DWORD errcode=GetLastError();
	}
	pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
	qx_freeu_3(image);
}
#endif
schlafenhamster 2016-10-09
  • 打赏
  • 举报
回复
害得我把你给的ppm都试了一遍。
penghuahuijuan 2016-10-09
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
"按照24位显示,会显示错误" 哪个文件会出错 ?
谢谢你这么耐心啊!!
penghuahuijuan 2016-10-09
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
"按照24位显示,会显示错误" 哪个文件会出错 ?
你好,没错误,早上太粗心了
schlafenhamster 2016-10-09
  • 打赏
  • 举报
回复
"按照24位显示,会显示错误" 哪个文件会出错 ?
schlafenhamster 2016-10-08
  • 打赏
  • 举报
回复
修改 为 m_bmpInfo.bmiHeader.biBitCount = 32; m_bmpInfo.bmiHeader.biSizeImage = m_Hei*m_Wid*4;// 可以保证( m_Hei*m_Wid*4) 总是 4的 倍数

void CEdgeDetectionDlg::ShowSrcImage()
{
	//Init bitmap head;
    ZeroMemory(&m_bmpInfo, sizeof(BITMAPINFO));
//	m_Wid &= ~3;// 417 to 416 
	m_bmpInfo.bmiHeader.biHeight = m_Hei;
	m_bmpInfo.bmiHeader.biWidth = m_Wid;// 417
	m_bmpInfo.bmiHeader.biCompression = BI_RGB;
	m_bmpInfo.bmiHeader.biBitCount = 32;
	m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_bmpInfo.bmiHeader.biPlanes = 1;
	m_bmpInfo.bmiHeader.biSizeImage = m_Hei*m_Wid*4;// 
//if input image is one channel,then convert it to 3 channels to show in the dst Window;
	if(1 == m_Channel)
	{
		for(int i = 0; i < m_Hei; i++)
			for(int j = 0; j < m_Wid; j++)
				for(int c = 0; c < 3; c++)
				{
					m_srcImagergb[i][j][c] = m_srcImagegray[i][j];
				}
	}

	//save pixels' rgb value in sequence;reverse sequence;
	//unsigned char* image = new unsigned char[m_Hei*m_Wid*3];
	unsigned char*** image = qx_allocu_3(m_Hei,m_Wid,4);
	memset(image[0][0],0,sizeof(unsigned char)*m_Hei*m_Wid*4);
	for(int i = 0; i < m_Hei; i++)
		for(int j = 0; j < m_Wid; j++)
			for(int c = 0; c < 3; c++)
			{
				image[m_Hei-i-1][j][c] = m_srcImagergb[i][j][2-c];
				//image[(m_Hei-i-1)*m_Wid*3 +j*3+c] = m_srcImagergb[i][j][2-c];//b,g,r;
			}
	//saveimage_ppm("rgb.ppm",image,m_Hei,m_Wid);

	CDC *pDC = m_srcWnd->GetDC();
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, m_srcWndRect.Width(), m_srcWndRect.Height());
	CBitmap *pOldBmp = MemDC.SelectObject(&bmp);
	//ScreenToClient(&m_srcWndRect);
	DWORD ERR = StretchDIBits(MemDC.GetSafeHdc(),0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), 0, 0, m_bmpInfo.bmiHeader.biWidth, 
		m_bmpInfo.bmiHeader.biHeight, image[0][0], &m_bmpInfo, DIB_RGB_COLORS,SRCCOPY);
	if(ERR==GDI_ERROR)
	{
		DWORD errcode=GetLastError();
	}
	pDC->BitBlt(0, 0, m_srcWndRect.Width(), m_srcWndRect.Height(), &MemDC, 0, 0, SRCCOPY);
	qx_freeu_3(image);
	//delete []image;
}
schlafenhamster 2016-10-07
  • 打赏
  • 举报
回复
"旋转PPM.rar" http://download.csdn.net/detail/schlafenhamster/4916182 "本程序演示如何绘制及旋转PPM 格式的位图。"

15,979

社区成员

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

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