我正在尝试将as3delaunay library移植到Obj-C(为了娱乐和了解更多Obj-C)。一切都很好,但是我不太了解如何将BitmapData的用法转换为可可。以下是上述库的几个相关部分:

Edge.as中:

    internal function makeDelaunayLineBmp():BitmapData
    {
        var p0:Point = leftSite.coord;
        var p1:Point = rightSite.coord;

        GRAPHICS.clear();
        // clear() resets line style back to undefined!
        GRAPHICS.lineStyle(0, 0, 1.0, false, LineScaleMode.NONE, CapsStyle.NONE);
        GRAPHICS.moveTo(p0.x, p0.y);
        GRAPHICS.lineTo(p1.x, p1.y);

        var w:int = int(Math.ceil(Math.max(p0.x, p1.x)));
        if (w < 1)
        {
            w = 1;
        }
        var h:int = int(Math.ceil(Math.max(p0.y, p1.y)));
        if (h < 1)
        {
            h = 1;
        }
        var bmp:BitmapData = new BitmapData(w, h, true, 0);
        bmp.draw(LINESPRITE);
        return bmp;
    }


selectNonIntersectingEdges.as中的以下函数中调用该函数:

internal function selectNonIntersectingEdges(keepOutMask:BitmapData, edgesToTest:Vector.<Edge>):Vector.<Edge>
{
    if (keepOutMask == null)
    {
        return edgesToTest;
    }

    var zeroPoint:Point = new Point();
    return edgesToTest.filter(myTest);

    function myTest(edge:Edge, index:int, vector:Vector.<Edge>):Boolean
    {
        var delaunayLineBmp:BitmapData = edge.makeDelaunayLineBmp();
        var notIntersecting:Boolean = !(keepOutMask.hitTest(zeroPoint, 1, delaunayLineBmp, zeroPoint, 1));
        delaunayLineBmp.dispose();
        return notIntersecting;
    }
}


它也显示为SiteList.as中的参数:

    public function nearestSitePoint(proximityMap:BitmapData, x:Number, y:Number):Point
    {
        var index:uint = proximityMap.getPixel(x, y);
        if (index > _sites.length - 1)
        {
            return null;
        }
        return _sites[index].coord;
    }


在Obj-C / Cocoa中代表这种行为和/或使用BitmapData的好方法是什么?

最佳答案

核心图形库具有非常强大的图形功能-即使它们全部基于C。您可以创建一个8位RGBA(红色,绿色,蓝色,alpha)位图上下文,如下所示:

size_t const bytesPerRow = 4 * width;
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast;
CGContextRef ctx = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorspace, bitmapInfo);
CFRelease(colorspace);


这对应于AS3 BitmapData的内容。

ctx现在具有对位图上下文的引用,您最终必须使用CGContextRelease(ctx)释放该位图上下文。

您可以操纵上下文,即使用各种CGContext*函数将其绘制。如果最终需要将其另存为图像(例如JPEG数据),请使用CGBitmapContextCreateImage()

关于objective-c - Obj-C/Cocoa的 ActionScript :如何表示BitmapData?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9789493/

10-11 13:05