gpt4 book ai didi

ios - 将颜色列表从 Objective-C 传递到 React Native

转载 作者:行者123 更新时间:2023-12-01 16:06:53 24 4
gpt4 key购买 nike

我正在尝试在 Objective-C 中获取图像中所有颜色的列表。请注意,我对 Objective-C 完全陌生——我过去做过一些 Swift 工作,但不是真正的 Objective-C。

我拉了一个库,它或多或少应该将所有颜色作为其代码的一部分。我已经修改它看起来像这样(最后的回调来自 React Native,路径参数只是路径的字符串):

getColors:(NSString *)path options:(NSDictionary *)options callback:(RCTResponseSenderBlock)callback) {
UIImage *originalImage = [UIImage imageWithContentsOfFile:path ];

UIImage *image =
[UIImage imageWithCGImage:[originalImage CGImage]
scale:0.5
orientation:(UIImageOrientationUp)];



CGImageRef cgImage = [image CGImage];
NSUInteger width = CGImageGetWidth(cgImage);
NSUInteger height = CGImageGetHeight(cgImage);

// Allocate storage for the pixel data
unsigned char *rawData = (unsigned char *)malloc(height * width * 4);

// Create the color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// Set some metrics
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;

// Create context using the storage
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

// Release the color space
CGColorSpaceRelease(colorSpace);

// Draw the image into the storage
CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage);

// We are done with the context
CGContextRelease(context);


// determine the colours in the image
NSMutableArray * colours = [NSMutableArray new];

float x = 0;
float y = 0;
for (int n = 0; n<(width*height); n++){

int index = (bytesPerRow * y) + x * bytesPerPixel;
int red = rawData[index];
int green = rawData[index + 1];
int blue = rawData[index + 2];
int alpha = rawData[index + 3];
NSArray * a = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%i",red],[NSString stringWithFormat:@"%i",green],[NSString stringWithFormat:@"%i",blue],[NSString stringWithFormat:@"%i",alpha], nil];
[colours addObject:a];

y++;
if (y==height){
y=0;
x++;
}
}
free(rawData);

callback(@[[NSNull null], colours]);

现在,这个脚本看起来相当简单——它应该遍历每个像素并将每种颜色添加到一个数组中,然后通过回调将其返回给 React Native。

但是,对调用的响应始终是一个空数组。

我不确定为什么会这样。可能是由于图像的位置(它们在 AWS 上,在 S3 上),还是算法中的某些原因?代码在我看来是正确的,但我完全有可能因为不熟悉 Objective-C 而遗漏了一些东西

最佳答案

我在一个空项目中运行了您的代码,它使用从 Assets 库加载的图像按预期执行。 UIImage *originalImage = [UIImage imageWithContentsOfFile:path ]; 有可能吗?调用使用无效路径。您可以通过简单地记录读取图像的值来轻松验证:
UIImage * originalImage = [UIImage imageWithContentsOfFile: path];
NSLog(@"image read from file %@", originalImage);

如果图像没有从文件中正确读取,您将得到一个空的 colours数组,因为宽度和高度将为零,因此没有任何内容可以循环。

此外,为避免在函数返回后修改数组,通常最好返回可变对象或不可变对象(immutable对象)的副本(即 NSArray 而不是 NSMutableArray):
callback(@[[NSNull null], [colours copy]]);
希望这可以帮助

关于ios - 将颜色列表从 Objective-C 传递到 React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58179028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com