iOS 上有什么办法图片转数据?

120 天前
 CSGO
帮 iOS 开发问的。
我之前用 AI 按照自己要求,写了一个 html 页面,可以实现我任意上传一个图片,比如 2 * 2 像素的 png 图片,一共四个像素,然后转换成类似 0x00 这样的数据组,是个 16 阶颜色的数据: https://www.wangyifang.com/web/img2hex/index.html

iOS 这边问了 AI 用到类似这样的:
-------
在 iOS 中,你可以使用 UIImage 来获取图片的数据。这里是一种常用的方法:
首先,你需要使用 UIImage 来获取你的图片,然后使用 UIImageJPEGRepresentation 或 UIImagePNGRepresentation 来将图片转化为 NSData 。
例如:

swift
if let image = UIImage(named: "your_image") {
let imageData = UIImagePNGRepresentation(image)
}

UIImageJPEGRepresentation 和 UIImagePNGRepresentation 的区别主要在于它们压缩图像数据的方式不同。JPEG 通常用于照片,而 PNG 通常用于带有透明度的图像。
如果你需要进一步处理图像数据,例如获取照片的具体像素信息,你可以将 NSData 转换为 CGImage ,然后通过 CGImage 来分析图像的每一个像素。
需要注意的是,所有的这些操作都能消耗大量的内存和 CPU ,如果你处理的图像非常大,那么可能需要考虑使用更加高级的图像处理库,例如 Core Image 或者 GPUImage 。
希望以上信息能帮助到你!
-------

但问题出现在这个东西 iOS 说用的是系统的,这导致现在比如在 iOS17.2.1 上会出现获取到图片数据是错误的。表现在如果有个 50*50 像素的带透明的 png ,中间有个正方形,那么获取到数据理论应该前后都有大量 0000 ,因为 RGBA 都是 0 ,结果获取到的数据前面会有其他数值,这导致再输出图像前面或者说说大量原本完全透明的地方出现大量比较随机的颜色。

现在想问的是,有没办法自己用什么办法能获取图片的像素信息?或者说 iOS 有没办法类似 html 那样能直接把图片转成 0x00 的?
1149 次点击
所在节点    iDev
2 条回复
rshinich
120 天前
试试直接用 CGImage 呢?然后用这个: https://developer.apple.com/documentation/coregraphics/cgdataprovider
653513754
120 天前
```
UIImage *origImg = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%s",imgPath]]; //加载图片

CGSize size = [origImg size];

int width = size.width;
int height = size.height;

uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t));

memset(pixels, 0, width * height * sizeof(uint32_t));

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), [origImg CGImage]);

int tt = 1;
CGFloat intensity;
int bw;


for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x]; // rgbaPixel[tt] + rgbaPixel[tt + 1] + rgbaPixel[tt + 2] 像素点

}
}


CGImageRef image = CGBitmapContextCreateImage(context);

CGContextRelease(context);

CGColorSpaceRelease(colorSpace);

free(pixels);
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1007783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX