根据图片路径来获取图片的真实大小

本文介绍了一种通过JavaScript动态获取图片宽度和高度的方法。使用new Image()创建图片对象,并设置图片源路径,随后读取图片的宽度和高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        var image  = new Image();
        image.src  = path;
        var width  = image.width;
        var height = image.height;

其中 path表示图片路径

<think>我们正在处理一个关于在Android平台上获取图片真实高度的问题。根据用户的问题描述,他需要获取图片的实际高度。根据提供的引用内容,我们可以总结出几种方法: 1. **使用BitmapFactory.Options**(引用[1]):通过设置`BitmapFactory.Options`的`inJustDecodeBounds`属性为true,可以在不加载图片到内存的情况下获取图片的宽高。这是一种高效的方法,特别适用于大图片。2.**通过图片URL获取宽高**(引用[2]):这种方法涉及到从网络或本地URL获取图片,然后解码图片的边界。但引用中只提到了一个方法签名,具体实现可能需要使用`BitmapFactory.decodeStream`并设置`inJustDecodeBounds`为true。3.**获取缩略图**(引用[3]):但用户需要的是真实高度,而不是缩略图,所以这个方法可能不适用。4.**在View初始化后获取宽高**(引用[4]):如果图片已经显示在View上,我们可以在View完成布局后获取其高度。但用户可能没有显示图片,或者需要的是图片文件本身的高度,而不是显示的高度。 根据用户需求,他可能只需要图片文件的实际高度,而不需要将图片显示出来。因此,最直接的方法是使用`BitmapFactory.Options`来解码边界。 ###方法1:使用BitmapFactory.Options(资源文件)如果图片在res/drawable或res/mipmap中,可以使用以下代码:```javaBitmapFactory.Options options= newBitmapFactory.Options();options.inJustDecodeBounds= true; //只解码边界,不加载图片BitmapFactory.decodeResource(getResources(),R.drawable.your_image, options); intimageHeight= options.outHeight;int imageWidth =options.outWidth;```###方法2:使用BitmapFactory.Options(文件路径)如果图片在文件系统中:```javaStringpath= "your_image_path";BitmapFactory.Optionsoptions =new BitmapFactory.Options(); options.inJustDecodeBounds =true;BitmapFactory.decodeFile(path,options);int imageHeight =options.outHeight;int imageWidth =options.outWidth;``` ###方法3:使用BitmapFactory.Options(输入流,如网络图片) 如果是网络图片,我们可以通过URL获取输入流,然后解码: ```javaStringimgUrl ="http://example.com/image.jpg";try {URLurl =new URL(imgUrl);HttpURLConnection conn= (HttpURLConnection)url.openConnection();conn.setDoInput(true);conn.connect();InputStream input= conn.getInputStream();BitmapFactory.Options options= newBitmapFactory.Options();options.inJustDecodeBounds =true;BitmapFactory.decodeStream(input,null,options);intimageHeight= options.outHeight;int imageWidth =options.outWidth;input.close();} catch(Exceptione){e.printStackTrace(); }``` 注意:方法3中,我们只获取了边界,并没有实际下载整个图片数据(因为设置了`inJustDecodeBounds`为true,所以只会读取图片的元信息)。但是,需要注意的是,输入流需要支持mark/reset,或者我们可以将流复制到一个可以重置的流(如BufferedInputStream),但`decodeStream`方法对于网络流可能有限制。另一种做法是使用`URLConnection`获取内容长度,但获取图片宽高必须解析图片头,所以还是需要读取部分数据。 ###注意事项-以上方法获取的是图片的原始高度,不考虑显示时的缩放。-如果图片放在不同的drawable目录下(如drawable-hdpi),Android系统会根据设备DPI进行缩放,但使用`decodeResource`方法获取的高度是缩放后的吗?实际上,当使用`decodeResource`时,系统会根据设备DPI调整图片大小,所以获取的宽高可能是缩放后的。如果我们需要原始宽高,可以使用`inScaled`属性设置为false,或者使用`decodeFile`(如果图片在assets中,可以使用`decodeStream`并且不缩放)。 ###获取原始宽高(避免缩放) ```javaBitmapFactory.Optionsoptions =new BitmapFactory.Options(); options.inJustDecodeBounds =true;options.inScaled= false; //禁止缩放,这样获取的就是原始宽高BitmapFactory.decodeResource(getResources(), R.drawable.your_image,options);int originalImageHeight =options.outHeight;int originalImageWidth= options.outWidth; ```###总结根据用户需求,推荐使用`BitmapFactory.Options`并设置`inJustDecodeBounds=true`来获取图片的实际高度,同时注意是否需要原始尺寸(设置`inScaled=false`避免缩放)。 §§相关问题§§1.如何避免在获取图片宽高时加载整个图片到内存?2.在Android中,不同资源目录(如drawable-hdpi)中的图片获取到的宽高会受到设备DPI的影响吗?3.如何获取网络图片的宽高而不下载整个图片? 4.如果图片在Assets目录中,如何获取其宽高?</think>### Android 获取图片实际高度的方法 在 Android 中获取图片的实际高度(原始尺寸),推荐使用 **BitmapFactory.Options** 的 `inJustDecodeBounds` 模式,这种方法无需加载完整图片到内存,高效且安全。以下是具体实现: #### 方法 1:从资源文件获取(drawable/mipmap) ```java // 获取 drawable 资源的原始高度 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 只解析边界,不加载像素 // 解析资源(R.drawable.your_image) BitmapFactory.decodeResource(getResources(), R.drawable.your_image, options); int actualHeight = options.outHeight; // 实际高度 int actualWidth = options.outWidth; // 实际宽度 ``` #### 方法 2:从文件路径获取(SD卡/本地文件) ```java String filePath = "/sdcard/your_image.jpg"; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); int actualHeight = options.outHeight; ``` #### 方法 3:从网络 URL 获取(无需下载完整图片) ```java new Thread(() -> { try { URL url = new URL("https://example.com/your_image.jpg"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.connect(); InputStream input = conn.getInputStream(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(input, null, options); int actualHeight = options.outHeight; // 获取实际高度 input.close(); } catch (IOException e) { e.printStackTrace(); } }).start(); ``` #### 关键说明: 1. **`inJustDecodeBounds = true`** 只读取图片元数据(宽/高/MIME类型),不分配像素内存,适合大图处理[^1][^2]。 2. **DPI 适配问题** 从资源文件 (`decodeResource`) 获取的值会根据设备 DPI 自动缩放。若需原始尺寸: ```java options.inScaled = false; // 禁用缩放 ``` 3. **内存优化** 此方法仅消耗约 **4KB 内存**(VS 完整加载 1920x1080 图片需 8MB)[^1]。 #### 注意事项: - 资源文件方法需在主线程执行 - 网络请求需在子线程执行 - 实际显示高度受 `ImageView` 缩放影响,与原始高度可能不同 > 示例:获取 `R.drawable.logo` 的实际高度: > ```java > BitmapFactory.Options opts = new BitmapFactory.Options(); > opts.inJustDecodeBounds = true; > BitmapFactory.decodeResource(getResources(), R.drawable.logo, opts); > Log.d("ImageInfo", "原始高度: " + opts.outHeight + "px"); > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值