我扩展了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格式,但这似乎无法解决问题