ios - 将图像处理转换为 64 位会创建黑线

标签 ios objective-c image 64-bit

我继承了一个图像过滤器应用程序,我正在尝试更新它。 Apple 要求我更改架构以支持 64 位。在 64 位手机上,图像有垂直的黑条(见下文)。 32 位手机按预期工作。

这似乎是假设 32 位系统的旧代码的问题,但我该如何解决呢?

Imgur

我已将其范围缩小为以下应用图像曲线的代码:

NSUInteger*  currentPixel = _rawBytes;
NSUInteger*  lastPixel = (NSUInteger*)((unsigned char*)_rawBytes + _bufferSize);

while(currentPixel < lastPixel)
{
    SET_RED_COMPONENT_RGBA(currentPixel, _reds[RED_COMPONENT_RGBA(currentPixel)]);
    SET_GREEN_COMPONENT_RGBA(currentPixel, _greens[GREEN_COMPONENT_RGBA(currentPixel)]);
    SET_BLUE_COMPONENT_RGBA(currentPixel, _blues[BLUE_COMPONENT_RGBA(currentPixel)]);
    ++currentPixel;
}

以下是宏定义:
#define ALPHA_COMPONENT_RGBA(pixel)      (unsigned char)(*pixel >> 24)
#define BLUE_COMPONENT_RGBA(pixel)       (unsigned char)(*pixel >> 16)
#define GREEN_COMPONENT_RGBA(pixel)      (unsigned char)(*pixel >> 8)
#define RED_COMPONENT_RGBA(pixel)        (unsigned char)(*pixel >> 0)

#define SET_ALPHA_COMPONENT_RGBA(pixel, value)      *pixel = (*pixel & 0x00FFFFFF) | ((unsigned long)value << 24)
#define SET_BLUE_COMPONENT_RGBA(pixel, value)       *pixel = (*pixel & 0xFF00FFFF) | ((unsigned long)value << 16)
#define SET_GREEN_COMPONENT_RGBA(pixel, value)      *pixel = (*pixel & 0xFFFF00FF) | ((unsigned long)value << 8)
#define SET_RED_COMPONENT_RGBA(pixel, value)        *pixel = (*pixel & 0xFFFFFF00) | ((unsigned long)value << 0)

#define BLUE_COMPONENT_ARGB(pixel)      (unsigned char)(*pixel >> 24)
#define GREEN_COMPONENT_ARGB(pixel)      (unsigned char)(*pixel >> 16)
#define RED_COMPONENT_ARGB(pixel)       (unsigned char)(*pixel >> 8)
#define ALPHA_COMPONENT_ARGB(pixel)      (unsigned char)(*pixel >> 0)

#define SET_BLUE_COMPONENT_ARGB(pixel, value)       *pixel = (*pixel & 0x00FFFFFF) | ((unsigned long)value << 24)
#define SET_GREEN_COMPONENT_ARGB(pixel, value)      *pixel = (*pixel & 0xFF00FFFF) | ((unsigned long)value << 16)
#define SET_RED_COMPONENT_ARGB(pixel, value)        *pixel = (*pixel & 0xFFFF00FF) | ((unsigned long)value << 8)
#define SET_ALPHA_COMPONENT_ARGB(pixel, value)      *pixel = (*pixel & 0xFFFFFF00) | ((unsigned long)value << 0)

我应该如何更改以上内容以在 32 位或 64 位设备上工作?我需要包含更多代码吗?

最佳答案

NSUInteger在 32 位和 64 位设备之间更改大小。它曾经是 4 个字节;现在是 8。代码假设它正在处理 RGBA 数据,每个 channel 都有一个字节,因此 8 字节指针的增量跳过了一半的数据。

只需明确说明大小:

uint32_t * currentPixel = _rawBytes;
uint32_t * lastPixel = (uint32_t *)((unsigned char *)_rawBytes + _bufferSize);

并且计算应该在两种类型的设备上都能正常工作。

关于ios - 将图像处理转换为 64 位会创建黑线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36072969/

相关文章:

jquery - 在图像覆盖的 header 标记内带有顶部边距的带边框的文本标题

ios - 如何将对象分类为 Objective-C 中选择器的数组

iphone - 如何更改 CCScrollLayer 内容大小? (cocos2d扩展类)

iphone 设备方向

javascript - 如何在不使用 window.stop() 的情况下中止图像 <img> 加载请求

css - 打破容器时垂直对齐图像

ios - 容器 View 中的自定义 UITableViewController

ios - Array Swift 中的 exc_bad_instruction 错误

ios - 应用程序启动时自动布局更改 View 的高度

objective-c - 如何转到 UITableView 中的下一个单元格(详细信息 View )?