在iOS中我可以使用什么代替NSBitmapImageRep? (水波纹的例子)

时间:2016-01-15 20:46:38

标签: ios swift cgimage nsbitmapimagerep

我发现这个有趣post about water ripple simulation。它包含一个Xcode project和一个OSX的小可可应用程序。我尝试使用Swift在iOS上运行应用程序,但我找不到解决以下问题的方法:

OSX应用程序使用NSBitmapImageRep将数组中的位图数据绘制到屏幕上(这发生在BBRippleView.m中)。不幸的是,NSBitmapImageRep在iOS中不可用。我尝试使用CGImage代替,这是“有点工作”:我可以看到某种水涟漪,但它们以某种奇怪的方式分裂,并且它们不按照它们应有的方式移动。我猜CGImage希望以不同于当前格式的格式获取位图数据。

编辑:这是我的iOS RippleView课程:RippleView.swift

编辑2:修改RippleView.swift

使用Swift在iOS中实现以下OSX代码段的正确方法是什么?

        image = [[NSImage alloc] initWithSize:NSMakeSize(cols, rows)];
        bufrep = [[NSBitmapImageRep alloc]
                            initWithBitmapDataPlanes:NULL
                            pixelsWide:cols
                            pixelsHigh:rows
                            bitsPerSample:8
                            samplesPerPixel:1
                            hasAlpha:NO
                            isPlanar:YES
                            colorSpaceName:NSDeviceWhiteColorSpace
                            bytesPerRow:0
                            bitsPerPixel:0];
        [image addRepresentation:bufrep];

-(void)applyBuffer
{
    unsigned char* data = [bufrep bitmapData];
    int x = 0;
    int y = 0;
    int position = 0;
    for ( y = 0; y < rows; y ++) {
        for ( x = 0; x < cols ; x ++) {
            position = (y * cols) + x;
            data[position] = (char)buffer2[position] << 1;
        }           
    }       
}

1 个答案:

答案 0 :(得分:0)

你告诉CGImageCreate你的图像是灰度的,有8位像素。但是你的缓冲区是Int s的数组,它们是32或64位(4或8字节)。

切换到UInt8,这应该会有很多帮助。