html修改headicon,iOS 图片上传的两种方式

咱们在写代码的时候常常会将头像进行上传服务器,上传头像图片我试过两种方式

一种方式就是使用base64字符串上传图片,这种形式我我的认为比较适合上传图片数量比较少的,好比上传头像,上传图片数量多的话,速度会慢些

另外一种方式是使用二进制流进行上传图片,这种方式上传图片少或者数量多都不要紧,速度也很快

demo地址:

https://github.com/tuwanli/PictureHead

选择头像效果:

7cb58414fa40d096652f56c5f23403e2.png

程序以下:

ViewController.h

#import

@interface ViewController :

UIViewController

@property (weak,

nonatomic) IBOutlet

UIImageView *headIcon;

- (IBAction)changeIconAction:(UITapGestureRecognizer *)sender;

@end

ViewController.m

#import "ViewController.h"

#import "AFHTTPRequestOperationManager.h"

@interface

ViewController ()

{

UIImagePickerController *pickerController;

AFHTTPRequestOperationManager *manager;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super

viewDidLoad];

//初始化头像控件

[self

initHeadIcon];

//初始化pickController

[self

createData];

}

- (void)initHeadIcon

{

self.view.backgroundColor = [UIColor

lightGrayColor];

self.headIcon.layer.cornerRadius

= self.headIcon.frame.size.height/2;

self.headIcon.clipsToBounds =

YES;

self.headIcon.layer.borderColor

= [UIColor whiteColor].CGColor;

self.headIcon.layer.borderWidth

= 3;

}

- (void)createData

{

//初始化pickerController

pickerController = [[UIImagePickerController

alloc]init];

pickerController.view.backgroundColor = [UIColor

orangeColor];

pickerController.delegate =

self;

pickerController.allowsEditing =

YES;

}

- (IBAction)changeIconAction:(UITapGestureRecognizer *)sender {

UIActionSheet *actionSheet = [[UIActionSheet

alloc]initWithTitle:@"选择头像"

delegate:self

cancelButtonTitle:@"取消"

destructiveButtonTitle:nil

otherButtonTitles:@"拍照",@"相册",@"图库",

nil];

[actionSheet showInView:[UIApplication

sharedApplication].keyWindow];

}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{

if (buttonIndex ==

0) {//相机

if([UIImagePickerController

isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])

{

NSLog(@"支持相机");

[self

makePhoto];

}else{

UIAlertView *alert = [[UIAlertView

alloc]initWithTitle:@"提示"

message:@"请在设置-->隐私-->相机,中开启本应用的相机访问权限!!"

delegate:self

cancelButtonTitle:@"取消"

otherButtonTitles:@"我知道了",

nil];

[alert

show];

}

}else

if (buttonIndex ==

1){//相片

if([UIImagePickerController

isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])

{

NSLog(@"支持相册");

[self

choosePicture];

}else{

UIAlertView *alert = [[UIAlertView

alloc]initWithTitle:@"提示"

message:@"请在设置-->隐私-->照片,中开启本应用的相机访问权限!!"

delegate:self

cancelButtonTitle:@"取消"

otherButtonTitles:@"我知道了",

nil];

[alert

show];

}

}else

if (buttonIndex ==

2){//图册

if ([UIImagePickerController

isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])

{

NSLog(@"支持图库");

[self

pictureLibrary];

// [self presentViewController:picker animated:YES completion:nil];

}else{

UIAlertView *alert = [[UIAlertView

alloc]initWithTitle:@"提示"

message:@"请在设置-->隐私-->照片,中开启本应用的相机访问权限!!"

delegate:self

cancelButtonTitle:@"取消"

otherButtonTitles:@"我知道了",

nil];

[alert

show];

}

}else

if (buttonIndex ==

3){

}

}

//跳转到imagePicker里

- (void)makePhoto

{

pickerController.sourceType =

UIImagePickerControllerSourceTypeCamera;

[self

presentViewController:pickerController

animated:YES

completion:nil];

}

