iOS CoreImage 生成BitMap 图片


//
//  ViewController.m
//  test_gifflen_02
//
//  Created by jeffasd on 15/11/23.
//  Copyright © 2015年 jeffasd. All rights reserved.
//

#import "ViewController.h"
//#import "gifflenlib/gifflen_h.h"
//#import "dibHead.h"

extern      int giffle_Giffle_Init( char * gifName, int w, int h, int numColors, int quality, int frameDelay);
extern      void  giffle_Giffle_Close();
extern      int  giffle_Giffle_AddFrame(int * intPoint);

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    NSString *filePath = [self backPath:@"Normal"];
    
    NSArray *fileList = [self findGIFImageInNormal:@"jiafei"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];
    NSString *imageDirectory = [path stringByAppendingPathComponent:@"Normal"];
    
    NSMutableArray *_arrayImage = [NSMutableArray array];
    for (NSString *iamgeName in fileList) {
        NSString *fileURL =[imageDirectory stringByAppendingPathComponent:iamgeName];
        //        [UIImage imageWithContentsOfFile:fileURL]
        [_arrayImage addObject:[UIImage imageWithContentsOfFile:fileURL]];
    }
    
    //    NSString *filePath = [self backPath:@"Normal"];
    UIImage *image = _arrayImage[0];
    
    
    int delay = 3;
    int width = image.size.width;
    int height = image.size.height;
    
    
//    CFDataRef bitmapData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    
//    CFIndex length = CFDataGetLength(bitmapData);
    
//    NSString * path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"jpg"];
//    UIImage * img = [[UIImage alloc]initWithContentsOfFile:path];
//    CGImageRef image = [img CGImage];
    CFDataRef bitmapData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
     int * buffer =  (int *)CFDataGetBytePtr(bitmapData);
    
    CFIndex length = CFDataGetLength(bitmapData);
    
//    CGBitmapContextGetData
    
//    [self RequestImagePixelData1:image];
    
    int * pbuff = RequestImagePixelData(image);
    
    NSString *fileName = [filePath stringByAppendingPathComponent:@"jiafeimao.gif"];
    
    if(giffle_Giffle_Init([fileName cStringUsingEncoding:NSUTF8StringEncoding], width, height, 256, 100, delay)!=0){
        NSLog(@"GifUtil init failed");
        return;
    }
    
    UIImage *image1 = _arrayImage[1];
    int *pbuff1 = RequestImagePixelData(image1);
    
    giffle_Giffle_AddFrame(pbuff);
//    giffle_Giffle_AddFrame(pbuff1);
    giffle_Giffle_Close();
    
    
    //    public void Encode(String fileName,Bitmap[] bitmaps,int delay){
    //        if(bitmaps==null||bitmaps.length==0){
    //            throw new NullPointerException("Bitmaps should have content!!!");
    //        }
    //        int width=bitmaps[0].getWidth();
    //        int height=bitmaps[0].getHeight();
    //
    //        if(Init(fileName,width,height,256,100,delay)!=0){
    //            Log.e(TAG, "GifUtil init failed");
    //            return;
    //        }
    //
    //        for(Bitmap bp:bitmaps){
    //            int pixels[]=new  int[width*height];
    //            bp.getPixels(pixels, 0, width,  0, 0, width, height);
    //            AddFrame(pixels);
    //        }
    //        Close();
    //    }
    
    CFRelease(bitmapData);
//    ViewController后缀为mm可以这样写
//    DIB *dib = new DIB;
//    char *str = "1212";
//    dib->saveBMP(str, YES);
    
}

CGContextRef CreateRGBABitmapContext (CGImageRef inImage){
    CGContextRef context = NULL; CGColorSpaceRef colorSpace;
    void *bitmapData;
    int bitmapByteCount;
    int bitmapBytesPerRow;
    size_t pixelsWide = CGImageGetWidth(inImage);
    size_t pixelsHigh = CGImageGetHeight(inImage);
    bitmapBytesPerRow = (pixelsWide * 4);
    bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
    colorSpace = CGColorSpaceCreateDeviceRGB();  if (colorSpace == NULL){
        fprintf(stderr, "Error allocating color space");
        return NULL;
    }
    
//    The number of bits for each component of a pixel is specified by
//        `bitsPerComponent'. The number of bytes per pixel is equal to
//        `(bitsPerComponent * number of components + 7)/8'.
    
    // allocate the bitmap & create context
//    bitmapData = malloc( bitmapByteCount );
    bitmapData = malloc( CGImageGetWidth(inImage) * CGImageGetHeight(inImage) * 4 );
    if (bitmapData == NULL){
        printf (stderr, "Memory not allocated!");
        CGColorSpaceRelease( colorSpace );
        return NULL;
    }
    
//    context = CGBitmapContextCreate (bitmapData,
//                                     pixelsWide,
//                                     pixelsHigh,
//                                     8,
//                                     bitmapBytesPerRow,
//                                     colorSpace,
//                                     kCGImageAlphaPremultipliedLast);
    
    NSLog(@"the bit info is %u", CGImageGetBitmapInfo(inImage));
    NSLog(@"the AlphaInfo is %u", CGImageGetAlphaInfo(inImage));
    
//    CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
//    CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
    
    //error
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNone;
    
    context = CGBitmapContextCreate (bitmapData,
                                     pixelsWide,
                                     pixelsHigh,
                                     8,
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     bitmapInfo);
    
    if (context == NULL){
        free (bitmapData);
        fprintf (stderr, "Context not created!");
        NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        //严重crash
        exit(-1);
    }
    
    CGColorSpaceRelease( colorSpace );
    
    return context;
}

    // Return Image Pixel data as an RGBA bitmap
int * RequestImagePixelData(UIImage *inImage) {
        
        CGImageRef img = [inImage CGImage];
        CGSize size = [inImage size];
        CGContextRef cgctx = CreateRGBABitmapContext(img);
        if (cgctx == NULL)
            return NULL;
        
        CGRect rect = {{0,0},{size.width, size.height}};
        CGContextDrawImage(cgctx, rect, img);
    
        int * data = CGBitmapContextGetData (cgctx);
    
    
    
        NSLog(@"the bit info is %u", CGBitmapContextGetBitmapInfo(cgctx));
        NSLog(@"the AlphaInfo is %u", CGBitmapContextGetAlphaInfo(cgctx));
    
        CGContextRelease(cgctx);
        return data;
}

// Return Image Pixel data as an RGBA bitmap
- (int *)RequestImagePixelData1:(UIImage *)inImage
{
    
    CGImageRef img = [inImage CGImage];
    CGSize size = [inImage size];
    UIGraphicsBeginImageContextWithOptions(size, NO, 1);
    CGContextRef cgctx = CreateRGBABitmapContext(img);
    if (cgctx == NULL)
        return NULL;
//       UIGraphicsBeginImageContextWithOptions(size, NO, 1);
    CGRect rect = {{0,0},{size.width, size.height}};
    CGContextDrawImage(cgctx, rect, img);
//            unsigned char *data = CGBitmapContextGetData (cgctx);
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
     CGImageRef saveImageRef = CGBitmapContextCreateImage(cgctx);
    UIImage *saveImage = [UIImage imageWithCGImage:saveImageRef];
    
    NSData *imageData = UIImagePNGRepresentation(saveImage);
    NSString *filePath = [self backPath:@"Normal"];
    NSString *fileName = [filePath stringByAppendingPathComponent:@"save.png"];
    [imageData writeToFile:fileName atomically:YES];
//
//    
//    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, size.width, size.height)];
//    [imageView setImage:[UIImage imageWithContentsOfFile:fileName]];
//    [self.view addSubview:imageView];
    
    
    int * data = CGBitmapContextGetData (cgctx);
    
    //        CGBitmapContextGetBitmapInfo
    
    NSLog(@"the bit info is %u", CGBitmapContextGetBitmapInfo(cgctx));
    
    CGContextRelease(cgctx);
    return data;
}

// void saveiamge(UIImage *inImage)
//{
//    NSData *imageData = UIImagePNGRepresentation(inImage);
//    NSString *filePath = [ViewController backPath:@"Normal"];
//    NSString *fileName = [filePath stringByAppendingPathComponent:@"jiafeimao.gif"];
//    [imageData writeToFile:pathNum atomically:NO];
//}

