我需要从单个灰度图像(红橙黄等)创建 12 个彩色图像
源图像实际上是一个PNG,RGBA:
我正在使用我找到的一个库(https://github.com/PaulSolt/UIImage-Conversion/)将 UIImage 分解为一个 RGBA 字节数组,然后我逐个像素地处理它,并使用相同的库来重构一个新的用户界面图像。
这是我的代码:
- (UIImage*) cloneWithTint3: (CGColorRef) cgTint
{
enum { R, G, B, A };
// - - -
assert( CGColorGetNumberOfComponents( cgTint ) == 4 );
const float* tint = CGColorGetComponents( cgTint );
// - - -
int w = self.size.width;
int h = self.size.height;
int pixelCount = w * h;
uint8_t* data = [UIImage convertUIImageToBitmapRGBA8: self];
for( int i=0; i < pixelCount ; i++ )
{
int offset = i << 2; // same as 4 * i but faster
float in_r = data[ offset + R ];
float in_g = data[ offset + G ];
float in_b = data[ offset + B ];
// float in_a = data[ offset + A ];
if( i == 0 )
printf( "ALPHA %d ", data[ offset + A ] ); // corner pixel has alpha 0
float greyscale = 0.30 * in_r + 0.59 * in_g + 0.11 * in_b;
data[ offset + R ] = (uint8_t) ( greyscale * tint[ R ] );
data[ offset + G ] = (uint8_t) ( greyscale * tint[ G ] );
data[ offset + B ] = (uint8_t) ( greyscale * tint[ B ] );
}
UIImage* imageNew = [UIImage convertBitmapRGBA8ToUIImage: data
withWidth: w
withHeight: h ];
free( data );
// test corner pixel
{
uint8_t* test = [UIImage convertUIImageToBitmapRGBA8: self];
for( int i=0; i < 1 ; i++ )
{
int offset = i << 2;
// float in_r = test[ offset + R ];
// float in_g = test[ offset + G ];
// float in_b = test[ offset + B ];
// float in_a = data[ offset + A ];
printf( "ALPHA %d ", test[ offset + A ] ); // corner pixel still has alpha 0
}
free( test );
}
return imageNew;
}
问题是我没有恢复 alpha 通道——它在任何地方都将其设置为不透明。
如果我只是在第一行将源图像传回,它会正确渲染,所以问题不在于源图像。
如果我检查第一个像素的 alpha 分量,我发现它在过程中的所有点都是 0(即透明),这是应该的。如您所见,我什至进行了额外的测试——一旦我有了最终的 UIImage,我再次将其分解为 RGBA 位图并检查相同的元素。它仍然是0。
所以看来 convertUIImageToBitmapRGBA8 方法中一定有一些错误。看起来在生成的 UIImage 上必须有一些设置,这使它认为它在任何地方都是不透明的。
但是查看此方法的源代码(https://github.com/PaulSolt/UIImage-Conversion/blob/master/ImageHelper.m - 整个库就是这个带有标题的文件)我看不出问题出在哪里可能。
这是渲染输出:
如您所见,C 在 G 之前在 F 之前渲染,因此它的两侧都被矩形剪裁了。