Плохой код Хаффмана? - PullRequest
       4

Плохой код Хаффмана?

1 голос
/ 11 апреля 2011

Я провожу некоторые тесты в своем приложении для iPhone и получаю эту ошибку:

<Error>: Corrupt JPEG data: bad Huffman code

Я видел некоторые странные ошибки, но эта действительно странная.Я также получаю некоторые другие испорченные ошибки от этого до того, что я не могу вспомнить.Позвольте мне опубликовать мой код для записи этих файлов по порядку.

Шаг 1: Сделайте снимок и сохраните его

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {
[picker.parentViewController dismissModalViewControllerAnimated:NO];

uploadImage = image;
int orient = uploadImage.imageOrientation;
NSString *theOrientation = [NSString stringWithFormat: @"%d", orient];

NSLog(@"Check it: 1");

NSString *latestIDQuery = @"";
NSArray *results = [database executeQuery:@"SELECT * FROM processes ORDER BY id DESC LIMIT 0,1"];   
for (NSDictionary *row in results) {
    latestIDQuery = [row valueForKey:@"id"];
}

int latestID = [latestIDQuery intValue];

int newID = latestID + 1;
NSString *newIDString = [[NSString alloc] initWithFormat:@"%d", newID];
NSString *imageURL = [NSString stringWithFormat:@"Documents/%@_process.jpg",newIDString];

NSLog(@"Saving here... %@", imageURL);

NSString *uploadImagePath = [NSString stringWithFormat:@"%@_process.jpg",newIDString];

NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:imageURL];
NSLog(@"Needs to write something like this: %@", jpgPath);
[UIImageJPEGRepresentation(uploadImage, 1.0) writeToFile:jpgPath atomically:YES];

[database executeNonQuery:@"INSERT INTO processes (image, album, status, orient, ready) VALUES (?, ?, ' In Queue', ?, 'no');", uploadImagePath, selectedID, theOrientation];

TableViewAppDelegate *dataCeter = (TableViewAppDelegate *)[[UIApplication sharedApplication] delegate];
dataCeter.dataSix = nil;
NSString *databaseURL = [NSString stringWithFormat:@"%@_process.jpg",newIDString];
dataCeter.dataSix = databaseURL;
[self showCaption];
}

Шаг 2: Начните загрузку и, возможно, измените ее размер:

        NSString *sqlImageUploadPathOne = @"./../Documents/";
        NSString *sqlImageUploadPathTwo = [rowtwo valueForKey:@"image"];
        NSString *getCaption = [rowtwo valueForKey:@"caption"];
        NSString *getTheID = [rowtwo valueForKey:@"id"];
        NSString *getOrientation = [rowtwo valueForKey:@"orient"];

        NSString *jpgPath = [NSString stringWithFormat:@"Documents/%@",sqlImageUploadPathTwo];
        NSString *jpgPathTwo = [NSString stringWithFormat:@"./../Documents/%@",sqlImageUploadPathTwo];
        NSString *yourPath = [NSHomeDirectory() stringByAppendingPathComponent:jpgPath];

        // Resize and Save
        UIImage *tempImageTwo = [UIImage imageNamed:jpgPathTwo];
        float tooBig = 800.0;
        UIImage *tempImage = [self scaleImage:tempImageTwo:tooBig:tooBig];
        NSData *imageDataTwo = [NSData dataWithData:UIImageJPEGRepresentation(tempImage, 0.1)];
        [imageDataTwo writeToFile:jpgPathTwo atomically:YES];

А вот функция, используемая для масштабирования изображения:

- (UIImage *)scaleImage:(UIImage *) image: (float)maxWidth:(float) maxHeight

{

CGImageRef imgRef = image.CGImage;

CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);

if (width <= maxWidth && height <= maxHeight)
{
    return image;
}

CGAffineTransform transform = CGAffineTransformIdentity;
CGRect bounds = CGRectMake(0, 0, width, height);

if (width > maxWidth || height > maxHeight)
{
    CGFloat ratio = width/height;
    if (ratio > 1)
    {
        bounds.size.width = maxWidth;
        bounds.size.height = bounds.size.width / ratio;
    }
    else
    {
        bounds.size.height = maxHeight;
        bounds.size.width = bounds.size.height * ratio;
    }
}
CGFloat scaleRatio = bounds.size.width / width;
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, scaleRatio, -scaleRatio);
CGContextTranslateCTM(context, 0, -height);
CGContextConcatCTM(context, transform);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageCopy;
}

Почему ТОЛЬКОнекоторые из моих изображений испорчены?Нужно ли мне идти по новому пути и делать это по-другому?

Спасибо,
Култон

1 Ответ

4 голосов
/ 11 апреля 2011

Мне показалось интересным заглавие этого вопроса, и я немного поискал. Википедия объясняет, что кодирование Хаффмана представляет собой :

алгоритм энтропийного кодирования, используемый для сжатия данных без потерь

Ваши данные JPG где-то повреждаются, а iOSSDK сообщает об этом.Что касается того, как и почему, Google имеет ряд результатов .

Согласно этому посту , похоже, что MySQL может повредить ваши изображения.Конечно, ваши изображения могут быть повреждены в нескольких местах, так как вы их обрабатываете.Требуется больше информации для диагностики точной проблемы.

Редактировать:

Кажется, что ваша функция изменения размера вызывает проблему.Попробуйте сравнить ваш код с методами, упомянутыми в этой теме , и посмотрите, помогут ли они вам вообще.Как уже упоминалось Мэтью Фредерик , MGImageUtilities Мэтта Джеммелла может быть то, что вам нужно.(Хотя я никогда не использовал и даже не видел их.) Мэтт Джеммелл известен в мире Mac / Objective-C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...