我试图从CGImage访问像素数据.我希望能够以整数形式访问RGB值.我想我差不多有这个代码:
UIImage* theImage = [UIImage imageNamed:@"rgb.png"];
CGImageRef cgImageRef = CGImageRetain(theImage.CGImage);
CFDataRef* imageData = CGDataProviderCopyData(CGImageGetDataProvider(cgImageRef));
NSLog(@"the data = %@", imageData);
Run Code Online (Sandbox Code Playgroud)
然后记录:
data = <010002fe fffdff02 0200fe04 0003fc>
图像是5x1 png,按顺序包含黑色,白色,红色,绿色和蓝色像素.
我真的不明白我在这看什么.我如何获得RGB值的数组,或类似的东西,以便我可以使用它们.
谢谢,Rich
我使用CGImage的API( CGImageDestination, CGBitmapContext,,CGImage在Mac OS X等)以及iOS的压缩图像为JPEG.使用该kCGImageDestinationLossyCompressionQuality属性,您可以控制压缩质量:0.0最大压缩和1.0最高质量(如果可能,根据Apple,无损).
我发现当你去的时候,磁盘大小和图像质量都有很大的0.99提升1.0..例如,我有一个2048x1368的图像,当质量设置为压缩到430 KB 0.99但是当质量达到2.3 MB时设置为1.0.视觉质量也有很大的提升,并且0.99这个特定图像的设置是不可接受的.尝试设置质量之间的任何东西0.99来1.0作为规模保持在430 KB,直到不起作用0.995的地方跳起来2.3 MB.另外,是不是真的有素质相差无几0.90,以0.99在视觉质量有较大提升其范围的文件大小从353〜KB至430 KB,但不是.
有谁知道是否有任何方法可以提高JPEG质量?我真的需要的东西比0.99给予我的东西更好但却少于1.0提供给我的东西.也许我可以使用其他一些API?
我可能会尝试直接使用libjpeg,但我希望它不会出现这种情况.
经过一些调查后发现,对于所有kCGImageDestinationLossyCompressionQuality设置,1.0Apple使用4:2:0 色度子采样(或色度抽取).这意味着对于YCrCb图像,它们仅针对每4个亮度(Y)像素采样一个色度像素(CrCb).换句话说,他们只使用原始图像中1/4的色度数据.对于1.0Apple 的质量使用4:4:4色度子采样,这对于每个亮度像素都不是色度子采样或一个色度像素.这就是文件大小爆炸的原因,因为图像包含4x颜色数据与质量<= 0.99.
那么,有没有人知道是否有办法使用CGImage(或任何其他API)关闭色度子采样的质量低于1.0?
有一种简单的方法可以在10.5中运行吗?
在10.6中,我可以使用nsImage CGImageForProposedRect:NULL上下文:NULL提示:NULL
如果我不使用1b黑白图像(如Group 4 TIFF),我可以使用位图,但cgbitmaps似乎不喜欢这种设置...有没有一般的方法这样做?
我需要这样做,因为我有一个看似只想添加CGImages的IKImageView,但我所拥有的只是NSImages.目前,我正在使用一个私有的setImage:(NSImage*)方法,我真的不会使用...
目标:裁剪a UIImage(scale以2.0 的属性开头)
我执行以下代码:
let croppedCGImage = originalUIImage.cgImage!.cropping(to: cropRect)
let croppedUIImage = UIImage(cgImage: croppedCGImage!)
Run Code Online (Sandbox Code Playgroud)
此代码有效,但结果croppedUIImage的scale属性不正确为1.0.
我已经尝试过指定scale创建最终图像的时间:
let croppedUIImage = UIImage(cgImage: croppedCGImage!, scale: 2.0, orientation: .up)
Run Code Online (Sandbox Code Playgroud)
这会产生正确的比例,但它会将size尺寸缩小一半.
我该怎么办?
(*注意:scaleUIImage上的属性很重要,因为我稍后会保存UIImagePNGRepresentation(_ image: UIImage)受scale属性影响的图像)
编辑:
我得到以下工作.不幸的是,它比CGImage裁剪功能慢得多.
extension UIImage {
func cropping(to rect: CGRect) -> UIImage {
UIGraphicsBeginImageContextWithOptions(rect.size, false, self.scale)
self.draw(in: CGRect(x: -rect.origin.x, y: -rect.origin.y, width: self.size.width, height: self.size.height))
let croppedImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return croppedImage …Run Code Online (Sandbox Code Playgroud) 我实际上要做的是在视图中有一个文本标签"切割"一个文本形状的孔.我试过使用self.mask = uiLabel但是那些拒绝正确定位文本所以我通过Core Graphics接近这个.
这是不起作用的代码(在draw(_ rect: CGRect))中:
let context = (UIGraphicsGetCurrentContext())!
// Set mask background color
context.setFillColor(UIColor.black.cgColor)
context.fill(rect)
context.saveGState()
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
let attributes = [
NSParagraphStyleAttributeName: paragraphStyle,
NSFontAttributeName: UIFont.systemFont(ofSize: 16, weight: UIFontWeightMedium),
NSForegroundColorAttributeName: UIColor.white
]
let string = NSString(string: "LOGIN")
// This wouldn't vertically align so we calculate the string size and create a new rect in which it is vertically aligned
let size = string.size(attributes: attributes)
let position = CGRect( …Run Code Online (Sandbox Code Playgroud) 使用标准图像格式(jpeg,gif,png等)从文件加载CGImage或NSImage非常简单.
但是,我现在需要在使用libfreetype生成的内存中以字节为单位创建CGImage.从格式化的字节数组中创建OpenGL纹理非常容易,我可以看到如何创建要写入的CGBitmapContext .但我似乎无法找到一种从原始像素阵列创建CGImage的简单方法.
我有一个UIImage,我从UIImagePickerController获取.当我从- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info方法中收到图像时,我将其直接放入UIImageView进行预览,并为用户提供保存或丢弃图像的选项.

当用户选择保存选项时,应用程序获取图像的png数据并将其保存到文档目录中.但是在2种可能的设备方向之一(仅景观)下发生的事情是图像被颠倒保存(更具体地说,从它应该的位置旋转180度).因此,当我在图库中加载图像时,它会显示为颠倒.
(参见图库中的左下角图片)

我已经解决了UIImage来自UIImage的UIImage中的原始图像数据没有旋转,而是将方向存储为对象的属性,仅在显示时应用.所以我试图使用我在网上找到的一些代码来旋转与UIImage相关联的CGImage.但它似乎对图像完全没有影响.我正在使用的代码如下:
- (void)rotateImage:(UIImage*)image byRadians:(CGFloat)rads
{
// calculate the size of the rotated view's containing box for our drawing space
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,image.size.width, image.size.height)];
CGAffineTransform t = CGAffineTransformMakeRotation(rads);
rotatedViewBox.transform = t;
CGSize rotatedSize = rotatedViewBox.frame.size;
// Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
// Move the origin to the middle of the image you want to rotate and scale around the center.
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
// Rotate …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,用户使用UIImagePickerViewController选择图像或拍照.选择图像后,我想在方形UIImageView(90x90)上显示其缩略图.
我正在使用Apple的代码来创建缩略图.问题是缩略图不是平方的,函数在设置kCGImageSourceThumbnailMaxPixelSize键后为90,似乎只调整图像的高度,据我所知,kCGImageSourceThumbnailMaxPixelSize键应该负责设置缩略图的高度和宽度.
以下是我的代码的一瞥:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
NSData *imageData = UIImageJPEGRepresentation (image, 0.5);
// My image view is 90x90
UIImage *thumbImage = MyCreateThumbnailImageFromData(imageData, 90);
[myImageView setImage:thumbImage];
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
[picker dismissViewControllerAnimated:YES completion:nil];
}
UIImage* MyCreateThumbnailImageFromData (NSData * data, int imageSize) {
CGImageRef myThumbnailImage = NULL;
CGImageSourceRef myImageSource;
CFDictionaryRef myOptions = NULL;
CFStringRef myKeys[3];
CFTypeRef myValues[3];
CFNumberRef thumbnailSize;
// Create an image source from NSData; …Run Code Online (Sandbox Code Playgroud) 当从矩形原始图像中裁剪图像的正方形部分时,我正面临图像方向问题.当图像处于风景中时,它很好.但是当它是纵向时,似乎没有保留图像方向,这导致图像具有错误的方向和糟糕的裁剪:
func cropImage(cropRectangleCoordinates: CGRect) {
let croppedImage = originalImage
let finalCroppedImage : CGImageRef = CGImageCreateWithImageInRect(croppedImage.CGImage, cropRectangleCoordinates)
finalImage = UIImage(CGImage: finalCroppedImage)!
}
Run Code Online (Sandbox Code Playgroud)
我认为问题在于croppedImage.CGImage.这里图像被转换为CGImage,但似乎不保留方向.通过UIImage仅使用来保持方向很容易,但是为了使裁剪,图像需要暂时进行CGImage,这就是问题所在.即使我在转换回图像时重新定向图像UIImage,它也可能处于正确的方向,但在裁剪时已经完成了损坏CGImage.
这是一个很快的问题,所以请快速回答,因为Objective-C中的解决方案可能有所不同.
我正在使用以下代码来裁剪并创建一个更大的UIImage.我已经将问题与CGImageCreateWithImageInRect()函数隔离开来,它似乎没有按照我想要的方式设置一些CGImage属性.:-)问题是调用函数UIImagePNGRepresentation()失败返回nil.
CGImageRef origRef = [stillView.image CGImage];
CGImageRef cgCrop = CGImageCreateWithImageInRect( origRef, theRect);
UIImage *imgCrop = [UIImage imageWithCGImage:cgCrop];
Run Code Online (Sandbox Code Playgroud)
...
NSData *data = UIImagePNGRepresentation ( imgCrop);
Run Code Online (Sandbox Code Playgroud)
- libpng错误:没有IDAT写入文件
知道UIImage中裁剪矩形可能有什么不妥或替代吗?非常感谢!