iOS保存到相机胶卷

时间:2017-07-31 18:36:02

标签: gluon javafxports gluon-mobile

我扩展了Charm-Down图片服务并添加了一种新方法,可以让我将图像保存在用户的相机胶卷中。所以我使用以前问题的信息将图像转换为base64编码的字符串。

@Override
public void saveImage(Image image) {
    PixelReader pixelReader = image.getPixelReader();
    int width = (int) image.getWidth();
    int height = (int) image.getHeight();
    int[] data = new int[width * height];
    pixelReader.getPixels(0, 0, width, height, PixelFormat.getIntArgbPreInstance(), data, 0, width);

    // 2. int array to byte array
    ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);
    IntBuffer intBuffer = byteBuffer.asIntBuffer();
    intBuffer.put(data);


    // 3. Encode to String
    String encoded = Base64.getEncoder().encodeToString(arr);
    saveImage(encoded);
}

public static native void saveImage(String s);

名为Do this:

的本机方法
JNIEXPORT void JNICALL Java_com_gluonhq_charm_down_plugins_ios_IOSPicturesService_saveImage
(JNIEnv *env, jclass jClass, jbyteArray array, jstring jTitle) {
    const jchar *charsTitle = (*env)->GetStringChars(env, jTitle, NULL);
    NSString *name = [NSString stringWithCharacters:(UniChar *)charsTitle length:(*env)->GetStringLength(env, jTitle)];
    (*env)->ReleaseStringChars(env, jTitle, charsTitle);

    NSData *data = [[NSData alloc]initWithBase64EncodedString:name options:NSDataBase64DecodingIgnoreUnknownCharacters];
    if (data==NULL) {
        NSLog(@"data is null");
    }
    NSLog(@"Saving");
    UIImage *ret = [UIImage imageWithData : data];
    if (ret==NULL) {
        NSLog(@"image is null");
    }
    [_pictures savePicture: ret];
}

-(void) savePicture : (UIImage *) snapshot {
    UIImageWriteToSavedPhotosAlbum(snapshot, nil,nil, nil);
    NSLog(@"Saved");
}

我使用此代码将JavaFx图像转换为字符串,然后将其本身转换回可以存储在用户相机胶卷中的UIImage。但是,每次尝试此操作时,都会调用(data == NULL)块,因为NSData对象似乎为null。有谁知道为什么我的Base64编码字符串无法正确转换为NSData对象?

    byte[] arr = byteBuffer.array();
    for (int x = 0; x < arr.length; x += 4) {
        byte b = arr[x];
        arr[x] = arr[x + 1];   //a  r
        arr[x + 1] = arr[x + 2];//r  g
        arr[x + 2] = arr[x + 3];//g  b
        arr[x + 3] = b;//b  a
    }

我甚至可以选择将其从argb转换为Rgba格式,但这似乎无法解决问题

0 个答案:

没有答案