Быстрое преобразование UIImage в jpegData — [Металл] 9072 на 12198 iosurface слишком велик для графического процессора

#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