我需要帮助以 C/C++ 保存 PPM 文件。我想从三个基本颜色通道中保存 PPM 图像。通道表示为 void * 指针(pRed、pGreen 和 pBlue)。这些值是固定的,所以我无法更改它们。
还有一个变量来决定如何解释 void 指针:这个变量是:
bpp=1 正确的类型是 unsigned char *。缓冲区元素的类型为 unsigned char
bpp=2 正确的类型是 unsigned short *。缓冲区元素是 unsigned short 类型。
现在我将从这三个颜色通道中保存一个 ppm 文件。
关于 bpp 变量的声明是:
//bpp=1:
unsigned char* dRed = (unsigned char*)pImg->pRed;
unsigned char* dGreen = (unsigned char*)pImg->pGreen;
unsigned char* dBlue = (unsigned char*)pImg->pBlue;
unsigned char* dBw = (unsigned char*)pImg->pBw;
//bpp=2:
unsigned short* dRed = (unsigned short*)pImg->pRed;
unsigned short* dGreen = (unsigned short*)pImg->pGreen;
unsigned short* dBlue = (unsigned short*)pImg->pBlue;
unsigned short* dBw = (unsigned short*)pImg->pBw;
我编写 ppm 文件的代码:
ofstream output(fname, ios::binary|ios::out);
output << "P3"<< endl <<"# foreground "<<endl;
output << itoa(width, fname, 10);
output << " ";
output << itoa(height, fname, 10);
output << endl;
output << itoa(255, fname, 10) << endl;
...
for(int i=0; i<(height*width); i++){
if(bytesPerP==1){
output << (unsigned char)((char*)dRed) << " ";
output << (unsigned char)((char*)dGreen) << " ";
output << (unsigned char)((char*)dBlue) << " ";
dRed = dRed + (i * bytesPerP);
dGreen = dGreen + (i * bytesPerP);
dBlue = dBlue + (i * bytesPerP);
}else if(bytesPerP==2){
output << ((unsigned short)((char*)dRed))%256 << " ";
output << (unsigned short)((char*)dGreen)%256 << " ";
output << (unsigned short)((char*)dBlue)%256 << " ";
dRed = dRed + (i * bytesPerP);
dGreen = dGreen + (i * bytesPerP);
dBlue = dBlue + (i * bytesPerP);
}
这是错误的任何地方,因为我得到了记录图像的正确“结构”,但颜色完全奇怪(迷幻风格):) 我在互联网上搜索并测试了很多东西,但没有一个有效。有人能指出我正确的方向吗?