//跳转到相册

- (void)choosePicture

{

pickerController.sourceType =

UIImagePickerControllerSourceTypeSavedPhotosAlbum;

[self

presentViewController:pickerController

animated:YES

completion:nil];

}

//跳转图库

- (void)pictureLibrary

{

pickerController.sourceType =

UIImagePickerControllerSourceTypePhotoLibrary;

[self

presentViewController:pickerController

animated:YES

completion:nil];

}

//用户取消退出picker时候调用

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

{

NSLog(@"%@",picker);

[pickerController

dismissViewControllerAnimated:YES

completion:^{

}];

}

//用户选中图片以后的回调

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary

*)info

{

NSLog(@"%s,info == %@",__func__,info);

UIImage *userImage = [self

fixOrientation:[info

objectForKey:@"UIImagePickerControllerOriginalImage"]];

userImage = [self

scaleImage:userImage

toScale:0.3];

//保存图片

// [self saveImage:userImage name:@"某个特定标示"];

[pickerController

dismissViewControllerAnimated:YES

completion:^{

}];

[self.headIcon

setImage:userImage];

self.headIcon.contentMode

= UIViewContentModeScaleAspectFill;

self.headIcon.clipsToBounds =

YES;

//照片上传

[self

upDateHeadIcon:userImage];

}

- (void)upDateHeadIcon:(UIImage *)photo

{

//两种方式上传头像

/*方式一:使用NSData数据流传图片*/

NSString *imageURl =

@"";

manager.responseSerializer = [AFHTTPResponseSerializer

serializer];

manager.responseSerializer.acceptableContentTypes =[NSSet

setWithObject:@"text/html"];

[manager

POST:imageURl parameters:nil

constructingBodyWithBlock:^(id formData) {

[formData appendPartWithFileData:UIImageJPEGRepresentation(photo,

1.0)

name:@"text"

fileName:@"test.jpg"

mimeType:@"image/jpg"];

}

success:^(AFHTTPRequestOperation *operation,

id responseObject) {

}

failure:^(AFHTTPRequestOperation *operation,

NSError *error) {

}];

/*方式二:使用Base64字符串传图片*/

NSData *data =

UIImageJPEGRepresentation(photo, 1.0);

NSString *pictureDataString=[data

base64Encoding];

NSDictionary * dic =

@{@"verbId":@"modifyUserInfo",@"deviceType":@"ios",@"userId":@"",@"photo":pictureDataString,@"mobileTel":@""};

[manager

POST:@""

parameters:dic success:^(AFHTTPRequestOperation *operation,

id responseObject) {

if ([[responseObject

objectForKey:@"flag"]

intValue] == 0) {

}else{

}

}

failure:^(AFHTTPRequestOperation *operation,

NSError *error) {

}];

}

//保存照片到沙盒路径(保存)

- (void)saveImage:(UIImage *)image name:(NSString *)iconName

{

NSArray *paths =

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,

YES);

//写入文件

NSString *icomImage = iconName;

NSString *filePath = [[paths

objectAtIndex:0]

stringByAppendingPathComponent:[NSString

stringWithFormat:@"%@.png", icomImage]];

//

保存文件的名称

// [[self getDataByImage:image] writeToFile:filePath atomically:YES];

[UIImagePNGRepresentation(image)writeToFile: filePath

atomically:YES];

}

//缩放图片

- (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize

{

UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize));

[image

drawInRect:CGRectMake(0,

0, image.size.width * scaleSize, image.size.height *scaleSize)];

UIImage *scaledImage =

UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

NSLog(@"%@",NSStringFromCGSize(scaledImage.size));

return scaledImage;

}

//修正照片方向(手机转90度方向拍照)

