菜鸟教程小白 发表于 2022-12-12 18:56:26

ios - 将 UIImage 数据保存到 iOS 中的照片库后取回


                                            <p><p>在将我的应用创建的图像保存到 iPhone 库并尝试取回它后,我遇到了一个问题。图像数据不同。</p>

<p><strong>创建图像</strong></p>

<p>1.代码</p>

<p>我在不使用 alpha 的情况下创建图像(事实上,如果我使用 alpha,我得到了相同的结果)</p>

<pre><code>+ (UIImage *)createImageFromData:(NSData *)data {
    uint8_t *imageData = (uint8_t *) calloc(WIDTH * HEIGHT * 3, sizeof(uint8_t));
    ;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
                                                            imageData,
                                                            WIDTH * HEIGHT * 3,
                                                            NULL);
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    CGImageRef imageRef = CGImageCreate(WIDTH,
                                        HEIGHT,
                                        8, // Bits per color component
                                        3 * 8, // Bits per pixel : 1 pixel =&gt; 3 component
                                        3 * WIDTH, // bytes per lign (1 byte = 1 component)
                                        colorSpace,
                                        bitmapInfo,
                                        provider,
                                        NULL,
                                        NO,
                                        renderingIntent);
    UIImage *resultImage = ;

    return resultImage;
}
</code></pre>

<p>2.调试</p>

<p>当我在方法的末尾加上 break 时,我得到了 lldb 的结果</p>

<pre><code>(lldb) p (int)imageData
(uint8_t) $0 = 102
(lldb) p (int)imageData
(uint8_t) $1 = 116
(lldb) p (int)imageData
(uint8_t) $2 = 121
(lldb) p (int)imageData
(uint8_t) $3 = 112
</code></pre>

<p><strong>保存图片</strong></p>

<pre><code>- (IBAction)saveImage:(id)sender {
    UIImageWriteToSavedPhotosAlbum(_image, self,
   @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
</code></pre>

<p>编辑:我尝试了另一种保存图像的方法:</p>

<pre><code>CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.generatedImageView.image.CGImage));
uint8_t *data = (uint8_t *)CFDataGetBytePtr(pixelData);
NSData *dataToSave = ;

ALAssetsLibrary *assetLib = [ init];
[assetLib writeImageDataToSavedPhotosAlbum:dataToSave metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
    NSLog(@&#34;%@&#34;, error);
}];
</code></pre>

<p><code>DataToSave</code> 得到了正确的字节数,<code>error</code> 和 <code>assetURL</code> 在完成 block 中都为零,我看不到任何相册中的新图像</p>

<p><strong>从库中取回图片</strong></p>

<p>这是一个委托(delegate)方法</p>

<pre><code>- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSString *mediaType = ;

    // Handle a still image picked from a photo album
    if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0)
    == kCFCompareEqualTo) {
      self.image = (UIImage *) ;
    }
    ;
}
</code></pre>

<p><strong>从上一张图片中取回数据</strong></p>

<p>1.代码</p>

<pre><code>+ (NSData *)createDataFromImage:(UIImage *)image {
    CGImageRef imageRef = ;

    CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    uint8_t *data = (uint8_t *)CFDataGetBytePtr(pixelData);

    return ;;
}
</code></pre>

<p>2.调试</p>

<p>现在我有什么</p>

<pre><code>(lldb) p (int)data
(int) $4 = 35
(lldb) p (int)data
(int) $5 = 72
(lldb) p (int)data
(int) $6 = 100
(lldb) p (int)data
(int) $7 = 255
</code></pre>

<p>出现一个值为 255 的 alpha 分量...这应该不是问题吗?但所有其他值(value)都发生了变化。而且我现在真的不知道如何获得以前的值!</p>

<p>编辑:这似乎是压缩(保存图像时)和解压缩(取回图像时)的问题。
但我需要在将其保存到相册后获得完全相同的数据。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您的图像在保存到相册之前会被压缩为 JPEG。并在加载时解压缩。 JPEG是有损压缩。因此,当您比较像素数据时,原始图像和压缩/解压缩图像之间存在差异。</p>

<p>要无损保存,请尝试以下操作:</p>

<pre><code>+ (void)saveImageData:(NSData *)data {
    ALAssetsLibrary *assetLib = [[ init] autorelease];
    ;
}
</code></pre>

<p>有关无损保存/加载到/从相册的更多信息,请阅读此线程<a href="https://stackoverflow.com/questions/13150017/saving-to-getting-jpeg-from-user-gallery-without-recompression" rel="noreferrer noopener nofollow">Saving to/getting JPEG from user gallery without recompression</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 将 UIImage 数据保存到 iOS 中的照片库后取回,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21838461/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21838461/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 将 UIImage 数据保存到 iOS 中的照片库后取回