#ios #swift #swiftui
Вопрос:
Я пытаюсь конвертировать изображения, выбранные из фотопленки пользователей, в JPEG-данные для загрузки на сервер.
Я делаю следующее, чтобы скрыть данные:
let imageData: Data? = uiImage.jpegData(compressionQuality: 0)
Это отлично работает при конвертации скриншотов. Но когда я пытаюсь преобразовать изображение, сделанное с помощью камеры устройства. Это дает мне следующую ошибку:
[Metal] 9072 by 12198 iosurface is too large for GPU
Он по-прежнему преобразует его в данные, но затем данные просто содержат пустое изображение. Не выбранное изображение.
Я в недоумении, куда идти с этим, я попытался преобразовать HEIC, предварительно загруженный в комплект устройства, и он отлично работает. Но при использовании тех, которые выбраны из фотопленки, я получаю указанную ошибку.
Любая помощь будет признательна. Это пример кода, который я использую для проверки проблемы. (Я знаю, что в такой форме это совершенно бессмысленно)
func convertImage(image: Image?) -> Image? { //1
let key = "(String.random(length: 15))"
let uiImage: UIImage = image.asUIImage()
let imageData: Data? = uiImage.jpegData(compressionQuality: 0)
guard let imageData = imageData else { return nil }
let encodedImage = imageData.base64EncodedString()
let fileManager = FileManager.default
let documentsPath = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first
let localImageUrl = (documentsPath?.appendingPathComponent(key))
guard let localImageUrl = localImageUrl else {
return nil
}
try! encodedImage.write(to: localImageUrl, atomically: true, encoding: String.Encoding.utf8)
guard let fileContents = try? String(contentsOf: localImageUrl) else {
return nil
}
let dataDecoded : Data = Data(base64Encoded: fileContents, options: .ignoreUnknownCharacters)!
let decodedimage = UIImage(data: dataDecoded)
return (Image(uiImage: decodedimage ?? UIImage(named: "placeholder")!))
}
import SwiftUI
struct UploadTesting: View {
@ObservedObject var crViewModel = ChatroomsViewModel()
@State var showImagePicker = false
@State var selectedImage: Image? = nil
@State var convertedImage: Image?
var body: some View {
VStack {
Button("Select") {
showImagePicker.toggle()
}
selectedImage?.resizable().scaledToFit().frame(width: 300, height: 300)
Button("Convert") {
convertedImage = crViewModel.convertImage(image: selectedImage)
}
convertedImage?.resizable().scaledToFit().frame(width: 200, height: 200).background(Color.red)
}
.sheet(isPresented: $showImagePicker) {
ImagePicker(image: $selectedImage)
}
}
}
Видео выпуска: https://streamable.com/h0uqly