ActionScript для Obj-C / Cocoa: как представить BitmapData? - PullRequest
1 голос
/ 20 марта 2012

Я пытаюсь перенести библиотеку as3delaunay в Obj-C (для развлечения и для изучения еще немного Obj-C).Все идет хорошо, но я не совсем понимаю, как преобразовать использование BitmapData в Какао.Вот несколько соответствующих частей вышеупомянутой библиотеки:

In 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;
    }

Что может быть хорошим способом для представления этого поведения и / или использования BitmapData в Obj-C / Cocoa?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Библиотека Core Graphics имеет очень мощные графические возможности - хотя все это на основе Си. Вы можете создать 8-битный растровый контекст RGBA (красный, зеленый, синий, альфа), например:

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().

1 голос
/ 25 марта 2012

Похоже, вам нужен CGBitmapContext для использования вместо типа BitmapData.

На что обратить внимание:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...