簡體   English   中英

檢測兩個圖像之間的像素碰撞/重疊

[英]Detect pixel collision/overlapping between two images

我有兩個UIImageViews包含具有某些透明區域的圖像。 有什么方法可以檢查兩個圖像之間的非透明區域是否發生碰撞?

謝謝。

[更新]所以這是我到目前為止所掌握的,不幸的是它仍然無法正常工作,但我不知道為什么。

if (!CGRectIntersectsRect(frame1, frame2)) return NO;
NSLog(@"OverlapsPixelsInImage:withImage:> Images Intersect");

UIImage *img1 = imgView1.image;
UIImage *img2 = imgView2.image;
CGImageRef imgRef1 = [img1 CGImage];
CGImageRef imgRef2 = [img2 CGImage];

float minx = MIN(frame1.origin.x, frame2.origin.x);
float miny = MIN(frame1.origin.y, frame2.origin.y);
float maxx = MAX(frame1.origin.x + frame1.size.width, frame2.origin.x + frame2.size.width);
float maxy = MAX(frame1.origin.y + frame1.size.height, frame2.origin.y + frame2.size.height);
CGRect canvasRect = CGRectMake(0, 0, maxx - minx, maxy - miny);

size_t width = floorf(canvasRect.size.width);
size_t height = floorf(canvasRect.size.height);

NSUInteger bitsPerComponent = 8;
NSUInteger bytesPerRow = 4 * width;
unsigned char *rawData = calloc(width * height, sizeof(*rawData));
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);

CGColorSpaceRelease(colorSpace);

CGContextTranslateCTM(context, 0, canvasRect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextClipToMask(context, CGRectMake(frame2.origin.x - minx, frame2.origin.y - miny, frame2.size.width, frame2.size.height), imgRef2);
CGContextDrawImage(context, CGRectMake(frame1.origin.x - minx, frame1.origin.y - miny, frame1.size.width, frame1.size.height), imgRef1);

CGContextRelease(context);

int byteIndex = 0;
for (int i = 0; i < width * height; i++)
{
    CGFloat alpha = rawData[byteIndex + 3];
    if (alpha > 128) 
    {
        NSLog(@"collided in byte: %d", i);
        free(rawData);
        return YES;
    }
    byteIndex += 4;
}

free(rawData);

return NO;

不容易,您基本上必須讀取原始位圖數據並遍歷像素。

您可以將兩個圖像的兩個Alpha通道繪制到單個位圖上下文中,然后在數據中查找任何透明像素。 看一下將clipRectToPath() 剪切到CGPath中的clipRectToPath()代碼。 它正在解決一個不同的問題,但是方法是相同的。 與其使用CGContextFillPath()繪制上下文,不如繪制兩個圖像。

流程如下:

  1. 創建kCGImageAlphaOnly Alpha位圖上下文( kCGImageAlphaOnly
  2. 將要比較的所有內容都繪制到其中
  3. 遍歷像素看值。 在我的示例中,它認為< 128是“透明的”。 如果要完全透明,請使用== 0
  4. 當您找到一個透明像素時,該示例僅記錄該像素所在的列。在您的問題中,您可能只返回YES ,或者您可以使用該數據形成另一個蒙版。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM