burmat
burmat

Reputation: 2548

Sizing ImageViews Based off of Image Size

I know that the title makes it sound like it is a duplicate, but I think I have a very specific situation here that I can't solve from all of my searches.

First, I have images that are specifically sized based off of a specific monitor (Yes, monitor. Not handheld device's screen). The images are based off of these specific settings:

Now, all of the images must be sized in millimeters (they are square images btw, so Height=Width). Using these specific settings as a determining factor, 1mm = 3.78px. So, my images are sized using this. For example, for an image to appear as 65mm, I size the images to 246px. I tested this in Photoshop using these settings, and measuring the image on the screen did in fact come out correct.

So now in my Android application, I load up these images into ImageViews to be displayed. This is where I am stuck. The device is an MDPI device. If I load the images into the MDPI drawables folder, the images appear too large on the monitor. Using my above example, I convert the Drawable to a Bitmap and dump the Height of the image to my log. This is correct and shows 246px, but for some reason it is measuring well over 85mm instead of 65mm.

If I load all of my images into the HDPI (yes, I know it is an mdpi device so it will be sized by the Android OS), the height of the image (using my example) dumps as 164px and appears at roughly 50mm. This is more explainable, but still I am still confused on how to get these images to appear as they did in Photoshop.

So my question is, what is the best way to programmatically size the ImageView to be the exact size of the image? For my example, I need to find out why my 246px square image (at 96ppi) is not showing up as 65mm like it should.

Because these ImageViews are generated programmatically, I have tried the following two things:

  1. Set the ImageView Height and Width (using LayoutParams) to the height of the image (246px). I did this thinking WRAP_CONTENT was not acting as it should.
  2. Used ImageView.ScaleType.CENTER to try and make sure the ImageView is sized exactly to the image.

Neither of these things seem to have effected the output.

UPDATES:

I have verified that my device is a MDPI device. This means that there is not DPI to PX conversion (or vice versa) necessary because of the 1:1 relationship. Somewhere, the sizes are being increased and I cannot determine where. As I indicated in the comments for the answer below, when I pull my Drawable and convert it to Bitmap, it pulls the EXACT pixel Height that I made it. I am starting to figure out the percentage of size difference from what it should be (65mm vs 85mm) and it works out to be 23.529%. I am scaling my bitmaps subtracting this value, but it ruins the quality of my image.

I am beginning to give up.

The device I am utilizing is an MK802III Rockchip Device (Amazon Link)

Upvotes: 3

Views: 380

Answers (2)

burmat
burmat

Reputation: 2548

I hate answering my own question, but I am just going to update everyone what I did. If someone comes up with a better solution, I am all ears. I had to force this along because I am on a tight deadline.

I created a dummy application that dumped boxes that I could measure. Using these, I determined that 1 millimeter is 3 density pixels. Let me repeat that, 1mm = 3dp.

Using this value, I resized all of my images (utilizing a PHP script) to this constraint. All of my images are appearing as normal. 195dp = 65mm, and it appears as such.

Like I said, any explanation as to why I had to do this and you get an upvote and answer.

Upvotes: 1

David Manpearl
David Manpearl

Reputation: 12656

Android modifies all images for display with the following formula:

px = dp * (dpi / 160)

Where "dpi" is the screen density in dots-per-inch of a device's display.

Additionally, Android looks through a hierarchy of drawable folders when deciding which image to display. As we all know, an HDPI device will use an image from the drawale-hdpi folder while an MDPI device will display the same named image from the drawable-mdpi directory.

However, when an MDPI device cannot find an image in the drawable-mdpi directory, it will eventually choose from the drawable-hdpi folder, but it will down-scale the image for display on the MDPI screen.

This explains why your image appears smaller when you saved it in the drawable-hdpi folder.

But, it does not explain why the image appears too large when correctly placed in the drawable-mdpi folder.

It so happens that:

65mm ~= 85mm * (120 / 160)

50mm ~= 85mm * (120 / 240)

This is the scaling that I would expect for your images if your device were LDPI (120dpi) instead of MDPI (160dpi) as reported.

Upvotes: 2

Related Questions