Android Studio中TIF图片能否正常显示?加载失败求助
Android真机加载TIF图片不显示问题排查与解决
问题背景
需在Android Studio中将本地.tif格式图片加载到ImageView显示,后续还要通过Python实现Gabor滤波等图像变换,但目前真机端无法显示选中的TIF图片。
使用工具
- TIF图片加载库:Android-TiffBitmapFactory
- Android运行Python工具:Chaquopy
现有代码
MainActivity.java
import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.Manifest; import android.annotation.SuppressLint; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.chaquo.python.PyObject; import com.chaquo.python.Python; import com.chaquo.python.android.AndroidPlatform; import org.beyka.tiffbitmapfactory.TiffBitmapFactory; import java.io.FileNotFoundException; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { TextView textView8; //private static final int Read_Permission= 101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button gallery = findViewById(R.id.gallery); gallery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent,3); } }); /*if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Read_Permission); } */ textView8 = (TextView) findViewById(R.id.textView8); if(!Python.isStarted()){ Python.start(new AndroidPlatform(this)); } Python py = Python.getInstance(); PyObject pyobj = py.getModule("hello"); PyObject obj = pyobj.callAttr("main"); textView8.setText(obj.toString()); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK && data != null){ try { ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(data.getData(), "r"); Bitmap bmp = TiffBitmapFactory.decodeFileDescriptor(parcelFileDescriptor.getFd()); ImageView imageView = findViewById(R.id.imageView); imageView.setImageBitmap(bmp); } catch (FileNotFoundException e) { e.printStackTrace(); } // Uri selectedImage = data.getData(); // ImageView imageView = findViewById(R.id.imageView); // imageView.setImageURI(selectedImage); } } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" tools:ignore="MissingClass"> <ImageView android:id="@+id/imageView" android:layout_width="250dp" android:layout_height="250dp" android:layout_centerInParent="true" tools:layout_editor_absoluteX="80dp" tools:layout_editor_absoluteY="194dp" tools:ignore="MissingConstraints" /> <Button android:id="@+id/gallery" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Pick Image" tools:ignore="MissingConstraints" tools:layout_editor_absoluteX="125dp" tools:layout_editor_absoluteY="556dp" /> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="33dp" android:text="TextView" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.436" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/pick" app:layout_constraintVertical_bias="0.2" tools:ignore="MissingConstraints" /> </androidx.constraintlayout.widget.ConstraintLayout>
问题排查与解决步骤
恢复存储权限申请
你注释掉了存储权限代码,Android 10及以上版本访问外部图片必须申请READ_EXTERNAL_STORAGE(Android 13+需用READ_MEDIA_IMAGES),取消注释并补充权限回调:private static final int READ_PERMISSION = 101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 检查并申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_PERMISSION); } // ... 其余代码 } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == READ_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予成功,可正常访问图片 } else { // 权限被拒绝,提示用户开启权限 } } }验证TIF图片解码结果
添加日志判断解码是否成功,排查图片格式兼容性问题:Bitmap bmp = TiffBitmapFactory.decodeFileDescriptor(parcelFileDescriptor.getFd()); if (bmp == null) { Log.e("TIF_LOAD", "TIF图片解码失败"); } else { Log.d("TIF_LOAD", "Bitmap解码成功:" + bmp.getWidth() + "x" + bmp.getHeight()); imageView.setImageBitmap(bmp); }若解码失败,可尝试配置解码参数处理多页或特殊压缩的TIF:
TiffBitmapFactory.Options options = new TiffBitmapFactory.Options(); options.inJustDecodeBounds = false; options.inSampleSize = 1; // 可根据图片大小调整采样率 Bitmap bmp = TiffBitmapFactory.decodeFileDescriptor(parcelFileDescriptor.getFd(), options);修复ImageView布局约束
XML中tools:ignore="MissingConstraints"会导致真机布局异常,修改为有效约束:<ImageView android:id="@+id/imageView" android:layout_width="250dp" android:layout_height="250dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.3" />关闭文件描述符避免泄漏
使用完ParcelFileDescriptor后及时关闭:try { ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(data.getData(), "r"); Bitmap bmp = TiffBitmapFactory.decodeFileDescriptor(parcelFileDescriptor.getFd()); // ... 设置图片 parcelFileDescriptor.close(); } catch (Exception e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者MOMO
相关产品推荐
相关产品推荐

