Phonegap构建iOS camera.getPicture()质量参数不起作用

时间:2015-07-06 17:53:19

标签: ios cordova phonegap-plugins phonegap-build

我编写了一个Phonegap应用程序,并使用Build服务编译它。 我的应用程序在这段代码中调用相机:

function capturePhoto(){

        // Take picture using device camera and retrieve image 
            navigator.camera.getPicture(onPhotoDataSuccess, onFail, { 
              quality: 20,
              destinationType: destinationType.FILE_URI });

    }

生成的图像通过ajax上传到服务器。 当我查看上传的图像时,一些到达时它们的质量适当降低,但有些到达的文件大小约为4 MB。我已经意识到在iPhone 4和5上运行我的应用程序的用户(我还没有6个测试人员)一直在上传大图像。

我将质量降低到10和5.适当降低Android提交图像的图像大小 - 但IOS图像仍然很大。谁能告诉我这里是否存在已知问题?

API文档说您无法降低从图库或相机胶卷中选择的图像质量,但这些不是。它们是从相机装载的。

2 个答案:

答案 0 :(得分:3)

这是插件在拍摄照片后用于处理图像的代码:

- (NSData*)processImage:(UIImage*)image info:(NSDictionary*)info options:(CDVPictureOptions*)options
{
    NSData* data = nil;

    switch (options.encodingType) {
        case EncodingTypePNG:
            data = UIImagePNGRepresentation(image);
            break;
        case EncodingTypeJPEG:
        {
            if ((options.allowsEditing == NO) && (options.targetSize.width <= 0) && (options.targetSize.height <= 0) && (options.correctOrientation == NO)){
                // use image unedited as requested , don't resize
                data = UIImageJPEGRepresentation(image, 1.0);
            } else {
                if (options.usesGeolocation) {
                    NSDictionary* controllerMetadata = [info objectForKey:@"UIImagePickerControllerMediaMetadata"];
                    if (controllerMetadata) {
                        self.data = data;
                        self.metadata = [[NSMutableDictionary alloc] init];

                        NSMutableDictionary* EXIFDictionary = [[controllerMetadata objectForKey:(NSString*)kCGImagePropertyExifDictionary]mutableCopy];
                        if (EXIFDictionary) {
                            [self.metadata setObject:EXIFDictionary forKey:(NSString*)kCGImagePropertyExifDictionary];
                        }

                        if (IsAtLeastiOSVersion(@"8.0")) {
                            [[self locationManager] performSelector:NSSelectorFromString(@"requestWhenInUseAuthorization") withObject:nil afterDelay:0];
                        }
                        [[self locationManager] startUpdatingLocation];
                    }
                } else {
                    data = UIImageJPEGRepresentation(image, [options.quality floatValue] / 100.0f);
                }
            }
        }
            break;
        default:
            break;
    };

    return data;
}

因此,如果options.encodingType是PNG,则图像质量不会改变。默认值是JPG,因此问题不存在。

但是请检查

if ((options.allowsEditing == NO) && (options.targetSize.width <= 0) && (options.targetSize.height <= 0) && (options.correctOrientation == NO))

allowsEditing默认为NO

targetSize.widthtargetSize.height默认为0

correctOrientation默认为NO

所以if的所有条件都满足,并且质量没有变化。

这听起来像是一个错误,因为在任何地方都没有提到你必须指定任何其他值来使质量参数工作。

那么,你现在能做什么?

您可以在cordova jira页面上https://issues.apache.org/jira/browse/CB提交问题 和/或您可以传递任何参数来更改默认值并使代码跳过if并转到带有质量代码的else。改变任何一个都应该有效:

  allowEdit : true,
  targetWidth: 100,
  targetHeight: 100,
  correctOrientation: true
编辑:已经有一个bug被打开了 https://issues.apache.org/jira/browse/CB-6190

编辑2:我修复了问题,您可以使用cordova plugin add https://github.com/apache/cordova-plugin-camera进行更改或等到它发布到NPM

答案 1 :(得分:1)

没有问题。 iOS有更大的图片。他们称之为功能。

http://lifeinlofi.com/more/iphone-photo-sizes-2007-2013/

杰西