Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】

介绍SubsamplingScaleImageView,一款专为Android设计的超大图片加载库,能有效避免OOM问题,并提供流畅的图片浏览体验。
部署运行你感兴趣的模型镜像


Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】


Android在加载或者处理超大巨型图片(x MB量级起步的图片)是一件非常需要小心谨慎的活儿,除了常规的OOM,其他需要处理的细节地方还很多,幸好开源社区github贡献了一套神器:SubsamplingScaleImageView(subsampling-scale-image-view),提供了一揽子完善的Android超大巨图的解决处理方案,为开发者解决处理加载超大巨型图的燃眉之急。
SubsamplingScaleImageView(subsampling-scale-image-view)其在github上的项目主页:
https://github.com/davemorrissey/subsampling-scale-image-view
需要注意的是,subsampling-scale-image-view在其项目代码中又引用了github上的另外一个开源项目:RapidDecoder,RapidDecoder在github上的项目主页是:
https://github.com/suckgamony/RapidDecoder
开发者在自己的项目中使用SubsamplingScaleImageView(subsampling-scale-image-view)库的时候,还还需要再把RapidDecoder导入。简单期间,可以将RapidDecoder的链接路径https://github.com/suckgamony/RapidDecoder/tree/master/library/src/main/java 目录下全部源代码复制到SubsamplingScaleImageView(subsampling-scale-image-view)代码包里面即可。
接下来开始使用SubsamplingScaleImageView(subsampling-scale-image-view)。
以加载一个超大、超高清分辨率的中国地图china.jpg为例(像素分辨率5484 * 4066,大小计5.04MB)。
步骤:
(1) 将china.jpg放置在工程的assets目录下。
(2) 用subsampling-scale-image-view自身提供的ImageSource.asset读取该china.jpg。
(3) 然后将其作为数据源载入SubsamplingScaleImageView。
代码,测试的主Activity MainActivity.java:

package zhangphil.demo;

import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

	private	SubsamplingScaleImageView mSubsamplingScaleImageView;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mSubsamplingScaleImageView=(SubsamplingScaleImageView) findViewById(R.id.subsamplingScaleImageView);
		mSubsamplingScaleImageView.setImage(ImageSource.asset("china.jpg"));
	}
}

MainActivity.java需要的布局文件activity_main.xml,很简单,只有一个SubsamplingScaleImageView:

<?xml version="1.0" encoding="utf-8"?>
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/subsamplingScaleImageView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

像通常一个超大巨图需要的随手指拖曳查看浏览、双击放大或缩小等常规图片浏览需要的功能,SubsamplingScaleImageView本身已经自带,开发者无需重复写代码完成。


顺道附录我曾经写过的其他关于Android图片处理/加载的部分文章:
【1】《Android手势缩放图片以及图片黏贴在手指随手势移动》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/43965701
【2】《Android大图片之缩略图,以及对原图按照指定宽高裁剪成缩略图》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/47857495
【3】《Android读取assets目录下文件数据内容》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/48247541
【4】《Android加载大图Bitmap发生OOM(Out Of Memmory Error)解决方案》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/48130053
【5】《Android圆形头像图Circle ImageView》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/44960551
【6】《Android View转换成图片保存》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/44217539
【7】《Android为图片添加水印文字》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/44200207
【8】《Android Drawable 转化成 Bitmap》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/43767535
【9】《Android设置头像,手机拍照或从本地相册选取图片作为头像》链接地址:http://blog.youkuaiyun.com/zhangphil/article/details/44829747

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

