0

Web サーバーからダウンロードしたフレームを使用して画像を読み込みました。

NSArray* frames = [self fetchFramesFromServer];
imageView.image = [UIImage animatedImageWithImages:frames duration:1.0];

これらのフレームをアーカイブしようとするたびに、エンコード関数は NO を返します。

BOOL success = [NSKeyedArchiver archiveRootObject:(frames) toFile:archivePath];

画像をアーカイブしようとするたびに、エンコーディング関数も NO を返します。

BOOL success = [NSKeyedArchiver archiveRootObject:(imageView.image) toFile:archivePath];

これは可能ですか、または UIImage をバンドルから、png 形式で、またはアニメーション化されていない状態でロードする必要がある archiveRootObject のいくつかの警告がありませんか?

参考までに、デバッガーで出力したときの archivePath は

NSPathStore2 * @"/var/mobile/Containers/Data/Application/E475E3C1-4E3F-43D6-AD66-0F98320CF279/Library/Private Documents/assets/a/b/c.archive"   0x000000012c555a60

アップデート:

アニメーションの個々のフレームを for ループ内に格納していますが、次のようになります。

+ (void) saveImage:(UIImage*)inputImage
    withSuffix:(NSString*)fileSuffix
{
if (inputImage == nil) {
    NSLog(@"ERROR: input image is nil!");
    return;
}

// strip away intermediate folders to avoid over-nesting
// ex: __F1/MF/FR/1_MF_FR_Animation_a1.png
// ===> 1_MF_FR_Animation_a1.png
NSString* suffixStub = [MyDatabase stubOfFilepath:fileSuffix];

NSURL* url = [MyDatabase folderURL];
NSURL* imageURL = [url URLByAppendingPathComponent:suffixStub];

NSData* pngData = UIImagePNGRepresentation(inputImage);
[NSKeyedArchiver archiveRootObject:pngData toFile:imageURL.path];
pngData = nil;

NSLog(@"Image %@ successfully saved!", fileSuffix);
} 

しかし、NSKeyedArchiver 行で、「malloc: *** オブジェクト 0x178202340 のエラー: 未割り当てのポインターを解放しています」というメッセージが表示されます。

4

1 に答える 1

0

最初に画像を NSData に変換してから、アーカイブしてみてください

NSData* data = UIImagePNGRepresentation(imageView.image);
BOOL success = [NSKeyedArchiver archiveRootObject:data toFile:archivePath];

の場合NSArray、配列のすべてのオブジェクトがNSCodingプロトコルに準拠している場合にのみアーカイブが可能です。配列にカスタム オブジェクトがある場合は、準拠方法についてカスタム オブジェクトのアーカイブNSCodingを参照してください。

アップデート

配列のオブジェクトが 型CGRectのフレームである場合、 と を使用NSStringFromCGRect()CGRectFromString()てそれらを格納してから取得できます。

于 2016-02-08T02:59:50.723 に答える