0

.png 画像を変更してフォルダーに保存したい。

  1. uiimage を NSData に変換します
  2. 一部のピクセルを変更する
  3. 変更された NSData から新しい UIImage を作成します
  4. この UIImage をフォルダに保存します
  5. この同じ UIImage を ImageView の image プロパティに設定します

UIImageの画像を確認するとピクセルデータは正しいのですが、保存した画像を読み込むとピクセルデータが修正後の値と少しずれています。

例えば:

  • 107 -76 -43 -1 //RGBA888 形式の元の画像の 1 ピクセル
  • 93 -89 -56 -1 // 変更されたピクセル値
  • 93 -89 -56 -1 //imageView の画像に設定して読み戻した後のピクセル値
  • 95 -91 -57 -1 //ストレージからロードした後のピクセル値

私の画像保存方法:

- (void) saveImage: (UIImage*) image toFolder: (NSString*) folder

{

[self.library saveImage: image toAlbum: folder withCompletionBlock:^(NSError *error) {
    if (error!=nil) {
        NSLog(@"Error: %@", [error description]);

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message: [error description]
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Image saved!"
                                                        message: nil
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }
}];

}

ピクセル修正方法:

CGImageRef cRef = CGImageRetain(_imageView.image.CGImage);
NSData* pixelData = (NSData*) CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(cRef)));
// image raw data    
signed char* pixelBytes = (signed char *)[pixelData bytes];

// MODIFY SOME PIXEL HERE

NSData* newPixelData = [NSData dataWithBytes:pixelBytes length:[pixelData length]];
// cast NSData as CFDataRef
CFDataRef imgData = (CFDataRef)CFBridgingRetain(newPixelData);
// Make a data provider from CFData
CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(imgData);

// get PNG properties from cRef
size_t width = CGImageGetWidth(cRef);
size_t height = CGImageGetHeight(cRef);
size_t bitsPerComponent = CGImageGetBitsPerComponent(cRef);
size_t bitsPerPixel = CGImageGetBitsPerPixel(cRef);
size_t bytesPerRow = CGImageGetBytesPerRow(cRef);
CGColorSpaceRef colorSpace = CGImageGetColorSpace(cRef);
CGBitmapInfo info = CGImageGetBitmapInfo(cRef);
CGFloat *decode = NULL;
BOOL shouldInteroplate = NO;
CGColorRenderingIntent intent = CGImageGetRenderingIntent(cRef);

// cRef PNG properties + imgDataProvider's data
CGImageRef throughCGImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, info, imgDataProvider, decode, shouldInteroplate, intent);
CGDataProviderRelease(imgDataProvider);
// make UIImage with CGImage
UIImage* newImage = [UIImage imageWithCGImage:throughCGImage];
CGImageRelease(throughCGImage);

[self saveImage:newImage toFolder:@"DEMOFOLDER"];

_imageView.image = newImage;
4

1 に答える 1

0

残念ながら、iOS のデフォルトでは画像が JPG として保存されます。

于 2012-11-19T16:09:02.320 に答える