1g++ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -pthread -shared -B /home/zzh/anaconda3/envs/sghr6/compiler_compat -L/home/zzh/anaconda3/envs/sghr6/lib -Wl,-rpath=/home/zzh/anaconda3/envs/sghr6/lib -Wl,--no-as-needed -Wl,--sysroot=/ /home/zzh/framework2/SecondFeature/GeoFeature/build/temp.linux-x86_64-cpython-38/extensions/cpu/grid_subsampling/grid_subsampling.o /home/zzh/framework2/SecondFeature/GeoFeature/build/temp.linux-x86_64-cpython-38/extensions/cpu/grid_subsampling/grid_subsampling_cpu.o /home/zzh/framework2/SecondFeature/GeoFeature/build/temp.linux-x86_64-cpython-38/extensions/cpu/radius_neighbors/radius_neighbors.o /home/zzh/framework2/SecondFeature/GeoFeature/build/temp.linux-x86_64-cpython-38/extensions/cpu/radius_neighbors/radius_neighbors_cpu.o /home/zzh/framework2/SecondFeature/GeoFeature/build/temp.linux-x86_64-cpython-38/extensions/pybind.o -L/home/zzh/anaconda3/envs/sghr6/lib/python3.8/site-packages/torch/lib -L/usr/local/cuda-11.1/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda -o build/lib.linux-x86_64-cpython-38/GeoFeature/ext.cpython-38-x86_64-linux-gnu.so copying build/lib.linux-x86_64-cpython-38/GeoFeature/ext.cpython-38-x86_64-linux-gnu.so -> GeoFeature error: could not create 'GeoFeature/ext.cpython-38-x86_64-linux-gnu.so': No such file or directory setup( name='GeoFeature', version='1.0.0', ext_modules=[ CUDAExtension( name='GeoFeature.ext', sources=[ 'extensions/cpu/grid_subsampling/grid_subsampling.cpp', 'extensions/cpu/grid_subsampling/grid_subsampling_cpu.cpp', 'extensions/cpu/radius_neighbors/radius_neighbors.cpp', 'extensions/cpu/radius_neighbors/radius_neighbors_cpu.cpp', 'extensions/pybind.cpp', ], # 确保这里使用了正确的路径 build_l(setup源码),setup实在GeoFeature文件夹下的怎么解决
03-24
<think>嗯,用户遇到了在构建GeoFeature扩展时出现的'No such file or directory'错误,尤其是在运行setup.py时涉及CUDAExtension和C++源文件编译。我需要仔细分析可能的原因,然后给出解决方案。 首先,用户提到错误信息是路径问题导致的无法创建文件或目录。这可能涉及到几个方面。根据引用[2]中的情况,权限不足可能导致无法创建目录。这时候需要检查是否有足够的权限,或者尝试以管理员权限运行命令。例如,使用sudo或者以管理员身份运行终端。 接下来,路径配置错误也是一个可能的原因。在setup.py中,如果源文件的路径不正确,或者CUDAExtension中的路径设置有问题,就会导致找不到文件。用户需要检查所有文件路径是否准确,特别是相对路径是否正确。例如,使用os.path.abspath和os.path.join来确保绝对路径正确。比如,将源文件路径改为os.path.join(os.path.dirname(__file__), 'src', 'kernel.cu'),这样可以避免相对路径的问题。 另外,缺少依赖库或工具也可能导致问题。例如,CUDA工具链是否正确安装,gcc/g++版本是否兼容,以及Python的开发头文件是否存在。用户需要确认这些依赖是否安装正确,并更新到兼容的版本。引用[4]中提到缺少gdal-config的问题,类似地,如果CUDA的路径没有正确配置,也会导致找不到文件。因此,检查CUDA_HOME环境变量是否设置正确,并确保nvcc编译器在系统路径中。 还有,构建目录权限的问题,用户需要确保构建目录(比如build或dist)有写入权限。有时候临时目录权限不足,可以尝试删除旧的构建目录重新生成,或者更改目录权限。引用[1]建议手动创建缺失的目录,用户也可以尝试在运行setup.py之前手动创建必要的目录结构,以避免自动创建失败。 此外,绝对路径的使用可能更可靠,特别是在涉及多层目录结构时。用户应该在setup.py中使用绝对路径来指定源文件和包含目录,避免相对路径导致的歧义。例如,使用os.path.abspath来获取当前文件的绝对路径,然后基于此构建其他文件的路径。 最后,如果问题依然存在,用户需要检查详细的错误日志,确定具体是哪个文件或目录无法访问。根据引用[3]中的例子,检查配置文件中的路径是否正确,可能有助于定位问题。此外,查看完整的错误日志中的行号和具体文件,可以帮助进一步排查路径配置或权限问题。 总结可能的解决方案包括:检查权限、修正文件路径、确保依赖安装正确、使用绝对路径、手动创建目录等。用户需要逐一排查这些可能性,并根据具体情况调整setup.py的配置。</think>### 解决构建GeoFeature扩展时的路径与权限问题 #### 1. **检查文件路径配置** - **问题**: `CUDAExtension`中指定的C++/CUDA源文件路径错误,导致编译器找不到文件。 - **修复方法**: 使用绝对路径代替相对路径,确保路径指向正确位置。例如: ```python from setuptools import setup from torch.utils.cpp_extension import BuildExtension, CUDAExtension import os ext_modules = [ CUDAExtension( 'geofeature', sources=[ os.path.abspath('src/cuda/kernel.cu'), # 确保路径正确 os.path.abspath('src/cpp/utils.cpp') ], include_dirs=[os.path.abspath('include')] ) ] ``` 引用类似问题中路径配置的调整方法[^4]。 #### 2. **处理权限问题** - **问题**: 用户权限不足,无法在目标目录创建文件。 - **修复方法**: - **临时方案**: 使用管理员权限运行命令: ```bash sudo python setup.py build_ext --inplace ``` - **长期方案**: 修改目标目录权限,或指定用户有权限的安装路径: ```bash python setup.py install --user # 安装到用户目录 ``` 参考权限问题的典型解决方案[^2]。 #### 3. **验证CUDA工具链** - **问题**: CUDA编译器 (`nvcc`) 未正确安装或环境变量未配置。 - **修复方法**: - 确认CUDA安装路径(如`/usr/local/cuda`)并添加到环境变量: ```bash export CUDA_HOME=/usr/local/cuda export PATH=$CUDA_HOME/bin:$PATH ``` - 检查`nvcc`是否可执行: ```bash nvcc --version ``` #### 4. **手动创建缺失目录** - **问题**: 构建过程中临时目录(如`build/`)不存在或无法创建。 - **修复方法**: - 手动创建目录结构后再编译: ```bash mkdir -p build/temp.linux-x86_64-3.8/geofeature python setup.py build_ext --inplace ``` 参考目录创建问题的直接处理方式[^1]。 #### 5. **检查编译器兼容性** - **问题**: C++编译器版本与CUDA不兼容。 - **修复方法**: - 在`setup.py`中指定兼容的编译器标志: ```python extra_compile_args={ 'cxx': ['-std=c++14'], 'nvcc': ['-arch=sm_75'] # 根据GPU架构调整 } ``` --- ### 操作步骤总结 1. **修正路径**: 使用`os.path.abspath`确保所有路径为绝对路径。 2. **提升权限**: 以管理员身份运行或修改目录权限。 3. **验证CUDA**: 确保`nvcc`可访问且版本匹配。 4. **手动建目录**: 提前创建缺失的构建目录。 5. **重新编译**: ```bash rm -rf build/ # 清除旧构建 python setup.py build_ext --inplace ``` ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值