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

时间:2011-01-19 13:42:54

标签: ios cocoa uiimage

这是检查UIImage是否为空白的最佳方式? 我有这个绘画编辑器返回UIImage;如果没有任何内容,我不想保存这张图片。

6 个答案:

答案 0 :(得分:5)

Try this code:

BOOL isImageFlag=[self checkIfImage:image];

And checkIfImage method:
- (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:
#import <OpenGLES/ES1/gl.h>

答案 1 :(得分:2)

一个想法是调用UIImagePNGRepresentation来获取NSData对象,然后将其与预定义的“空”版本进行比较 - 即:call:

- (BOOL)isEqualToData:(NSData *)otherData

要测试吗?

没有在大数据上尝试过此操作;可能想要检查性能,如果你的图像数据非常大,否则如果它很小,可能就像在C中调用memcmp()一样。

答案 2 :(得分:2)

这些方面的东西:

  1. 创建1 px square CGContext
  2. 绘制图像以填充上下文
  3. 测试上下文的一个像素以查看它是否包含任何数据。如果它完全透明,请将图片视为空白
  4. 其他人可能会在此答案中添加更多详细信息。

答案 3 :(得分:0)

我不在我的Mac上,所以我无法测试它(并且可能存在编译错误)。但有一种方法可能是:

//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;

答案 4 :(得分:0)

我刚遇到同样的问题。通过检查尺寸解决了这个问题:

Swift示例:

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
}

答案 5 :(得分:0)

这是Swift中的解决方案,不需要任何其他框架。

感谢您在此处回答相关问题: Get Pixel Data of ImageView from coordinates of touch screen on xcode?

@app.route('/')
def index():
    return '''<h1>{{result}}</h1>'''