- (UIImage *)fixOrientation:(UIImage *)aImage {

// No-op if the orientation is already correct

if (aImage.imageOrientation ==

UIImageOrientationUp)

return aImage;

CGAffineTransform transform =

CGAffineTransformIdentity;

switch (aImage.imageOrientation) {

case

UIImageOrientationDown:

case

UIImageOrientationDownMirrored:

transform =

CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);

transform =

CGAffineTransformRotate(transform,

M_PI);

break;

case

UIImageOrientationLeft:

case

UIImageOrientationLeftMirrored:

transform =

CGAffineTransformTranslate(transform, aImage.size.width,

0);

transform =

CGAffineTransformRotate(transform,

M_PI_2);

break;

case

UIImageOrientationRight:

case

UIImageOrientationRightMirrored:

transform =

CGAffineTransformTranslate(transform,

0, aImage.size.height);

transform =

CGAffineTransformRotate(transform, -M_PI_2);

break;

default:

break;

}

switch (aImage.imageOrientation) {

case

UIImageOrientationUpMirrored:

case

UIImageOrientationDownMirrored:

transform =

CGAffineTransformTranslate(transform, aImage.size.width,

0);

transform =

CGAffineTransformScale(transform, -1,

1);

break;

case

UIImageOrientationLeftMirrored:

case

UIImageOrientationRightMirrored:

transform =

CGAffineTransformTranslate(transform, aImage.size.height,

0);

transform =

CGAffineTransformScale(transform, -1,

1);

break;

default:

break;

}

// Now we draw the underlying CGImage into a new context, applying the transform

// calculated above.

CGContextRef ctx =

CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,

CGImageGetBitsPerComponent(aImage.CGImage),

0,

CGImageGetColorSpace(aImage.CGImage),

CGImageGetBitmapInfo(aImage.CGImage));

CGContextConcatCTM(ctx, transform);

switch (aImage.imageOrientation) {

case

UIImageOrientationLeft:

case

UIImageOrientationLeftMirrored:

case

UIImageOrientationRight:

case

UIImageOrientationRightMirrored:

CGContextDrawImage(ctx,

CGRectMake(0,0,aImage.size.height,aImage.size.width),

aImage.CGImage);

break;

default:

CGContextDrawImage(ctx,

CGRectMake(0,0,aImage.size.width,aImage.size.height),

aImage.CGImage);

break;

}

CGImageRef cgimg =

CGBitmapContextCreateImage(ctx);

UIImage *img = [UIImage

imageWithCGImage:cgimg];

CGContextRelease(ctx);

CGImageRelease(cgimg);

return img;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity中实现敌人看到角色的前三秒内头顶有一个Image图标,可以按照以下步骤进行: 1. 创建一个Image对象,作为头顶图标,可以通过代码或者在场景中手动创建。 2. 在敌人脚本中,检测到角色进入视野范围后,将头顶图标激活,并将其放置在敌人头顶的位置,可以使用Transform组件的position属性来控制位置。 3. 设置一个计时器,在敌人发现角色后的前三秒内,保持头顶图标的显示状态。 4. 当计时器超过三秒后,将头顶图标设置为不可见,并重置计时器。 下面是一个简单的示例代码: ```csharp public class Enemy : MonoBehaviour { public Image headIcon; // 头顶图标 public float detectTime = 3f; // 角色发现后的持续时间 private bool isDetecting = false; private float detectTimer = 0f; void Update() { if (isDetecting) { detectTimer += Time.deltaTime; if (detectTimer > detectTime) { headIcon.gameObject.SetActive(false); isDetecting = false; detectTimer = 0f; } } } // 角色进入视野范围 void OnTriggerEnter(Collider other) { if (other.tag == "Player") { headIcon.gameObject.SetActive(true); headIcon.transform.position = transform.position + Vector3.up * 2f; isDetecting = true; } } } ``` 这个示例代码假设头顶图标已经在场景中创建,并且作为Enemy脚本的一个公共变量。当角色进入敌人的视野范围内时,头顶图标会被激活并放置在敌人头顶的位置。同时,计时器开始计时,当计时器超过三秒后,头顶图标会被设置为不可见状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值