//返回保存图片的路径
-(NSString *)backPath:(NSString *)directoryName
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];
    
    NSString *imageDirectory = [path stringByAppendingPathComponent:directoryName];
    
    //    [fileManager createDirectoryAtPath:imageDirectory withIntermediateDirectories:YES attributes:nil error:nil];
    
    if (![fileManager fileExistsAtPath:imageDirectory]) {
        NSLog(@"there is no Directory: %@",imageDirectory);
        [fileManager createDirectoryAtPath:imageDirectory withIntermediateDirectories:YES attributes:nil error:nil];
        NSLog(@"create Directory: Documents/%@",directoryName);
    }
    NSLog(@"the Directory is exist %@",imageDirectory);
    return imageDirectory;
}

- (NSArray *)findGIFImageInNormal:(NSString *)gifName
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //    NSString *strFile = [documentsDirectory stringByAppendingPathComponent:@"hello/config.plist"];
    //    NSLog(@"strFile: %@", strFile);
    
    NSString *strPath = [documentsDirectory stringByAppendingPathComponent:@"Normal"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:strPath]) {
        NSLog(@"there is no Directory: %@",strPath);
        //        [[NSFileManager defaultManager] createDirectoryAtPath:strPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    //取得当前目录下的全部文件
    //    NSFileManager *fileManage = [NSFileManager defaultManager];
    //    NSArray *file = [fileManage subpathsOfDirectoryAtPath:strPath error:nil];
    //    NSArray *file = [self getFilenamelistOfType:@"png" fromDirPath:strPath];
    NSArray *file = [self getFilenamelistOfType:@"png" fromDirPath:strPath GIFName:gifName];
    //    NSLog(@"the file is %@", file);
    return file;
    
}

-(NSArray *) getFilenamelistOfType:(NSString *)type fromDirPath:(NSString *)dirPath GIFName:(NSString *)gifName
{
    NSArray *tempList = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:nil]
                         pathsMatchingExtensions:[NSArray arrayWithObject:type]];
    NSMutableArray *fileList = [NSMutableArray array];
    for (NSString *fileName in tempList) {
        //       NSString *name = [[fileName componentsSeparatedByString:@"."] objectAtIndex:0];
        //        if ([fileName isEqualToString:gifName] ) {
                    [fileList removeObject:fileName];
        //            [fileList addObject:fileName];
        //        }
        if ([fileName rangeOfString:gifName].location != NSNotFound) {
            //        if ([fileName rangeOfString:gifName] ) {
            //            [fileList removeObject:fileName];
            [fileList addObject:fileName];
        }
        
        //        NSLog(@"fileName is %@", name);
    }
    tempList = nil;
    
    //    //block比较方法,数组中可以是NSInteger,NSString(需要转换)
    //    NSComparator finderSort = ^(id string1,id string2){
    //
    //        if ([string1 integerValue] > [string2 integerValue]) {
    //            return (NSComparisonResult)NSOrderedDescending;
    //        }else if ([string1 integerValue] < [string2 integerValue]){
    //            return (NSComparisonResult)NSOrderedAscending;
    //        }
    //        else
    //            return (NSComparisonResult)NSOrderedSame;
    //    };
    //
    //    //数组排序:
    //    NSArray *resultArray = [fileList sortedArrayUsingComparator:finderSort];
    //    NSLog(@"第一种排序结果:%@",resultArray);
    
    NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch|NSNumericSearch|
    NSWidthInsensitiveSearch|NSForcedOrderingSearch;
    NSComparator sort = ^(NSString *obj1,NSString *obj2){
        NSRange range = NSMakeRange(0,obj1.length);
        return [obj1 compare:obj2 options:comparisonOptions range:range];
    };
    NSArray *resultArray2 = [fileList sortedArrayUsingComparator:sort];
    //    NSLog(@"字符串数组排序结果%@",resultArray2);
    
    
    return resultArray2;
    //    return fileList;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}






/* Program Skeleton
 ----------------
 [select samplefac in range 1..30]
 pic = (unsigned char*) malloc(4*width*height);
 [read image from input file into pic]
	initnet(pic,4*width*height,samplefac,colors);
	learn();
	unbiasnet();
	[write output image header, using writecolourmap(f),
	possibly editing the loops in that function]
	inxbuild();
	[write output image using inxsearch(a,b,g,r)]		*/




























@end


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值