Phonegap Build iOS camera.getPicture() 质量参数不起作用
Phonegap Build iOS camera.getPicture() quality parameter not working
我已经编写了一个 Phonegap 应用程序并使用 Build 服务对其进行了编译。
我的应用程序在此代码块中调用相机:
函数 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 文档说您不能降低从画廊或相机胶卷中选择的图像的质量,但这些不是。它们是从相机加载的。
没有问题。 iOS 有更大的图片。他们称之为功能。
http://lifeinlofi.com/more/iphone-photo-sizes-2007-2013/
杰西
这是插件拍照后处理图片的代码:
- (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.width
和targetSize.height
默认为0
correctOrientation
默认为NO
所以if的所有条件都满足了,质量没有变化
这听起来像是一个错误,因为在任何地方都没有提到您必须指定任何其他值才能使质量参数起作用。
那么,你现在可以做什么?
您可以在 cordova jira 页面上提出问题 https://issues.apache.org/jira/browse/CB
And/or 您可以传递任何参数来更改默认值并使代码跳过 if 并使用质量代码转到 else。更改任何一项都应该有效:
allowEdit : true,
targetWidth: 100,
targetHeight: 100,
correctOrientation: true
编辑:已经有一个 bug open
https://issues.apache.org/jira/browse/CB-6190
编辑 2:我解决了这个问题,您可以使用 cordova plugin add https://github.com/apache/cordova-plugin-camera
获取更改或等到它发布到 NPM
我已经编写了一个 Phonegap 应用程序并使用 Build 服务对其进行了编译。 我的应用程序在此代码块中调用相机:
函数 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 文档说您不能降低从画廊或相机胶卷中选择的图像的质量,但这些不是。它们是从相机加载的。
没有问题。 iOS 有更大的图片。他们称之为功能。
http://lifeinlofi.com/more/iphone-photo-sizes-2007-2013/
杰西
这是插件拍照后处理图片的代码:
- (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.width
和targetSize.height
默认为0
correctOrientation
默认为NO
所以if的所有条件都满足了,质量没有变化
这听起来像是一个错误,因为在任何地方都没有提到您必须指定任何其他值才能使质量参数起作用。
那么,你现在可以做什么?
您可以在 cordova jira 页面上提出问题 https://issues.apache.org/jira/browse/CB And/or 您可以传递任何参数来更改默认值并使代码跳过 if 并使用质量代码转到 else。更改任何一项都应该有效:
allowEdit : true,
targetWidth: 100,
targetHeight: 100,
correctOrientation: true
编辑:已经有一个 bug open https://issues.apache.org/jira/browse/CB-6190
编辑 2:我解决了这个问题,您可以使用 cordova plugin add https://github.com/apache/cordova-plugin-camera
获取更改或等到它发布到 NPM