簡體   English   中英

如何檢查下載的PNG圖像是否損壞?

[英]How to check if downloaded PNG image is corrupt?

我正在從下面的代碼下載多個圖像並保存到數據庫。 但是對於某些圖像,我遇到了以下錯誤。

錯誤:ImageIO:PNG 無效距離太遠 錯誤:ImageIO:PNG 數據檢查不正確

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);                               
dispatch_async(queue, ^{
    NSString *imgStr = [dict  objectForKey:@"image"];                  
    imgStr = [imgStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgStr]];
    UIImage *image = [UIImage imageWithData:imgData];

    dispatch_sync(dispatch_get_main_queue(), ^{
       mYImageView.image = image;
    });
});

在此處輸入圖片說明

如何檢查存儲的圖像是否有效,以便我可以再次下載圖像?

對於 PNG 圖像,檢查它們的前兩個字節和后兩個字節。 下面是方法,希望對你有幫助。

謝謝。 :)

- (BOOL)isImageValid:(NSData *)data
{
    BOOL val = YES;

    if ([data length] < 4) 
        val = NO;

    const char * bytes = (const char *)[data bytes];

    if (bytes[0] != 0x89 || bytes[1] != 0x50) 
        val = NO;
    if (bytes[[data length] - 2] != 0x60 || 
        bytes[[data length] - 1] != 0x82) 
        val = NO;

    return val;
}

swati sharma 接受的答案效果很好。 這是一個 Swift 擴展,適用於希望在 Swift 中執行相同操作的任何人:

extension Data
{
    /// Returns whether or not the data is for a valid PNG file.
    var isValidPNG: Bool
    {
        guard self.count > 4 else { return false }
        
        return self[0] == 0x89 &&
            self[1] == 0x50 &&
            self[self.count - 2] == 0x60 &&
            self[self.count - 1] == 0x82
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM