VPCamera3/tdvideo/tdvideo/PlayContoller7.swift
2024-03-05 11:44:34 +08:00

314 lines
11 KiB
Swift

//
// PlayContoller7.swift
// tdvideo
//
// Created by mac on 2024/2/10.
//
import UIKit
import AVFoundation
import MobileCoreServices
import CoreImage
import ImageIO
import Photos
class PlayContoller7: UIViewController {
var startRecordingButton:UIButton?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.brown
setupUI()
// bbb()
// aaa()
}
private func setupUI() {
startRecordingButton = UIButton(type: .system)
startRecordingButton?.setTitle("开始合成空间图片", for: .normal)
startRecordingButton?.setTitleColor(UIColor.white, for: UIControl.State.normal)
startRecordingButton?.addTarget(self, action: #selector(toggleRecording(_:)), for: .touchUpInside)
startRecordingButton?.frame = CGRect(x: 0, y: view.frame.size.height - 250, width: view.frame.size.width, height: 50)
view.addSubview(startRecordingButton!)
}
@objc private func toggleRecording(_ sender: UIButton) {
bbb()
}
func bbb(){
let img1:UIImage = UIImage(named: "a.HEIC")!
let img2:UIImage = UIImage(named: "b.HEIC")!
let imageSize1 = CGRect(x: 0, y: 0, width: img1.cgImage!.width, height: img1.cgImage!.height)
let imageSize2 = CGRect(x: 0, y: 0, width: img2.cgImage!.width, height: img2.cgImage!.height)
let url = URL.documentsDirectory.appending(path:"aaa12.HEIC")
let destination = CGImageDestinationCreateWithURL(url as CFURL, UTType.heic.identifier as CFString, 2, nil)!
// --- 16.0 ---
/*
[ColorModel: RGB, ProfileName: sRGB IEC61966-2.1, Depth: 8, {TIFF}: {
Orientation = 1;
TileLength = 512;
TileWidth = 512;
}, {HEIF}: {
CameraExtrinsics = {
CoordinateSystemID = 0;
Position = (
"-0.019238",
0,
0
);
Rotation = (
1,
0,
0,
0,
1,
0,
0,
0,
1
);
};
}, PixelWidth: 4032, PixelHeight: 3024, Orientation: 1]
*/
let properties1 = [
kCGImagePropertyGroups: [
kCGImagePropertyGroupIndex: 0,
kCGImagePropertyGroupType: kCGImagePropertyGroupTypeStereoPair,
kCGImagePropertyGroupImageIndexLeft: 0,
kCGImagePropertyGroupImageIndexRight: 1,
],
kCGImagePropertyHEIFDictionary: [
kIIOMetadata_CameraExtrinsicsKey: [
kIIOCameraExtrinsics_CoordinateSystemID: 0,
kIIOCameraExtrinsics_Position: [
0,
0,
0
],
kIIOCameraExtrinsics_Rotation: [
1, 0, 0,
0, 1, 0,
0, 0, 1
]
]
]
]
//
let properties2 = [
kCGImagePropertyGroups: [
kCGImagePropertyGroupIndex: 0,
kCGImagePropertyGroupType: kCGImagePropertyGroupTypeStereoPair,
kCGImagePropertyGroupImageIndexLeft: 0,
kCGImagePropertyGroupImageIndexRight: 1,
],
kCGImagePropertyHEIFDictionary: [
kIIOMetadata_CameraExtrinsicsKey: [
kIIOCameraExtrinsics_CoordinateSystemID: 0,
kIIOCameraExtrinsics_Position: [
-0.019238,
0,
0
],
kIIOCameraExtrinsics_Rotation: [
1, 0, 0,
0, 1, 0,
0, 0, 1
]
]
]
]
let leftImg = fixOrientation(img1)
let rightImg = fixOrientation(img2)
CGImageDestinationAddImage(destination, leftImg.cgImage!, properties1 as CFDictionary)
CGImageDestinationAddImage(destination, rightImg.cgImage!, properties2 as CFDictionary)
CGImageDestinationFinalize(destination)
let image = UIImage(contentsOfFile: url.path())
let source = CGImageSourceCreateWithURL(url as CFURL, nil)!
guard let properties22 = CGImageSourceCopyPropertiesAtIndex(source, 1, nil) as? [CFString: Any] else {
return
}
print(properties22)
savePhoto(url)
}
func aaa() {
let imageSize = CGRect(x: 0, y: 0, width: 3072, height: 3072)
let leftImage = CIContext().createCGImage(.red, from: imageSize)!
let rightImage = CIContext().createCGImage(.blue, from: imageSize)!
let url = URL.documentsDirectory.appendingPathComponent("33122.HEIC")
print("URL: \(url)")
let destination = CGImageDestinationCreateWithURL(url as CFURL, UTType.heic.identifier as CFString, 2, nil)!
let properties1 = [
kCGImagePropertyGroups: [
kCGImagePropertyGroupIndex: 0,
kCGImagePropertyGroupType: kCGImagePropertyGroupTypeStereoPair,
kCGImagePropertyGroupImageIndexLeft: 0,
kCGImagePropertyGroupImageIndexRight: 1
],
kCGImagePropertyHEIFDictionary: [
kIIOMetadata_CameraExtrinsicsKey: [
kIIOCameraExtrinsics_CoordinateSystemID: 0,
kIIOCameraExtrinsics_Position: [
0,
0,
0
],
kIIOCameraExtrinsics_Rotation: [
1, 0, 0,
0, 1, 0,
0, 0, 1
]
]
]
]
let properties2 = [
kCGImagePropertyGroups: [
kCGImagePropertyGroupIndex: 0,
kCGImagePropertyGroupType: kCGImagePropertyGroupTypeStereoPair,
kCGImagePropertyGroupImageIndexLeft: 0,
kCGImagePropertyGroupImageIndexRight: 1
],
kCGImagePropertyHEIFDictionary: [
kIIOMetadata_CameraExtrinsicsKey: [
kIIOCameraExtrinsics_CoordinateSystemID: 0,
kIIOCameraExtrinsics_Position: [
-0.019238,
0,
0
],
kIIOCameraExtrinsics_Rotation: [
1, 0, 0,
0, 1, 0,
0, 0, 1
]
]
]
]
//
CGImageDestinationAddImage(destination, leftImage, properties1 as CFDictionary)
CGImageDestinationAddImage(destination, rightImage, properties2 as CFDictionary)
CGImageDestinationFinalize(destination)
// imageSource nil
guard let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil) else {
print("Failed to create CGImageSource")
return
}
// 使 properties
if let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any] {
print(properties)
} else {
print("Failed to retrieve properties")
}
let image = UIImage(contentsOfFile: url.path)
savePhoto(url)
}
func savePhoto(_ fileURL: URL) {
// PHAssetCreationRequest
PHPhotoLibrary.shared().performChanges({
let creationRequest = PHAssetCreationRequest.forAsset()
creationRequest.addResource(with: .photoProxy, fileURL: fileURL, options: nil)
}) { success, error in
if let error = error {
print("Error saving photo to library: \(error.localizedDescription)")
} else {
print("Photo saved to library successfully.")
}
}
}
//
func fixOrientation(_ image: UIImage) -> UIImage {
// No-op if the orientation is already correct
guard image.imageOrientation != .up else { return image }
// We need to calculate the proper transformation to make the image upright.
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
var transform = CGAffineTransform.identity
switch image.imageOrientation {
case .down, .downMirrored:
transform = transform.translatedBy(x: image.size.width, y: image.size.height)
transform = transform.rotated(by: .pi)
case .left, .leftMirrored:
transform = transform.translatedBy(x: image.size.width, y: 0)
transform = transform.rotated(by: .pi / 2)
case .right, .rightMirrored:
transform = transform.translatedBy(x: 0, y: image.size.height)
transform = transform.rotated(by: -.pi / 2)
default:
break
}
switch image.imageOrientation {
case .upMirrored, .downMirrored:
transform = transform.translatedBy(x: image.size.width, y: 0)
transform = transform.scaledBy(x: -1, y: 1)
case .leftMirrored, .rightMirrored:
transform = transform.translatedBy(x: image.size.height, y: 0)
transform = transform.scaledBy(x: -1, y: 1)
default:
break
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
guard let cgImage = image.cgImage,
let colorSpace = cgImage.colorSpace,
let context = CGContext(data: nil,
width: Int(image.size.width),
height: Int(image.size.height),
bitsPerComponent: cgImage.bitsPerComponent,
bytesPerRow: 0,
space: colorSpace,
bitmapInfo: cgImage.bitmapInfo.rawValue)
else {
return image
}
context.concatenate(transform)
switch image.imageOrientation {
case .left, .leftMirrored, .right, .rightMirrored:
// Grr...
context.draw(cgImage, in: CGRect(x: 0, y: 0, width: image.size.height, height: image.size.width))
default:
context.draw(cgImage, in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
}
// And now we just create a new UIImage from the drawing context
guard let cgImageFixed = context.makeImage() else { return image }
let fixedImage = UIImage(cgImage: cgImageFixed)
return fixedImage
}
}