tim687
Terugkerende gebruiker
- Lid geworden
- 25 apr 2010
- Berichten
- 1.774
Beste leden,
Ik heb een probleem met betrekking tot het schalen van een afbeelding.
De afbeelding heeft een resolutie van 4096 x 2160. Omdat de afbeelding in een ImageView wordt geladen (waarbij een Bitmap texture wordt gebruikt) heeft deze texture een maximale grootte. Dit weet mijn app (hij haalt dit op). Omdat de max. grootte niet mag worden overschreden, wordt de afbeelding verkleint als dit nodig is.
De HTC One X heeft een max. texture size van 2048 x 2048, de afbeelding wordt dus 2 keer verkleint (de breedte en de hoogte om de aspect ratio te behouden). De originele bitmap van 4096 x 2160 wordt wel bewaard, omdat er vanuit deze bitmap "gecropped" moet worden (zo blijft de kwaliteit behouden).
Dus even ter samenvatting. De bitmap die in de ImageView wordt geladen heeft een resolutie van 2048 bij 1080, en de originele afbeelding heeft een resolutie van 4096 x 2160.
Omdat de afbeelding niet in zijn volledige resolutie in de imageView past, wordt deze (!dit is dus de afbeelding met een resolutie van 2048 x 1080!) nog een keer verkleint (dit gebeurd allemaal automatisch, door de library die ik gebruik)
De crop aspect ratio (per as, op een schaal van 10) wordt berekend met de formule
De juiste aspectratio voor de uiteindelijke afbeelding moet dus 1440/4096 x 10 = 3,515625 zijn. (de max texture size is tijdens deze berekening nog niet bekend)
Om de gecroppte afbeelding te berekenen doet de library dit:
Hier is een lijst met alle waardes tijdens runtime:
De afbeelding wordt dus gecropped naar een resolutie van 3276.8 x 1727.9999. Dit moet 1440x720 zijn (we zitten er ietsje vanaf )
Hoe kom ik op deze resolutie??
Moet ik de aspect ratio van de crop size berekenen met de max texture size? Of hoef ik daar geen rekening mee de houden?
Het zou top zijn als iemand me hierbij kon helpen!
Bedankt,
Tim
Ik heb een probleem met betrekking tot het schalen van een afbeelding.
De afbeelding heeft een resolutie van 4096 x 2160. Omdat de afbeelding in een ImageView wordt geladen (waarbij een Bitmap texture wordt gebruikt) heeft deze texture een maximale grootte. Dit weet mijn app (hij haalt dit op). Omdat de max. grootte niet mag worden overschreden, wordt de afbeelding verkleint als dit nodig is.
De HTC One X heeft een max. texture size van 2048 x 2048, de afbeelding wordt dus 2 keer verkleint (de breedte en de hoogte om de aspect ratio te behouden). De originele bitmap van 4096 x 2160 wordt wel bewaard, omdat er vanuit deze bitmap "gecropped" moet worden (zo blijft de kwaliteit behouden).
Dus even ter samenvatting. De bitmap die in de ImageView wordt geladen heeft een resolutie van 2048 bij 1080, en de originele afbeelding heeft een resolutie van 4096 x 2160.
Omdat de afbeelding niet in zijn volledige resolutie in de imageView past, wordt deze (!dit is dus de afbeelding met een resolutie van 2048 x 1080!) nog een keer verkleint (dit gebeurd allemaal automatisch, door de library die ik gebruik)
De crop aspect ratio (per as, op een schaal van 10) wordt berekend met de formule
Code:
public double calculateAspectRatio(int desiredPixelCount, int originalPixelCount) {
return (double) (((double) desiredPixelCount / (double) originalPixelCount) * 10);
}
De juiste aspectratio voor de uiteindelijke afbeelding moet dus 1440/4096 x 10 = 3,515625 zijn. (de max texture size is tijdens deze berekening nog niet bekend)
Om de gecroppte afbeelding te berekenen doet de library dit:
Code:
/**
* Gets the cropped image based on the current crop window.
*
* @return a new Bitmap representing the cropped image
*/
public Bitmap getCroppedImage() {
final Rect displayedImageRect = ImageViewUtil.getBitmapRectCenterInside(mBitmap, mImageView);
System.out.println("Times smaller = " + timesSmaller); // timesSmaller is de verhouding tussen de maximale grootte afbeelding en de originele afbeelding
// Get the scale factor between the actual Bitmap dimensions and the
// displayed dimensions for width.
final float actualImageWidth = mBitmap.getWidth();
final float displayedImageWidth = displayedImageRect.width();
final float scaleFactorWidth = (actualImageWidth / displayedImageWidth);
// Get the scale factor between the actual Bitmap dimensions and the
// displayed dimensions for height.
final float actualImageHeight = mBitmap.getHeight();
final float displayedImageHeight = displayedImageRect.height();
final float scaleFactorHeight = (actualImageHeight / displayedImageHeight);
// Get crop window position relative to the displayed image.
final float cropWindowX = Edge.LEFT.getCoordinate() - displayedImageRect.left;
final float cropWindowY = Edge.TOP.getCoordinate() - displayedImageRect.top;
final float cropWindowWidth = Edge.getWidth();
final float cropWindowHeight = Edge.getHeight();
// Scale the crop window position to the actual size of the Bitmap.
final float actualCropX = cropWindowX * scaleFactorWidth;
final float actualCropY = cropWindowY * scaleFactorHeight;
final float actualCropWidth = cropWindowWidth * scaleFactorWidth;
final float actualCropHeight = cropWindowHeight * scaleFactorHeight;
// Crop the subset from the original Bitmap.
final Bitmap croppedBitmap = Bitmap.createBitmap(mBitmap,
(int) actualCropX,
(int) actualCropY,
(int) actualCropWidth,
(int) actualCropHeight);
return croppedBitmap;
}
Hier is een lijst met alle waardes tijdens runtime:
Code:
timesSmaller = 2
actualImageWidth = 4096.0
displayedImageWidth = 720.0
scaleFactorWidth = 5.688889
actualImageHeight = 2160.0
displayedImageHeight = 380.0
scaleFactorHeight = 5.6842103
cropWindowX = 72.0
cropWindowY = 70.0
cropWindowWidth = 576.0
cropWindowHeight = 304.0
actualCropX = 409.6
actualCropY = 397.8947
actualCropWidth = 3276.8
actualCropHeight = 1727.9999
De afbeelding wordt dus gecropped naar een resolutie van 3276.8 x 1727.9999. Dit moet 1440x720 zijn (we zitten er ietsje vanaf )
Hoe kom ik op deze resolutie??
Moet ik de aspect ratio van de crop size berekenen met de max texture size? Of hoef ik daar geen rekening mee de houden?
Het zou top zijn als iemand me hierbij kon helpen!
Bedankt,
Tim
Laatst bewerkt: