我正在OTB(C ++库)中实现图像处理过滤器。
我通过一些非常基本的测试得到了一个奇怪的行为。当我将图像读作" char"时,以下代码总是输出像素值(在0-200范围内),即使它大于150.但是,当我使用&#34时,它工作正常; short int"。 " char"是否有特殊行为? (比如字母比较而不是数字值)或者还有其他原因吗?
当然,我的图像像素存储在字节中,所以我更喜欢处理" char"而不是" int"因为图像非常大(> 10 Gb)。
if (pixelvalue > 150)
{
out = 255;
}
else
{
out = pixelvalue;
}
答案 0 :(得分:11)
<script>
function scrollTo(image_id){
var topLeft = document.getElementById(image_id).offsetTop;
document.getElementById('container').scrollLeft = topLeft;
}
</script>
<div id="container" class="images_container">
<img id="image_1" src="/image1.jpg" height="500px" width="500px">
<img id="image_2" src="/image2.jpg" height="500px" width="500px">
<img id="image_3" src="/image3.jpg" height="500px" width="500px">
</div>
<div class="images_container thumbnails">
<a href="#image_1"><img src="/image1.jpg" class="thumbnail" onclick="scrollIntoView('image_1')"></a>
<a href="#image_2"><img src="/image2.jpg" class="thumbnail" onclick="scrollIntoView('image_2')"></a>
<a href="#image_3"><img src="/image3.jpg" class="thumbnail" onclick="scrollIntoView('image_3')"></a>
</div>
运行至(至少)255,但unsigned char
可能会被签名并限制为127.
答案 1 :(得分:5)
类型char
是有符号或无符号的(取决于编译器“喜欢”的内容 - 有时可以选择有符号或无符号字符类型),保证大小最小为8位(可能是9,16,18,32或36位,即使这种机器相对稀少)。
您的值150高于8位值的最大签名值,这意味着您使用的系统具有签名char
。
如果类型的目的是特定大小的整数值,请使用[u]intN_t
- 在这种情况下,因为您需要无符号值uint8_t
。这表明您正在处理的数据不是“字符串”更好[即使在幕后,编译器也会转换为unsigned char
。如果遇到char
不是8位的机器,这将无法编译,这是防止尝试调试奇怪问题的保护。