【问题标题】:How to get the bit depth of a CImg pixel?如何获得 CImg 像素的位深度?
【发布时间】:2020-04-15 17:24:41
【问题描述】:

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

例如,如果图像每像素使用 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(),但很快意识到这不是指像素深度。

谁能帮帮我?

【问题讨论】:

    标签: c++ cimg


    【解决方案1】:

    这里有两件事:

    1. documentation 声明:

      表示图像的类(最多 4 维宽),每个像素的类型为 T。

      这意味着像素深度由模板类型 T 定义。在您的情况下,这是unsigned char,导致像素深度为 8。如果您希望像素深度为 16,您可以使用CImg&lt;uint16_t&gt;

    2. 根据您正在阅读的文件类型,您可以确定位深度。例如,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数据中读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      相关资源
      最近更新 更多