OC实现的IOS赫夫曼编码计算器(选取照片形式)
来源:互联网 发布:php找源码 编辑:程序博客网 时间:2024/06/06 07:05
对图片进行灰度化和压缩change.h
viewcontroller.m
//// 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;@endchange.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
- OC实现的IOS赫夫曼编码计算器(选取照片形式)
- Oc UIImagePickerController(拍照、拍摄照片、选取照片)~demo
- iOS-OC调用JS的多种形式
- IOS计算器的实现
- iOS 选取头像视图的实现(一)
- 网页形式的计算器.
- iOS UIImagePickerController(拍照、拍摄照片、选取照片)~demo
- iOS简易计算器的实现
- iOS简易计算器的实现
- ios实现简单的计算器
- ANTLR实现加法计算器(通过AST形式来实现)
- 面向对象下计算器的编码实现
- iOS判断从系统相册选取的是视频还是照片
- JDK1.7实现中关于中文编码方案的选取
- 适配Android7.0的拍照,选取照片
- iOS本地照片多选的实现
- phonegap下封装ios照片拍照、选取、裁剪、上传接口
- iOS开发-用Photos框架自定义选取照片界面
- js中获取两个日期之间相差的天数
- Linux 硬链接和软连接的区别
- C语言字符串截取函数strtok和strtok_r
- RIP/EIGRP/BGP/OSPF防环机制
- HDUOj BUS Fair 题目3420
- OC实现的IOS赫夫曼编码计算器(选取照片形式)
- hdoj1272小希的迷宫(并查集)
- Snail—UI学习之旋转进度轮UIActivityIndicatorView
- 掷骰子,求得每个数的概率
- android 杂记 3
- 国内镜像地址
- 腾讯面试题总结,似乎是面试C++方向的(小巫总结)
- [UVA1595]Symmetry
- Android中Activity中与ListActivity中使用listview区别