【问题标题】:C# vuforia.image.pixels cover to iOS CIImage or CGImageC# vuforia.image.pixels 覆盖到 iOS CIImage 或 CGImage
【发布时间】:2017-06-01 07:52:09
【问题描述】:

C#

private Vuforia.Image QCARoutput;
QCARoutput = CameraDevice.Instance.GetCameraImage(Vuforia.Image.PIXEL_FORMAT.RGB888);

_iOS_sendData(QCARoutput.Pixels, QCARoutput.Pixels.length);

iOS

void _iOS_sendData(const char** ptrSrc, const int srcLength) {

        NSData *imageData = [NSData dataWithBytes:(const void *)ptrSrc length:(sizeof(unsigned char) * srcLength)];
        CIImage *ciimg = [CIImage imageWithData:imageData];
        [delegateObject decodeWithQRcode:ciimg complete:^(NSString *result) {
            NSLog(@"%@",result);
        }];
}

所以我想获得 Vuforia.image.pixels,它是 byte[]。然后发送到iOS封面到CIImage,但ciimage为空。如何将此字节 [] 覆盖到 CIImage 对象?

====== 更新 C# ======

[DllImport("__Internal")]
private static extern void _iOS_sendData_ResultBlock(System.IntPtr ptrSrc, int srcLength); 

//=================================================
QCARoutput = CameraDevice.Instance.GetCameraImage(Vuforia.Image.PIXEL_FORMAT.RGB888);
IntPtr unmanagedPointer = Marshal.AllocHGlobal(QCARoutput.Pixels.Length);
Marshal.Copy(QCARoutput.Pixels, 0, unmanagedPointer, QCARoutput.Pixels.Length);
// Call unmanaged code
Marshal.FreeHGlobal(unmanagedPointer);
_iOS_sendData_ResultBlock(unmanagedPointer, QCARoutput.Pixels.Length);

====== 更新Objective-C ======

void _iOS_sendData_ResultBlock(Byte *ptrSrc, const int srcLength, iOSUnityCallBack callback) {

        NSData *imageData = [NSData dataWithBytes:ptrSrc length:(sizeof(unsigned char) * srcLength)];
        CIImage *ciimg = [CIImage imageWithData:imageData];
        if (ciimg == nil) {
            NSLog(@"the ciimage is nil ,stop");
            return;
        }
}

我做了一些改变。它不起作用。

【问题讨论】:

    标签: c# ios objective-c unity3d vuforia


    【解决方案1】:

    我认为您需要在 C# 和 obj-c 两侧更改 _iOS_sendData 的声明。我猜你有这样的事情:

    //c# side
    [DllImport ("__Internal")]
    private static extern void _iOS_sendData(byte[] bytes, int length);
    

    不知道为什么,但是bytes 参数必须是一个数组指针,而不是一个实际的数组。我认为这是因为Objective-C 处理事情的方式。

    尝试以下方法:

    //c# side
    [DllImport ("__Internal")]
    private static extern void _iOS_sendData(System.IntPtr bytes, int length);
    
    //obj-c side
    void _iOS_sendData(Byte * bytes, int length)
    

    source

    【讨论】:

    • 另外,如果OP想在native端修改数组,必须先将数组pin到C#中,这样GC就不会移动它。如果不这样做,将会出现随机崩溃。
    • @Nika Kasradze 我写的代码正如你所说,它不起作用。我对 Byte* 到 NSData 做错了吗?代码已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2017-12-07
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多