c++ - 如何获得CImg像素的位深度?

标签 c++ cimg

我正在尝试计算任何给定图像每个像素使用多少种颜色可能性。

例如,如果图像每个像素使用8位,则它可以表示256个阴影之一。

我正在寻找以下内容:

CImg<unsigned char> inputImage(inputImageFilename.c_str());
CImgDisplay disp_input(inputImage,"input");

std::cout << sizeof(inputImage[0]);

我知道该特定图像的像素深度为8位。我希望这将输出8,然后可以将其用作2的指数以得到256(2 ^ 8 = 256)。但是它输出1,因此这不是一个选择。

我也尝试过.depth(),但很快意识到这并不涉及像素深度。

有人可以帮我吗?

最佳答案

这里有两件事:

  • documentation指出:

    Class representing an image (up to 4 dimensions wide), each pixel being of type T.


    这意味着像素深度由模板类型T定义。在您的情况下,这是unsigned char,其像素深度为8。如果您希望像素深度为16,则可以使用CImg<uint16_t>
  • 根据您正在读取的文件类型,可以确定位深度。例如,Jpeg的位深度为8,而png的位深度为8或16(至少这是CImg支持的深度)。如果您有一个png文件,并且想知道位深,则可以使用load_png()函数,如下所示:
     CImg<unsigned char> inputImage();
     unsigned int bit_depth;
     inputImage.load_png(inputImageFilename.c_str(), &bit_depth);
     std::cout << bit_depth;
    
    由于我将unsigned char用作类型T,因此即使文件的位深度为16,我也只能访问前8位。如果是bit_depth == 16,则内部图像数据将保存为无符号短(也称为16位)。因此,以下应该是可能的:
     if (bit_depth == 16)
         CImg<unsigned short> newImage(inputImage);
    
    位深度当然也可以从文件的exif数据中读取。
  • 关于c++ - 如何获得CImg像素的位深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61234832/

    相关文章:

    c++ - 从 C++ 轮询 FSEvents

    c++ - 将 exr/pfm 保存到位图 CImg

    c++ - 尝试使用 libpng 加载图像时 Windows 上出现运行时错误

    c++ - 用于读取矩阵 C++ 的宏

    c++ - 构造函数中的 noob Iterator 运行时错误

    c++ - MFC LoadStringW 不是没有从字符串表中正确加载日文字符串

    c++ - 无法存储标准输入状态并在 C++ 中进行比较

    c++ - 尝试使用 CImg 保存图像时出错

    c++ - 用 CImg 显示二维 vector 的最佳方式