OC实现的IOS赫夫曼编码计算器(选取照片形式)

来源:互联网 发布:php找源码 编辑:程序博客网 时间:2024/06/06 07:05

对图片进行灰度化和压缩change.h

////  change.h//  homework1////  Created by 余玺 on 15/6/15.//  Copyright (c) 2015年 yx. All rights reserved.//#import <Foundation/Foundation.h>#import "ViewController.h"@interface change:UIViewController+ (UIImage *) grayscaleImage:(UIImage *) image;+ (UIImage *) imageCompressForWidth:(UIImage *)sourceImage targetWidth:(CGFloat)defineWidth;@end
change.m

////  change.m//  homework1////  Created by 余玺 on 15/6/15.//  Copyright (c) 2015年 yx. All rights reserved.//#import "change.h"@implementation change+ (UIImage *)grayscaleImage:(UIImage *) image{    CGSize size = image.size;    CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width,                             image.size.height);    // Create a mono/gray color space    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();    CGContextRef context = CGBitmapContextCreate(nil, size.width,                                                 size.height, 8, 0, colorSpace, kCGImageAlphaNone);    CGColorSpaceRelease(colorSpace);    // Draw the image into the grayscale context    CGContextDrawImage(context, rect, [image CGImage]);    CGImageRef grayscale = CGBitmapContextCreateImage(context);    CGContextRelease(context);    // Recover the image    UIImage *img = [UIImage imageWithCGImage:grayscale];    CFRelease(grayscale);    return img;}+(UIImage *) imageCompressForWidth:(UIImage *)sourceImage targetWidth:(CGFloat)defineWidth{    CGSize imageSize = sourceImage.size;    CGFloat width = imageSize.width;    CGFloat height = imageSize.height;    CGFloat targetWidth = defineWidth;    CGFloat targetHeight = (targetWidth / width) * height;    UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));    [sourceImage drawInRect:CGRectMake(0,0,targetWidth,  targetHeight)];    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return newImage;}@end

viewcontroller.m

