首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从无符号字符*和无符号短*指针(RGB)创建/保存PPM文件(C++)

从无符号字符*和无符号短*指针(RGB)创建/保存PPM文件(C++)
EN

Stack Overflow用户
提问于 2012-02-15 02:33:43
回答 1查看 2.3K关注 0票数 1

我需要在C/C++中保存PPM文件的帮助。我想保存来自三个基本颜色通道的PPM图像。通道表示为空*指针(pRed、pGreen和pBlue)。这些值是固定的,所以我不能更改它们。

还有一个变量来决定必须如何解释void指针:这个变量是:

bpp=1正确的类型是unsigned char *。缓冲区元素的类型为unsigned char

bpp=2正确的类型是unsigned short *。Buffer元素的类型为unsigned short。

现在,我将从这三个颜色通道中保存一个ppm文件。

关于bpp变量的声明如下:

代码语言:javascript
运行
复制
//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文件的代码如下:

代码语言:javascript
运行
复制
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);
}

这里是错误的地方,因为我得到了正确的“结构”的记录图像,但颜色是完全奇怪的(心理风格) :)我在互联网上搜索和测试了许多东西,但没有一个工作。有人能给我指个方向吗?

EN

Stack Overflow用户

回答已采纳

发布于 2012-02-15 02:43:59

问题是你如何从你的图像缓冲区输出字节...您需要取消引用指针来获取实际的数据信息,而不是输出实际的指针值本身。

例如,如下所示:

代码语言:javascript
运行
复制
output << (unsigned char)((char*)dRed) << " ";

输出转换为unsigned char的4或8字节的指针值dRed ...您需要指针dRed所指向的值,其实现方法如下:

代码语言:javascript
运行
复制
output << *dRed << " ";

其次,如果每个颜色通道的数据存储在单独的连续线性数组中(即,红色指向红色像素,绿色指向绿色像素,而缓冲区中的数据是红色像素,然后是绿色像素,然后是蓝色像素),那么在16位/通道的情况下,您没有正确地递增这些值。如果缓冲区是线性数组,您可以简单地执行以下操作:

代码语言:javascript
运行
复制
 output << " " << dRed[i] << " " << dGreen[i] << " " << dBlue[i] << endl;

其中额外的空格符合PPM标准,其中像素值样本应该用空格字符括起来。

最后,在您输出的“普通”PPM格式中,任何行的长度都不应超过70个字符……你肯定要超过那个极限了..。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9282269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档