【问题标题】:Define an unnsigned CHAR in PHP在 PHP 中定义一个无符号 CHAR
【发布时间】:2013-03-20 11:14:03
【问题描述】:

一个简单的问题,但我在 php 网站上找不到文档。

我正在使用 ImageMagick 并将像素导出为 CHAR

$pixels = $im->exportImagePixels(0, 0, $im->getImageGeometry()['width'], $im->getImageGeometry()['height'], "RGB", Imagick::PIXEL_CHAR);

我需要定义新像素并且我希望它们是 CHAR 类型。 当我在单个像素上使用 var_dump 时,PHP 将它们识别为整数。 现在我看到 php 没有 CHAR 数据类型,所以我想定义一个像这样的两字节无符号整数:

我将像素定义为 $pixel = 134;范围从 0 到 255

我想这样定义对应的字符:

0xFF & $pixel

它不起作用。

有人知道为什么吗?或者我能用它做什么? 我尝试使用 PIXEL_FLOAT 数据类型,但它真的很重,而且它会使我的脚本在更大的图片上崩溃。

谢谢大家。

【问题讨论】:

  • 您得到的确切错误信息是什么?
  • 如果你想控制数据类型,PHP可能是错误的方法。
  • 不会给我一个错误,当我分配 $oldpixel = $newpixel 并且 $oldpixel 是一个 char 而 $newpixel 是一个 int 时,我得到的值是 -127 或 0,基本上图像会变成黑色的。我只是在使用 Imagick 类,我用其他语言做到了,但我需要在 php 中进行,因为它必须在 Web 服务器上运行
  • $im->exportImagePixels() 返回什么?一个数组,我相信:imagemagick.org/RMagick/doc/image2.html#export_pixels?
  • 不知道它是否对你有帮助,但这是我一直在研究的一个 PHP 扩展,它可以让你进行一些非常复杂的图像处理:github.com/chung-leong/qb/wiki

标签: php types integer imagemagick int


【解决方案1】:

使用pack函数:

function printPacked($base, $packed_value)
{
    $value = unpack($base, $packed_value);
    printf("%08x \n", $value[1]);
}

// Unsigned char
//
$oldpixel = pack( "C", 0xFF );
printPacked("C", $oldpixel);

// Unsigned short, little-endian
//
$newpixel = pack( "v", 0xCDEF );
printPacked("v", $newpixel);

// Assign the short to the char
//
$oldpixel = $newpixel;
printPacked("C", $oldpixel);

// Mask operation on the char
//
$oldpixel = $oldpixel & pack( "C", 0xAB );                                      
printPacked("C", $oldpixel);

上面程序的输出是:

000000ff 
0000cdef 
000000ef 
000000ab

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2022-12-03
    • 2014-04-10
    相关资源
    最近更新 更多