Commit ed4dc96c authored by David黄金龙's avatar David黄金龙

图片压缩 4M

parent ab979c0c
......@@ -12,8 +12,11 @@ import Alamofire
class YHBaseViewModel {
// 上传方法
func uploadImage(_ image: UIImage, callBackBlock:@escaping (_ success: String?, _ error:YHErrorModel?)->()) {
let size = imageSize(image: image)
YHHUD.flash(message: "\(size/1000)KB")
#if DEBUG
let size = image.imageSize()
YHHUD.flash(message: "\(Float(size/1024/1024))M")
#endif
let strUrl = YHBaseUrlManager.shared.curOssURL() + YHAllApiName.OSS.uploadApi
let boundary = UUID().uuidString
let headers: HTTPHeaders = [
......@@ -68,16 +71,4 @@ class YHBaseViewModel {
callBackBlock(nil,err)
}
}
func imageSize(image: UIImage) -> Int {
// 如果是JPEG格式,可以调整压缩质量来影响文件大小
if let jpegData = image.jpegData(compressionQuality: 1.0) {
return jpegData.count
}
// 如果是PNG格式
if let pngData = image.pngData() {
return pngData.count
}
return 0 // 如果转换失败,返回0
}
}
......@@ -228,7 +228,6 @@ extension YHImagePickerView: UIGestureRecognizerDelegate {
extension YHImagePickerView: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
// uploadImage(image: image)
if let block = backImage {
block(image)
self.dismiss()
......@@ -244,74 +243,88 @@ extension YHImagePickerView: UINavigationControllerDelegate, UIImagePickerContro
picker.dismiss(animated: true, completion: nil)
}
//原生上传
func uploadImage(imageURL: URL) {
let url = URL(string: "https://test-comserver.galaxy-immi.com/oss/upload/storage")! // 设置上传接口地址
var request = URLRequest(url: url)
request.httpMethod = "POST"
do {
let imageData = try Data(contentsOf: imageURL) // 读取要上传的图片数据
let boundary = UUID().uuidString // 生成随机边界字符串
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.addValue("4001001", forHTTPHeaderField: "businessCode")
var body = ""
body += "--\(boundary)\r\n"
body += "Content-Disposition: form-data; name=\"file\"; filename=\"image.jpg\"\r\n" // 根据需求修改文件名称
body += "Content-Type: image/jpeg\r\n\r\n" // 根据实际情况指定正确的MIME类型
if let data = imageData.base64EncodedString(options: .lineLength76Characters).addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics) {
let encodedBody = body + "\r\n" + data + "\r\n" + "--" + boundary + "--"
guard let postData = encodedBody.data(using: String.Encoding.utf8) else { return }
request.httpBody = postData
// //原生上传
// func uploadImage(imageURL: URL) {
// let url = URL(string: "https://test-comserver.galaxy-immi.com/oss/upload/storage")! // 设置上传接口地址
//
// var request = URLRequest(url: url)
// request.httpMethod = "POST"
//
// do {
// let imageData = try Data(contentsOf: imageURL) // 读取要上传的图片数据
//
// let boundary = UUID().uuidString // 生成随机边界字符串
// request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
// request.addValue("4001001", forHTTPHeaderField: "businessCode")
//
// var body = ""
// body += "--\(boundary)\r\n"
// body += "Content-Disposition: form-data; name=\"file\"; filename=\"image.jpg\"\r\n" // 根据需求修改文件名称
// body += "Content-Type: image/jpeg\r\n\r\n" // 根据实际情况指定正确的MIME类型
// if let data = imageData.base64EncodedString(options: .lineLength76Characters).addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics) {
// let encodedBody = body + "\r\n" + data + "\r\n" + "--" + boundary + "--"
// guard let postData = encodedBody.data(using: String.Encoding.utf8) else { return }
//
// request.httpBody = postData
//
// let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// if let error = error {
// print("Error: \(error)")
// } else if let httpResponse = response as? HTTPURLResponse {
// switch httpResponse.statusCode {
// case 200..<300:
// if let data = data {
// let string = String(data: data, encoding: .utf8)
//
// }
// print("Upload successful.")
// default:
// print("Failed to upload the image with status code: \(httpResponse.statusCode)")
// }
// }
// }
// task.resume()
// }
// } catch {
// print("Error reading image file: \(error)")
// }
// }
// // Alamofire上传
// func uploadImage(image: UIImage) {
// // 获取图片的二进制数据
// guard let imageData = image.jpegData(compressionQuality: 1) else { return }
// let boundary = UUID().uuidString
// let headers: HTTPHeaders = [
// "Content-type": "multipart/form-data; boundary=\(boundary)",
// "businessCode": "4001001"
// ]
// // 创建MultipartFormData对象
// let multipartFormData = MultipartFormData()
//
// // 将图片添加到multipartFormData中
// multipartFormData.append(imageData, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
//
// // 发送POST请求
// let uploadRequest = AF.upload(multipartFormData: multipartFormData, to: "https://test-comserver.galaxy-immi.com/oss/upload/storage", headers: headers)
//
// uploadRequest.responseString(completionHandler: { string in
// printLog("\n网络请求已返回 string=\(string)")
// })
// }
}
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
print("Error: \(error)")
} else if let httpResponse = response as? HTTPURLResponse {
switch httpResponse.statusCode {
case 200..<300:
if let data = data {
let string = String(data: data, encoding: .utf8)
extension YHImagePickerView {
func checkImage( _image : UIImage) -> UIImage? {
let size = _image.imageSize()
if size > 4 * 1024 * 1024 {
// let data = _image.compressOriginalImage(toKb: 4 * 1024)
if let data = _image.compressOriginalImage(4 * 1024 * 1024), let ttt = UIImage(data: data) {
return ttt
}
print("Upload successful.")
default:
print("Failed to upload the image with status code: \(httpResponse.statusCode)")
}
}
}
task.resume()
}
} catch {
print("Error reading image file: \(error)")
}
}
// Alamofire上传
func uploadImage(image: UIImage) {
// 获取图片的二进制数据
guard let imageData = image.jpegData(compressionQuality: 1) else { return }
let boundary = UUID().uuidString
let headers: HTTPHeaders = [
"Content-type": "multipart/form-data; boundary=\(boundary)",
"businessCode": "4001001"
]
// 创建MultipartFormData对象
let multipartFormData = MultipartFormData()
// 将图片添加到multipartFormData中
multipartFormData.append(imageData, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
// 发送POST请求
let uploadRequest = AF.upload(multipartFormData: multipartFormData, to: "https://test-comserver.galaxy-immi.com/oss/upload/storage", headers: headers)
uploadRequest.responseString(completionHandler: { string in
printLog("\n网络请求已返回 string=\(string)")
})
return _image
}
}
......@@ -142,4 +142,117 @@ extension UIImage {
UIGraphicsEndImageContext()
return newImage
}
/// 直接使用data进行压缩
/// - Parameter toKb: 指定data最大的体积
/// - Returns: data
func compressOriginalImage(_ toKb: Int = 4 * 1024 * 1024) -> Data?{
var compression: CGFloat = 1
let minCompression: CGFloat = 0.1
var imageData = self.jpegData(compressionQuality: compression)
if imageData!.count < toKb {
return imageData
}
while imageData!.count > toKb, compression > minCompression {
compression -= 0.1
imageData = self.jpegData(compressionQuality: compression)
}
if imageData!.count > toKb {
return nil
}
return imageData
}
func imageSize() -> Int {
// 如果是JPEG格式,可以调整压缩质量来影响文件大小
if let jpegData = self.jpegData(compressionQuality: 1.0) {
return jpegData.count
}
// 如果是PNG格式
if let pngData = self.pngData() {
return pngData.count
}
return 0 // 如果转换失败,返回0
}
}
enum ImageCopmpressSize {
//压缩到100KB(1024*100字节)以内
case one
//压缩到200KB(1024*100字节)以内
case two
//压缩到300KB(1024*100字节)以内
case three
//压缩到4M(1024*1024*4)
case four
}
extension UIImage {
//我们的项目就定不大于200KB
// func compressImage()->Data{
// compressImage(size: .two)
// }
func compressImage(size:ImageCopmpressSize) -> Data{
switch size {
case .one:
return compressImage(maxLength: 1024*100)
case .two:
return compressImage(maxLength: 1024*200)
case .three:
return compressImage(maxLength: 1024*300)
case .four:
return compressImage(maxLength: 3 * 1024 * 1024)
}
}
// 图片压缩 byte
func compressImage(maxLength: Int) -> Data {
// let tempMaxLength: Int = maxLength / 8
let tempMaxLength: Int = maxLength
var compression: CGFloat = 1
guard var data = self.jpegData(compressionQuality: compression), data.count > tempMaxLength else { return self.jpegData(compressionQuality: compression)! }
// 压缩大小
var max: CGFloat = 1
var min: CGFloat = 0
for _ in 0..<6 {
compression = (max + min) / 2
data = self.jpegData(compressionQuality: compression)!
if CGFloat(data.count) < CGFloat(tempMaxLength) * 0.9 {
min = compression
} else if data.count > tempMaxLength {
max = compression
} else {
break
}
}
var resultImage: UIImage = UIImage(data: data)!
if data.count < tempMaxLength { return data }
// 压缩大小
var lastDataLength: Int = 0
while data.count > tempMaxLength && data.count != lastDataLength {
lastDataLength = data.count
let ratio: CGFloat = CGFloat(tempMaxLength) / CGFloat(data.count)
print("Ratio =", ratio)
let size: CGSize = CGSize(width: Int(resultImage.size.width * sqrt(ratio)),
height: Int(resultImage.size.height * sqrt(ratio)))
UIGraphicsBeginImageContext(size)
resultImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
resultImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
data = resultImage.jpegData(compressionQuality: compression)!
}
return data
}
}
......@@ -167,7 +167,16 @@ class YHNetRequest: NSObject {
YHHUD.flash(message: "网络异常")
return httpRequest
}
guard let imageData = image.jpegData(compressionQuality: 1) else { return httpRequest }
// guard let imageData = image.jpegData(compressionQuality: 1) else { return httpRequest }
guard let imageData = image.compressOriginalImage(4 * 1024 * 1024) else { return httpRequest }
let tttt = Double(imageData.count)/1024.0/1024.0
#if DEBUG
let ssss = String(format: "%.2f", tttt)
YHHUD.flash(message: "实际大小:" + ssss + " M")
#endif
let multipartFormData = MultipartFormData()
// 将图片添加到multipartFormData中
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment