我正在使用相机应用程序实现缩放功能AVFoundation.我正在缩放我的预览视图,如下所示:
[videoPreviewView setTransform:CGAffineTransformMakeScale(cameraZoom, cameraZoom)];
Run Code Online (Sandbox Code Playgroud)
现在,在拍完照片之后,我想在将照片cameraZoom保存到相机胶卷之前使用该值进行缩放/裁剪.我该怎么做才能做到最好?
编辑:使用贾斯汀的答案:
CGRect imageRect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], imageRect);
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef), CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), CGImageGetColorSpace(imageRef), CGImageGetBitmapInfo(imageRef));
CGContextScaleCTM(bitmapContext, scale, scale);
CGContextDrawImage(bitmapContext, imageRect, imageRef);
CGImageRef zoomedCGImage = CGBitmapContextCreateImage(bitmapContext);
UIImage* zoomedImage = [[UIImage alloc] initWithCGImage:imageRef];
Run Code Online (Sandbox Code Playgroud)
它正在缩放图像,但它没有占据它的中心,而是似乎占据了右上角区域.(我不是积极的).
另一个问题(我应该在OP中更清楚)是图像保持相同的分辨率,但我宁愿将其裁剪掉.
好.我会寻找答案,也可以自己找.我有回答自己问题的恶习.
无论如何,我有一个应用程序,旨在相当容易"皮肤化".作为其中的一部分,我在静态类中隔离了特定于变体的方法.这些静态方法提供特定于变体的主应用程序图像,颜色和设置..h文件对于主应用程序是通用的,但.m文件特定于变体.
我喜欢使用能够发送图像作为背景(自动平铺),因此接口文件指定例程返回UIColor,如下所示:
+ (UIColor *)meetingDetailBackgroundColor;
Run Code Online (Sandbox Code Playgroud)
但是实现文件加载了一个图像文件,并返回它,如下所示:
+ (UIColor *)meetingDetailBackgroundColor
{
return [UIColor colorWithPatternImage:[UIImage imageNamed:@"DarkWeave.png"]];
}
Run Code Online (Sandbox Code Playgroud)
在上下文中使用哪个,如下所示:
[[self view] setBackgroundColor:[BMLTVariantDefs meetingDetailBackgroundColor]];
Run Code Online (Sandbox Code Playgroud)
注意:编辑恢复我使用的原始简单代码.
现在,问题是我有时(并不总是)得到泄漏.
我确定我在这里做些什么.我只是不确定是什么.
有任何想法吗?
BTW:这是一个在IOS 5上运行的ARC程序.我是ARC的新手,但我认为这是我应该这样做的方式.
我试图从iOS中的图像资源中读取ARGB像素.为此,我需要一个CGImageRef我可以使用它来获得它CGDataProvider.我的问题是,如果我创建一个CGImageRef使用:
CGImageRef cg = [[UIImage imageNamed: Path] CGImage];
Run Code Online (Sandbox Code Playgroud)
我最终还需要打电话CGImageRelease(cg)吗?如果我不打电话CGImageRelease,我会有内存泄漏吗?
我遇到的另一个问题是第二次读同一个文件会返回一个空图像,我怀疑这可能是因为我CGImageRelease第一次没有打电话.
我开发和iOS应用程序为iPad和我为了获得来自Facebook,Twitter的,闪烁的图像,并在相机胶卷使用Grabkit.要从最后一个获取图像,我需要将CGImage转换为UIImage,但我遇到了麻烦.就像我没有得到任何图像,因为当我稍后使用UIImage时,应用程序崩溃了这个日志:
*** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [nan 653]'
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码转换CGImage:
UIImage* image = [UIImage imageWithCGImage:imgRef];
Run Code Online (Sandbox Code Playgroud)
所以这段代码不会崩溃,但是当我使用创建的图像时,它确实会崩溃.怎么了?代码错了吗?
在Swift中获取某个像素(由CGPoint指定)的像素颜色时,我遇到了很多困难。到目前为止,这是我的代码:
@IBOutlet weak var graphImage: UIImageView!
var image : UIImage?
override func viewDidLoad() {
super.viewDidLoad()
}
func getPixelColor(pos: CGPoint) -> UIColor {
var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.graphImage.image!.CGImage))
var data : UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
var pixelInfo : Int = ((Int(graphImage.image!.size.width) * Int(pos.y) + Int(pos.x)*4))
let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
let g = CGFloat(data[pixelInfo]+1) / CGFloat(255.0)
let b = CGFloat(data[pixelInfo]+2) / CGFloat(255.0)
let a = CGFloat(data[pixelInfo]+3) / CGFloat(255.0)
return UIColor(red: r, green: g, blue: b, alpha: a)
}
@IBAction func playTapped(sender: AnyObject) …Run Code Online (Sandbox Code Playgroud) 在Swift游乐场中,我正在加载JPEG,将其转换为UIImage并将其过滤为单色.然后我将生成的过滤图像转换为UIImage.
输入和过滤的图像正确显示.
然后我将两个图像转换为CGImage类型.这适用于输入图像,但过滤后的图像从转换中返回nil:
// Get an input image
let imageFilename = "yosemite.jpg"
let inputImage = UIImage(named: imageFilename )
let inputCIImage = CIImage(image:inputImage!)
// Filter the input image - make it monochrome
let filter = CIFilter(name: "CIPhotoEffectMono")
filter!.setDefaults()
filter!.setValue(inputCIImage, forKey: kCIInputImageKey)
let CIout = filter!.outputImage
let filteredImage = UIImage(CIImage: CIout!)
// Convert the input image to a CGImage
let inputCGImageRef = inputImage!.CGImage // Result: <CGImage 0x7fdd095023d0>
// THE LINE ABOVE WORKS
// Try to convert the filtered image to a CGImage …Run Code Online (Sandbox Code Playgroud) 如何为图片添加多种效果?我有以下代码为照片添加效果:
func applyEffects(name: String, n: Float) {
filter.setValue(self.cImage, forKeyPath: kCIInputImageKey)
filter.setValue(n, forKeyPath: name)
let result = filter.value(forKey: kCIOutputImageKey) as! CIImage
let cgImage = CIContext.init(options: nil).createCGImage(result, from: result.extent)
self.customImage = UIImage.init(cgImage: cgImage!)
}
func brightness(n: Float) {
self.applyEffects(name: kCIInputBrightnessKey, n: n)
}
func contrast(n: Float) {
self.applyEffects(name: kCIInputContrastKey, n: n)
}
func saturation(n: Float) {
self.applyEffects(name: kCIInputSaturationKey, n: n)
}
Run Code Online (Sandbox Code Playgroud)
但是当我想要应用第二个效果时,第一个效果消失了.如何将两个或多个效果叠加在一起?
我有一个CGImage,它由CVPixelbuffer(ARGB)构成.我想将CGImage转换为MTLTexture.我用:
let texture: MTLTexture = try m_textureLoader.newTexture(with: cgImage, options: [MTKTextureLoaderOptionSRGB : NSNumber(value: true)] )
Run Code Online (Sandbox Code Playgroud)
后来我想在具有3个通道的MPSImage中使用纹理:
let sid = MPSImageDescriptor(channelFormat: MPSImageFeatureChannelFormat.float16, width: 40, height: 40, featureChannels: 3)
preImage = MPSTemporaryImage(commandBuffer: commandBuffer, imageDescriptor: sid)
lanczos.encode(commandBuffer: commandBuffer, sourceTexture: texture!, destinationTexture: preImage.texture)
scale.encode (commandBuffer: commandBuffer, sourceImage: preImage, destinationImage: srcImage)
Run Code Online (Sandbox Code Playgroud)
现在我的问题:textureLoader.newTexture(...)如何将四个ARGB通道映射到MPSImageDescriptor中指定的3个通道?如何确保使用RGB组件而不是ARG?有没有办法指定频道映射?
谢谢,克里斯
我需要保存金属纹理并将其加载到文件中。下面的示例代码如下。我注意到RGB值在保存并重新加载时正在发生变化。
metal texture pixel: RGBA: 42,79,12,95
after save and reload: 66,88,37,95
Run Code Online (Sandbox Code Playgroud)
那变得越来越明亮。下次保存时,它开始变暗。我在使用iPad Pro,所以想知道这是否是色域问题。关于为什么会发生这种情况以及如何解决的任何指示?
在下面的行中cgImage,我可以检查原始像素数据,看看RGBA是66,88,37。
// saving...
let ciCtx = CIContext()
let ciImage = CIImage(mtlTexture: metalTexture, options: [:])
// [ … transfrom to flip y-coordinate …]
let colorSpace = CGColorSpaceCreateDeviceRGB()
let cgImage = ciCtx.createCGImage(ciImage, from: fullRect, format: kCIFormatRGBA8, colorSpace: colorSpace)!
let imageDest = CGImageDestinationCreateWithData(mData, kUTTypePNG, 1, nil)!
CGImageDestinationAddImage(imageDest, cgImage, nil)
CGImageDestinationFinalize(imageDest)
// loading...
let src = CGImageSourceCreateWithData(imgData, nil)
let img = CGImageSourceCreateImageAtIndex(src, 0, nil)
let loader = MTKTextureLoader(device: self.metalDevice) …Run Code Online (Sandbox Code Playgroud) 我试图设置UIImage的CGImage作为layer的内容,然后添加layer到view的layer。
黄色视图的中心应该是五颗星。那就是我想要的。
不过好像星星的中心与对齐origin的view。我该怎么做才能纠正它?
func putOnStars() {
let rect = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
rect.backgroundColor = .yellow
view.addSubview(rect)
let baseLayer = CALayer()
baseLayer.contents = UIImage(named: "stars")?.cgImage
baseLayer.contentsGravity = kCAGravityCenter
rect.layer.addSublayer(baseLayer)
}
Run Code Online (Sandbox Code Playgroud)
cgimage ×10
ios ×7
swift ×5
uiimage ×5
metal ×2
objective-c ×2
calayer ×1
ciimage ×1
color-space ×1
crash ×1
ios11 ×1
iphone ×1
memory-leaks ×1
metalkit ×1
uicolor ×1