简体   繁体   English

如何检查uiimage是否为空白? (空的,透明的)

[英]How to check if a uiimage is blank? (empty, transparent)

which is the best way to check whether a UIImage is blank?这是检查UIImage是否为空白的最佳方法?
I have this painting editor which returns a UIImage ;我有这个绘画编辑器,它返回一个UIImage I don't want to save this image if there's nothing on it.如果上面没有任何内容,我不想保存此图像。

Try this code:试试这个代码:

BOOL isImageFlag=[self checkIfImage:image];

And checkIfImage method:和 checkIfImage 方法:

- (BOOL) checkIfImage:(UIImage *)someImage {
    CGImageRef image = someImage.CGImage;
    size_t width = CGImageGetWidth(image);
    size_t height = CGImageGetHeight(image);
    GLubyte * imageData = malloc(width * height * 4);
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * width;
    int bitsPerComponent = 8;
    CGContextRef imageContext =
    CGBitmapContextCreate(
                          imageData, width, height, bitsPerComponent, bytesPerRow, CGImageGetColorSpace(image),
                          kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
                          );

    CGContextSetBlendMode(imageContext, kCGBlendModeCopy);
    CGContextDrawImage(imageContext, CGRectMake(0, 0, width, height), image);
    CGContextRelease(imageContext);

    int byteIndex = 0;

    BOOL imageExist = NO;
    for ( ; byteIndex < width*height*4; byteIndex += 4) {
        CGFloat red = ((GLubyte *)imageData)[byteIndex]/255.0f;
        CGFloat green = ((GLubyte *)imageData)[byteIndex + 1]/255.0f;
        CGFloat blue = ((GLubyte *)imageData)[byteIndex + 2]/255.0f;
        CGFloat alpha = ((GLubyte *)imageData)[byteIndex + 3]/255.0f;
        if( red != 1 || green != 1 || blue != 1 || alpha != 1 ){
            imageExist = YES;
            break;
        }
    }

    free(imageData);        
    return imageExist;
}

You will have to add OpenGLES framework and import this in the .m file:您必须添加 OpenGLES 框架并将其导入到 .m 文件中:

#import <OpenGLES/ES1/gl.h>

One idea would be to call UIImagePNGRepresentation to get an NSData object then compare it with a pre-defined 'empty' version - ie: call:一种想法是调用UIImagePNGRepresentation来获取NSData对象,然后将其与预定义的“空”版本进行比较 - 即:调用:

- (BOOL)isEqualToData:(NSData *)otherData

to test?测试?

Not tried this on large data;没有在大数据上试过这个; might want to check performance, if your image data is quite large, otherwise if it's small it is probably just like calling memcmp() in C.如果您的图像数据很大,则可能需要检查性能,否则如果它很小,则可能就像在 C 中调用memcmp()

Something along these lines:沿着这些路线的东西:

  1. Create a 1 px square CGContext创建一个 1 px 正方形CGContext
  2. Draw the image so it fills the context绘制图像使其填充上下文
  3. Test the one pixel of the context to see if it contains any data.测试上下文的一个像素以查看它是否包含任何数据。 If it's completely transparent, consider the picture blank如果它是完全透明的,考虑图片空白

Others may be able to add more details to this answer.其他人可能能够为此答案添加更多详细信息。

Here's a solution in Swift that does not require any additional frameworks.这是一个不需要任何额外框架的 Swift 解决方案。

Thanks to answers in a related question here: Get Pixel Data of ImageView from coordinates of touch screen on xcode?感谢此处相关问题的答案: Get Pixel Data of ImageView from touch screen of xcode on xcode?

func imageIsEmpty(_ image: UIImage) -> Bool {
    guard let cgImage = image.cgImage,
          let dataProvider = cgImage.dataProvider else
    {
        return true
    }

    let pixelData = dataProvider.data
    let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
    let imageWidth = Int(image.size.width)
    let imageHeight = Int(image.size.height)
    for x in 0..<imageWidth {
        for y in 0..<imageHeight {
            let pixelIndex = ((imageWidth * y) + x) * 4
            let r = data[pixelIndex]
            let g = data[pixelIndex + 1]
            let b = data[pixelIndex + 2]
            let a = data[pixelIndex + 3]
            if a != 0 {
                if r != 0 || g != 0 || b != 0 {
                    return false
                }
            }
        }
    }

    return true
}

I'm not at my Mac, so I can't test this (and there are probably compile errors).我不在我的 Mac 上,所以我无法对此进行测试(并且可能存在编译错误)。 But one method might be:但一种方法可能是:

//The pixel format depends on what sort of image you're expecting. If it's RGBA, this should work
typedef struct
{
   uint8_t red;
   uint8_t green;
   uint8_t blue;
   uint8_t alpha;
} MyPixel_T;

UIImage *myImage = [self doTheThingToGetTheImage];
CGImageRef myCGImage = [myImage CGImage];

//Get a bitmap context for the image
CGBitmapContextRef *bitmapContext = 
CGBitmapContextFreate(NULL, CGImageGetWidth(myCGImage), CGImageGetHeight(myCGImage), 
                      CGImageGetBitsPerComponent(myCGImage), CGImageGetBytesPerRow(myCGImage),
                      CGImageGetColorSpace(myCGImage), CGImageGetBitmapInfo(myCGImage));

//Draw the image into the context
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGImageGetWidth(myCGImage), CGImageGetHeight(myCGImage)), myCGImage);

//Get pixel data for the image
MyPixel_T *pixels = CGBitmapContextGetData(bitmapContext);
size_t pixelCount = CGImageGetWidth(myCGImage) * CGImageGetHeight(myCGImage);

for(size_t i = 0; i < pixelCount; i++)
{
   MyPixel_T p = pixels[i];
   //Your definition of what's blank may differ from mine
   if(p.red > 0 && p.green > 0 && p.blue > 0 && p.alpha > 0)
      return NO;
}

return YES;

I just encountered the same problem.我刚刚遇到了同样的问题。 Solved it by checking the dimensions:通过检查尺寸解决了它:

Swift example:快速示例:

let image = UIImage()

let height = image.size.height
let width = image.size.height

if (height > 0 && width > 0) {
    // We have an image
} else {
    // ...and we don't
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM