[
https://issues.apache.org/jira/browse/CB-4027?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13963336#comment-13963336
]
Jesse MacFadyen commented on CB-4027:
-------------------------------------
Given a source image that is 250 x 150, and targetWidth = 125 and targetHeight
= 125
output will be 125 x 75
- in this case targetHeight is not used, because maintaining aspect ratio means
that targetWidth is the bound.
Given a source image that is 150 x 250, and targetWidth = 125 and targetHeight
= 125
output will be 75 x 125
- in this case targetWidth is not used, because maintaining aspect ratio means
that targetHeight is the bound.
The 'rule' used to resize is to find the largest possible aspect maintained
version of the image that could fit in the box defined by targetWidth x
targetHeight.
> Using targetWidth & targetHeight with camera.getPicture does not return
> scaled image on WP7 WP8 PhoneGap
> --------------------------------------------------------------------------------------------------------
>
> Key: CB-4027
> URL: https://issues.apache.org/jira/browse/CB-4027
> Project: Apache Cordova
> Issue Type: Bug
> Components: Plugin Camera, WP7, WP8
> Affects Versions: 2.8.0
> Reporter: Richard Marshall
> Assignee: Jesse MacFadyen
>
> I have built an app that uses the camera.getPicture.
> I am using targetWidth & targetHeight to shrink the image to a smaller size
> before saving it to a server.
> The PhoneGap functionality is supposed to scale the image so as not to lose
> the aspect ratio of the original image.
> As mentioned in
> http://docs.phonegap.com/en/2.8.0/cordova_camera_camera.md.html#Camera
> The functionality is working fine in iOS and Android, but in Windows Phone it
> turns it into a square with the width and height as set by targetWidth &
> targetHeight.
> This is the call;
> navigator.camera.getPicture(app.onPhotoDataSuccess, app.onPhotoDataFail, {
> quality: 50, targetWidth:400, targetHeight:400, allowEdit: false,
> destinationType: app.destinationType.DATA_URL });
> Looking at the PhoneGap 2.8 code in Plugins/Camera.cs
> private string GetImageContent(Stream stream)
> {
> int streamLength = (int)stream.Length;
> byte[] fileData = new byte[streamLength + 1];
> stream.Read(fileData, 0, streamLength);
> //use photo's actual width & height if user doesn't provide width
> & height
> if (cameraOptions.TargetWidth < 0 && cameraOptions.TargetHeight <
> 0)
> {
> stream.Close();
> return Convert.ToBase64String(fileData);
> }
> else
> {
> // resize photo
> byte[] resizedFile = ResizePhoto(stream, fileData);
> stream.Close();
> return Convert.ToBase64String(resizedFile);
> }
> }
> private byte[] ResizePhoto(Stream stream, byte[] fileData)
> {
> int streamLength = (int)stream.Length;
> int intResult = 0;
> byte[] resizedFile;
> stream.Read(fileData, 0, streamLength);
> BitmapImage objBitmap = new BitmapImage();
> MemoryStream objBitmapStream = new MemoryStream(fileData);
> MemoryStream objBitmapStreamResized = new MemoryStream();
> WriteableBitmap objWB;
> objBitmap.SetSource(stream);
> objWB = new WriteableBitmap(objBitmap);
> // resize the photo with user defined TargetWidth & TargetHeight
> Extensions.SaveJpeg(objWB, objBitmapStreamResized,
> cameraOptions.TargetWidth, cameraOptions.TargetHeight, 0,
> cameraOptions.Quality);
> //Convert the resized stream to a byte array.
> streamLength = (int)objBitmapStreamResized.Length;
> resizedFile = new Byte[streamLength]; //-1
> objBitmapStreamResized.Position = 0;
> //for some reason we have to set Position to zero, but we don't
> have to earlier when we get the bytes from the chosen photo...
> intResult = objBitmapStreamResized.Read(resizedFile, 0,
> streamLength);
> return resizedFile;
> }
> You can see the if code that calls to resize the image.
> When you look at the definition for Extensions.SaveJpeg
> public static void LoadJpeg(this WriteableBitmap bitmap, Stream sourceStream);
> //
> // Summary:
> // Encodes a WriteableBitmap object into a JPEG stream, with
> parameters for
> // setting the target width and height of the JPEG file.
> //
> // Parameters:
> // bitmap:
> // The WriteableBitmap object.
> //
> // targetStream:
> // The image data stream.
> //
> // targetWidth:
> // The target width of the file.
> //
> // targetHeight:
> // The target height of the file.
> //
> // orientation:
> // This parameter is not currently used by this method. Use a
> value of 0 as
> // a placeholder.
> //
> // quality:
> // This parameter represents the quality of the JPEG photo with a
> range between
> // 0 and 100, with 100 being the best photo quality. We recommend
> that you do
> // not fall lower than a value of 70. because JPEG picture
> quality diminishes
> // significantly below that level.
> [SecuritySafeCritical]
> public static void SaveJpeg(this WriteableBitmap bitmap, Stream
> targetStream, int targetWidth, int targetHeight, int orientation, int
> quality);
> }
> You can not see any reference to the fact that the aspect ratio will be kept
> anywhere in the code.
> So it looks as if the aspect ratio is not honoured in the Windows Phone
> implementation of the functionality.
> Can we please have this fixed?
> I originally posted here:
> https://groups.google.com/forum/#!topic/phonegap/XNOhAqQDn4U
> Thanks
--
This message was sent by Atlassian JIRA
(v6.2#6252)