1

给定一个 CGRect ( rect) 和一个 UIImage ( image),如何获得矩形中图像像素的 alpha 值(仅)?

以下代码始终返回 0 alpha,无论是图像还是矩形。

CGContextRef context = CGBitmapContextCreate(NULL,
                                             rect.size.width,
                                             rect.size.height,
                                             8,
                                             rect.size.width,
                                             NULL,
                                             kCGImageAlphaOnly);

UIGraphicsPushContext(context);
[image drawInRect:rect];
char *pixels = CGBitmapContextGetData(context);
NSUInteger pixelCount = rect.size.width * rect.size.height;
for (int i = 0; i < pixelCount; i++)
{
    char pixel = pixels[i];
    CGFloat alpha = pixel / 255.0;
    NSLog(@"%f", alpha);
}
UIGraphicsPopContext();
CGContextRelease(context);
4

5 回答 5

2

在 Swift 4 中,仅获取 alpha 通道的代码如下所示:

import UIKit

extension UIImage {
    func alphaData() -> [UInt8]? {
        let size = self.size
        var alphaData = [UInt8](repeating: 0, count: Int(size.width) * Int(size.height))
        let colorSpace = CGColorSpaceCreateDeviceGray()
        let context = CGContext(
            data: &alphaData,
            width: Int(size.width),
            height: Int(size.height),
            bitsPerComponent: 8,
            bytesPerRow: Int(size.width),
            space: colorSpace,
            bitmapInfo: CGImageAlphaInfo.alphaOnly.rawValue
        );

        guard let cgImage = self.cgImage else { return nil }
        context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        return alphaData
    }
}
于 2018-10-23T14:43:43.453 回答
0

pixelData[index + 3]将是 Alpha 的值。pixelData[0-2]分别是RGB

CFDataRef 数据;

    theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));

    CFMutableDataRef mutableData = CFDataCreateMutableCopy(0, 0, theData);

    UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(mutableData);

    int dataLength = CFDataGetLength(mutableData);

    for (int index = 0; index < dataLength; index += 4) {
       //code here for just alpha
       pixelData[index + 3]
    }
于 2013-02-21T18:48:46.537 回答
0

过去,我在让 CGBitmapContext 正常工作时遇到过问题。如果有问题,我不会感到惊讶kCGImageAlphaOnly。您可能会使用一些更“主流”的像素格式(例如kCGImageAlphaPremultipliedFirst.

您也可以尝试使用以下方法绘制图像CGImageDrawImage

CGContextRef context = CGBitmapContextCreate(NULL,
                                         rect.size.width,
                                         rect.size.height,
                                         8,
                                         rect.size.width,
                                         NULL,
                                         kCGImageAlphaOnly);

CGContextDrawImage( context, rect, image.CGImage);

//etc...

CGContextRelease(context);
于 2013-02-26T01:13:32.360 回答
0

根据我对 RGBA 值的经验,它们都必须是无符号字符。我猜这可能会导致您的问题,因为如果此图像的不透明度为 1,签名字符将停止在 127 并且永远不会达到完整的 255 值 - 并且可能更糟糕的是没有正确对齐(读取)。

于 2013-02-26T02:44:20.223 回答
0

我认为这应该对您有所帮助.. https://github.com/OgreSwamp/ObjFloodFill

于 2013-03-04T08:30:08.947 回答