You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

问题排查与解决步骤

  1. 恢复存储权限申请
    你注释掉了存储权限代码,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 {
                // 权限被拒绝,提示用户开启权限
            }
        }
    }
    
  2. 验证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);
    
  3. 修复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" />
    
  4. 关闭文件描述符避免泄漏
    使用完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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:55:19