在我的应用程序中,我需要调整大小并裁剪一些本地和在线存储的图像.我正在使用Trevor Harmon的教程实现UIImage+Resize
.
在我的iPhone 4(iOS 4.3.1)上一切正常,我没有问题.但是在我的iPhone 3G(iOS 3.2)上,调整大小和裁剪方法对任何图片都不起作用(本地存储的是PNG).这是控制台输出:
Tue Apr 5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr 5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr 5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr 5 …
Run Code Online (Sandbox Code Playgroud) 在iOS 5.x中是否有一种简单的方法(或内置库)去饱和UIImage?这是我目前的做法:
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0, self.bounds.size.height); // flip image right side up
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, rect, self.image.CGImage);
CGContextSetBlendMode(context, kCGBlendModeSaturation);
CGContextClipToMask(context, self.bounds, image.CGImage); // restricts drawing to within alpha channel
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, desaturation);
CGContextFillRect(context, rect);
CGContextRestoreGState(context); // restore state to reset blend mode
Run Code Online (Sandbox Code Playgroud)
这似乎比我预期的要复杂一些.有比这更简单的方法吗?
我在想Core Image,但我似乎无法找到一个关于如何使用它去饱和图像的具体例子.
我一直在寻找一个答案,有些人似乎可能是我需要的,但我不确定.我发现了这个问题#9152851和这个问题#2617625并在一堆链接上探讨了但我需要一些方向.
本质上,我正在调度异步调用以使用OpenCV处理图像.您可以通过此处的代码看到我将其转换为NSData*,然后再将其发送回我的代理人.
NSData *proccessedData = [NSData dataWithBytes:processedImage.data length:(processedImage.rows * processedImage.cols)];
[self.delegate onProcessedBitmapReady:proccessedData withFocusQuality:focusQuality];
Run Code Online (Sandbox Code Playgroud)
但是当我回到我的委托时,我的processedBitmap是类型(OS_dispatch_data*)并包含一个字节值.所以,当我尝试设置UIImage时,它被设置为null.
- (void)onProcessedBitmapReady:(NSData *)processedBitmap withFocusQuality:(double)focusQuality
{
//Use comverted image from self.captureCommand onComplete
UIImage *image = [[UIImage alloc] initWithData:processedBitmap];
[self saveImage:image];
}
Run Code Online (Sandbox Code Playgroud)
以下是值的屏幕截图:
那么,我如何将这些字节(或者它们是什么)转换成我可以填充到UIImage中的东西呢?
预先感谢您的帮助.
-------------------------------------------------- ----- 添加新图像 -----------------------------------------
这个新图片有帮助吗?
谢谢.
我已经彻底阅读了最新的iOS8相框工作,我正在尝试从用户库中获取一些资产来显示.我让用户一次编辑4张图片.但正因为如此,我需要压缩图像,否则应用程序将崩溃.
我使用PHImageManager通过以下代码加载图像:
func processImages()
{
println("Processing")
_selectediImages = Array()
_cacheImageComplete = 0
for asset in _selectedAssets
{
var options:PHImageRequestOptions = PHImageRequestOptions()
options.version = PHImageRequestOptionsVersion.Unadjusted
options.synchronous = true
var minRatio:CGFloat = 1
if(CGFloat(asset.pixelWidth) > UIScreen.mainScreen().bounds.width || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height)
{
minRatio = min(UIScreen.mainScreen().bounds.width/(CGFloat(asset.pixelWidth)), (UIScreen.mainScreen().bounds.height/CGFloat(asset.pixelHeight)))
}
var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio))
println("Target size is \(size)")
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:size, contentMode: .AspectFill, options: options)
{
uiimageResult, info in
var image = iImage(uiimage: uiimageResult)
println("Result Size Is \(uiimageResult.size)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在计算目标大小,以确保图像至少不比屏幕大.如果是,我会在图像上缩小比例.但是这是典型的打印日志
对象尺寸为(768.0,798.453531598513)结果大小是(1614.0,1678.0)
即使我将目标大小设置为768x798(在特定情况下),它给我的最终UIImage也是它的两倍多.现在根据文档中的targetSize参数
"要返回的图像的目标大小."
不是最清楚的解释,但从我的实验来看,它不符合这一点.
如果您有一些建议,我很乐意听到它!
目前我正在使用此方法遍历每个像素,并根据RGB值将值插入到3D数组中.我需要这个数组用于我程序的其他部分,但它非常慢.当在50 x 50的图片上运行时,它几乎是即时的,但是一旦你开始进入数百甚至数百,它需要很长时间才能达到应用无用的程度.任何人对如何加快我的方法有任何想法?
@IBAction func convertImage(sender: AnyObject) {
if let image = myImageView.image {
var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage))
var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let height = Int(image.size.height)
let width = Int(image.size.width)
var zArry = [Int](count:3, repeatedValue: 0)
var yArry = [[Int]](count:width, repeatedValue: zArry)
var xArry = [[[Int]]](count:height, repeatedValue: yArry)
for (var h = 0; h < height; h++) {
for (var w = 0; w < width; w++) {
var pixelInfo: Int = ((Int(image.size.width) * Int(h)) + Int(w)) * 4 …
Run Code Online (Sandbox Code Playgroud) 我想用drawInRect方法调整图像大小,但我还想保持正确的宽高比,同时完全填充给定的帧(如.ScaleAspectFill对UIViewContentMode所做的那样).任何人都有一个现成的答案吗?
这是我的代码(非常简单......):
func scaled100Image() -> UIImage {
let newSize = CGSize(width: 100, height: 100)
UIGraphicsBeginImageContext(newSize)
self.pictures[0].drawInRect(CGRect(x: 0, y: 0, width: 100, height: 100))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
Run Code Online (Sandbox Code Playgroud) 我已经使用以下方法实现了绘画/绘画:
- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
-(void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
Run Code Online (Sandbox Code Playgroud)
现在的问题是,对于任何绘制的线,我想得到那个特定的线/油漆图像.我不想要整个屏幕的图像,只需要绘制线条/绘图的区域/边界.
原因是我想在该行/绘制的绘图上执行平移手势/删除功能.
用户可以绘制多条线,因此需要分别UIImage
使用所有这些线.
任何逻辑或代码片段都会非常有用
提前致谢
我在Swift(3)中遇到Share Extension编程问题.
我的主要问题是处理NSItemProvider的类型.
这是问题所在:根据我启动扩展程序的应用程序,我得到了不同类型的数据.例如:
我告诉应用程序:data
let IMAGE_TYPE = kUTTypeImage as String
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE){
attachment.loadItem(forTypeIdentifier: IMAGE_TYPE, options: nil){ data, error in
...
}
Run Code Online (Sandbox Code Playgroud)
(注意:附件的类型为NSItemProvider)
当从照片应用程序执行时,data
是一个URL,所以我从中创建一个UIImage并继续.
问题是,对于某些应用程序data
已经是UIImage,我无法找到如何区分大小写.
最好的可能是检查data
对象的数据类型,但至少对我来说并不是微不足道的.
在此先感谢您的帮助!
我使用的是UIImagePickerController
具有allowsEditing
能够在共享一个应用程序的图像,却发现裁剪的图像用于运行iOS仅11偏移的设备.
我的UIImagePickerControllerDelegate
实现非常简单,只是标准操作:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerEditedImage] as! UIImage
imageView.image = image
picker.dismiss(animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
下面你可以看到差异.iOS 10在右侧,iOS 11在左侧.您可以看到iOS 11图像向下偏移,即使裁剪矩形放在完全相同的位置.
这里是一个视频演示该问题:https://www.dropbox.com/s/4csofidjcrc9ah6/UIImagePickerControllerEditedImageOffset.mp4?dl=0
我还在GitHub上创建了一个演示项目来演示这个问题:https://github.com/aivars/photo-Picker-Tests
我猜这是UIImagePickerController
错误,但想知道为什么不在网上找到任何其他错误报告.
我还向Apple提交了一份错误报告:http://www.openradar.me/36292067
我有一个从我的自定义调色板返回UIColor的类。我以编程方式调用此方法,但是当我在iOS 11上对其进行测试时,它始终会返回nil
结果...我在多种设备和OS版本11.0、11.0.1、11.2上尝试了此操作,并且所有方法都返回nil
。但是,只要我在> iOS 12上运行它们,它就会始终返回正确的颜色。
var color: UIColor? {
switch self {
case .darkIndigo: return UIColor(named: "darkIndigo")
case .lightNavy: return UIColor(named: "lightNavy")
case .cobalt: return UIColor(named: "cobalt")
}
}
Run Code Online (Sandbox Code Playgroud)
我最近更改了应用程序的包ID ...,这使我认为这与使用多个包时UIImage存在的类似问题有关。特别是当我收到错误消息时
警告:无法从以下任何捆绑包中解析名为“ darkIndigo”的颜色:
但是,应该如何解决呢?我是否应该手动删除整个资产目录并将其重新添加?