【问题标题】:NSData PNG invalid PNG file: iDOT doesn't point to valid IDAT chunkNSData PNG 无效的 PNG 文件:iDOT 未指向有效的 IDAT 块
【发布时间】:2014-05-23 21:41:00
【问题描述】:

每次我尝试在应用程序中打开图像时,都会收到以下错误:

:ImageIO:PNG 无效 PNG 文件:iDOT 未指向有效的 IDAT 块

:ImageIO:PNG 无效 PNG 文件:iDOT 未指向有效的 IDAT 块

:ImageIO:PNG 无效 PNG 文件:iDOT 未指向有效的 IDAT 块

这是我的头文件:

#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
#import <dispatch/dispatch.h>


@interface ImageViewController : UIViewController<NSURLConnectionDataDelegate>{
    dispatch_queue_t background;
}

@property (nonatomic,strong) PFObject *message;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (nonatomic,strong) NSMutableData *imageData;
@property (nonatomic,strong) NSURLConnection *connection;
- (IBAction)save:(id)sender;

@end

这里是实现:

#import "ImageViewController.h"

@interface ImageViewController ()

@end

@implementation ImageViewController



- (void)viewDidLoad
{
    NSLog(@"ImageViewController starts here");
    [super viewDidLoad];
    
        PFFile *imageFile = [self.message objectForKey:@"imageFile"];
        NSURL *imageURL = [[NSURL alloc]initWithString:imageFile.url];
    NSMutableURLRequest *request =[[NSMutableURLRequest alloc]initWithURL:imageURL];
    self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
    [self.connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    [self.connection start];
    
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    if (self.imageData == nil){
        self.imageData = [[NSMutableData alloc]init];
        [self.imageData appendData:data];
    }
    
    
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    self.imageView.image = [UIImage imageWithData:self.imageData];
    
}

@end

【问题讨论】:

    标签: ios objective-c uiimage nsmutabledata


    【解决方案1】:

    除了初始块之外,您现在实际上并没有将任何内容附加到 imageData 对象,因此损坏的 PNG。

    改变这个

    if (self.imageData == nil){
        self.imageData = [[NSMutableData alloc]init];
        [self.imageData appendData:data];
    }
    

    到这里

    if (self.imageData == nil){
        self.imageData = [[NSMutableData alloc]init];
    }
    [self.imageData appendData:data]; // <-- moved outside conditional
    

    【讨论】:

    • 请注意,您实际上应该在 connection:didReceiveResponse: 中初始化 self.imageData,因为每个请求可能会收到多个响应,例如,在 HTTP 重定向响应的情况下。在这种情况下,您的“图像”数据会将重定向消息中的任何数据附加到您的图像数据中,从而再次产生无效图像。