////  ViewController.m//  homework1////  Created by 余玺 on 15/6/14.//  Copyright (c) 2015年 yx. All rights reserved.//#import "ViewController.h"#import "change.h"#define MAXBIT      100#define MAXVALUE  10000#define MAXLEAF     100#define MAXNODE    MAXLEAF*2 -1typedef struct{    int bit[MAXBIT];    int start;} HCodeType;typedef struct{    int weight;    int parent;    int lchild;    int rchild;} HNodeType;@interface ViewController ()@property (weak, nonatomic) IBOutlet UIImageView *gc;@property (weak, nonatomic) IBOutlet UIScrollView *liulan;@end@implementation ViewController- (IBAction)takepicture:(UIButton *)sender {    UIActionSheet* actionSheet = [[UIActionSheet alloc]                                  initWithTitle:@"请选择文件来源"                                  delegate:self                                  cancelButtonTitle:@"取消"                                  destructiveButtonTitle:nil                                  otherButtonTitles:@"照相机",@"本地相簿",nil];    [actionSheet showInView:self.view];}#pragma mark -#pragma UIActionSheet Delegate- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{    NSLog(@"buttonIndex = [%d]",buttonIndex);    switch (buttonIndex) {        case 0://照相机        {            UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];            imagePicker.delegate = self;            imagePicker.allowsEditing = YES;            imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;            //            [self presentModalViewController:imagePicker animated:YES];            [self presentViewController:imagePicker animated:YES completion:nil];        }            break;        case 1://本地相簿        {            UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];            imagePicker.delegate = self;            imagePicker.allowsEditing = YES;            imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;            //            [self presentModalViewController:imagePicker animated:YES];            [self presentViewController:imagePicker animated:YES completion:nil];        }            break;        default:            break;    }}- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{   UIImage *img = (UIImage*)[info objectForKey:UIImagePickerControllerEditedImage];    img = [change imageCompressForWidth:img targetWidth:15];//进行图片的压缩    img = [change grayscaleImage:img];//将图片灰度化    self.gc.image = img;//用选择的图片替换现有的图片    CGFloat width;    CGFloat height;    UIImage *heightmap = img;    CGImageRef imageRef = [heightmap CGImage];    width = CGImageGetWidth(imageRef);    height = CGImageGetHeight(imageRef);    CGDataProviderRef provider = CGImageGetDataProvider(imageRef);    NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));//获取图片每个像素的灰度值        int flag = 1;    const uint8_t *heightData = [data bytes];    int ii = 0;    int jj = 0;    int z = 0;    int a[300];    for (ii = 0; ii < width * height; ii++)    {        flag = 1;        for (jj = 0; jj < ii; jj++)        {                        if(heightData[jj] == heightData[ii]){                flag = 0;                break;                }                    }                if(flag == 0){            continue;        }        a[z] = heightData[ii];        z = z+1;    }           int m = 0;    int l = 0;    int b[300];    for(int k=0;k<z;k++){        m = 0;        for(int u = 0;u<width*height;u++){            if(a[k]==heightData[u]){                m=m+1;            }                        }        b[l] = m;        l = l+1;    }    //整理出像素的种类以及每种像素有多少个        HNodeType HuffNode[MAXNODE];    HCodeType HuffCode[MAXLEAF],  cd;       int i, j, m1, m2, x1, x2;       for (i=0; i<2*l-1; i++)    {        HuffNode[i].weight = 0;        HuffNode[i].parent =-1;        HuffNode[i].lchild =-1;        HuffNode[i].lchild =-1;    }        for (i=0; i<l; i++)    {      HuffNode[i].weight = b[i];    }            for (i=0; i<l-1; i++)    {        m1=m2=MAXVALUE;        x1=x2=0;                for (j=0; j<l+i; j++)        {            if (HuffNode[j].weight < m1 && HuffNode[j].parent==-1)            {                m2=m1;                x2=x1;                m1=HuffNode[j].weight;                x1=j;            }            else if (HuffNode[j].weight < m2 && HuffNode[j].parent==-1)            {                m2=HuffNode[j].weight;                x2=j;            }        }        HuffNode[x1].parent  = l+i;        HuffNode[x2].parent  = l+i;        HuffNode[l+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;        HuffNode[l+i].lchild = x1;        HuffNode[l+i].rchild = x2;    }        int c,p;        for (int i=0; i < l; i++)        {            cd.start = l-1;            c = i;            p = HuffNode[c].parent;            while (p != -1)            {                if (HuffNode[p].lchild == c)                    cd.bit[cd.start] = 0;                else                    cd.bit[cd.start] = 1;                cd.start--;                c=p;                p=HuffNode[c].parent;            }                                   for (j=cd.start+1; j<l; j++)            { HuffCode[i].bit[j] = cd.bit[j];}            HuffCode[i].start = cd.start;        }    int y = 0;        for (int i=0; i<l; i++)        {            for (j=HuffCode[i].start+1; j < l; j++)            {                UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(210+10*y,400+20*i,300,150)];                label.text = [NSString stringWithFormat:@"%d",HuffCode[i].bit[j]];                y = y+1;                [self.liulan addSubview:label];            }            y = 0;             printf ("\n");        }//显示哈弗曼编码的结果    for(int n=0;n<l;n++){        UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(120,400+20*n,300,150)];        label.text = [NSString stringWithFormat:@"%d",b[n]];        [self.liulan addSubview:label];    }    for(int n=0;n<l;n++){    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(30,400+20*n,300,150)];        label.text = [NSString stringWithFormat:@"%d",a[n]];        [self.liulan addSubview:label];    }    //显示其余项的数值       [picker dismissViewControllerAnimated:YES completion:nil];}- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{        //[picker dismissModalViewControllerAnimated:YES];    [picker dismissViewControllerAnimated:YES completion:nil];}- (void)viewDidLoad {    [super viewDidLoad];    self.gc.image = [UIImage imageNamed:@"symbol.jpg"];    self.liulan.contentSize=CGSizeMake(0, 2200);[super viewDidLoad];       // Do any additional setup after loading the view, typically from a nib.}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}@end


0 0
原创粉丝点击