Company logo
  • Empleos
  • Bootcamp
  • Acerca de nosotros
  • Para profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
    • Bootcamp
  • Para empresas
    • Inicio
    • Nuestro proceso
    • Planes
    • Pruebas
    • Nómina
    • Blog
    • Calculadora

0

232
Vistas
Why does the .png file I export from View(SwiftUI) not contain the ImageView?

While using Image("my file url") in my CoverImageView, I can export a .png file that contains the Image("my file url") view successfully. However, this doesn't happen when I use Image(nsImage: NSImage(data: imageData.imagedata)), the imageData.imagedata is a Data type that will be gotten when I tap a button and get it from a selected picture (I will show it later in my code).

When I select an image, it can be seen in my app's View:

Image contain Mac View

However, when I save this View(CoverImageView) to a .png file it only contain the blue view, the Mac view is gone!!!!

Here is the CoverImageView from which I want to create a .png file

struct CoverImageView: View {
    
    @EnvironmentObject var imageData: ImageData
    
    var body: some View {
        ZStack {
            Rectangle()
                .frame(width: 512, height: 600)
                .foregroundColor(.blue)
            
            Image(nsImage: (NSImage(data: imageData.imagedata) ?? NSImage(byReferencing: URL(fileURLWithPath: ""))))
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 512, height: 512)
        }
    }
}

This is the main view PhotoTestView

struct PhotoTestView: View {
    
    @State private var imageUrl: URL = URL(fileURLWithPath: "")
    
    @EnvironmentObject var imageData: ImageData
    
    var body: some View {
        VStack {
            CoverImageView()
            
            Divider()
                .frame(width: 1024)
            
            HStack {
                Button(action: {
                    if let openURL = ImageProcess().showOpenPanel() {
                        imageUrl = openURL
                        if let codedImages = try? Data(contentsOf: openURL) {
                            imageData.imagedata = codedImages
                        }
                    }
                }, label: {
                    Image(systemName: "doc.badge.plus")
                })
                
                Button(action: {
                    ImageProcess().saveImage()
                }, label: {
                    Image(systemName: "square.and.arrow.down")
                })
            }.padding()
        }
    }
}

The View extension

extension View {
    func imageRepresentation(rect: CGRect) -> NSBitmapImageRep? {
        let hosting = NSHostingView(rootView: self)
        hosting.setFrameSize(rect.size)
        hosting.setBoundsSize(rect.size)
        hosting.layout()
        hosting.layerContentsRedrawPolicy = .onSetNeedsDisplay
        hosting.setNeedsDisplay(rect)
        if let imageRepresentation = hosting.bitmapImageRepForCachingDisplay(in: rect) {
            hosting.cacheDisplay(in: rect, to: imageRepresentation)
            return imageRepresentation
        }
        return nil
    }
    
    func asImage(rect: CGRect) -> NSImage? {
        if let cgImage = imageRepresentation(rect: rect)?.cgImage {
            return NSImage(cgImage: cgImage, size: rect.size)
        }
        return nil
    }
    
    func asPngData(rect: CGRect) -> Data? {
        return imageRepresentation(rect: rect)?.representation(using: .png, properties: [:])
    }
}

.png File Reader and Save

struct ImageProcess {
    func showOpenPanel() -> URL? {
        let openPanel = NSOpenPanel()
        openPanel.allowedContentTypes = [.image]
        openPanel.allowsMultipleSelection = false
        openPanel.canChooseDirectories = false
        openPanel.canChooseFiles = true
        let response = openPanel.runModal()
        return response == .OK ? openPanel.url : nil
    }
    
    
    func saveURL() -> URL? {
        let savePanel = NSSavePanel()
        savePanel.allowedContentTypes = [.png]
        savePanel.canCreateDirectories = true
        savePanel.isExtensionHidden = false
        savePanel.allowsOtherFileTypes = false
        savePanel.title = "Save your image"
        savePanel.message = "Choose a folder and a name to store your image."
        savePanel.nameFieldLabel = "File name:"
        let response = savePanel.runModal()
        return response == .OK ? savePanel.url : nil
    }
    
    func saveImage() {
        let view = CoverImageView().environmentObject(ImageData())
        let imageData = view.asPngData(rect: CGRect.init(x: 0, y: 0, width: 1024, height: 768))
        if let url = saveURL() {
            try? imageData!.write(to: url)
        }
         // print(imageData)
    }
}

Full Code can be seen in Github

Please Help Me....

10 months ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar empleo Planes Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2023 PeakU Inc. All Rights Reserved.