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

ARCore项目调用getRGB获取图像坐标颜色报错的解决方法

问题

我需要获取ARCore项目中图像指定坐标(x,y)的颜色值。项目通过克隆ARCore Android SDK仓库得到,当前持有一个图像对象:

Image depthImage = mActivityTestRule.getActivity().getDepthImage();

我尝试了两种方案,但均遇到getRGB方法无法识别的问题:

方案一

int clr = depthImage.getRGB(x, y);
int red =   (clr & 0x00ff0000) >> 16;
int green = (clr & 0x0000ff00) >> 8;
int blue =   clr & 0x000000ff;
System.out.println("Red Color value = " + red);
System.out.println("Green Color value = " + green);
System.out.println("Blue Color value = " + blue);

Android Studio中getRGB标红且无修复建议,尝试导入java.awt.image.BufferedImage失败。

方案二

Color mycolor = new Color(img.getRGB(x, y));
int red = mycolor.getRed();
int green = mycolor.getGreen();
int blue = mycolor.getBlue();
int alpha = mycolor.getAlpha();

同样出现getRGB无法识别的问题。

附加信息

导入语句

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf;
import static org.junit.Assert.assertTrue;

import java.awt.Image;      //Error: Cannot resolve symbol 'Image'

import android.graphics.Bitmap;
import android.graphics.Color;
import android.media.Image;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ImageView;

import androidx.test.espresso.ViewInteraction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.uiautomator.UiDevice;

import com.google.ar.core.Anchor;
import com.google.ar.core.examples.java.helloar.HelloArActivity;
import com.google.ar.core.examples.java.helloar.R;
import com.google.ar.core.examples.java.helloar.WrappedAnchor;

import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

build.gradle(:app)配置

apply plugin: 'com.android.application'

android {
    compileSdkVersion 32
    defaultConfig {
        applicationId "com.google.ar.core.examples.java.helloar"

        // AR Optional apps must declare minSdkVersion >= 14.
        // AR Required apps must declare minSdkVersion >= 24.
        minSdkVersion 24
        targetSdkVersion 32
        versionCode 1
        versionName '1.0'

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"//
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    // ARCore (Google Play Services for AR) library.
    implementation 'com.google.ar:core:1.34.0'

    // Obj - a simple Wavefront OBJ file loader
    implementation 'de.javagl:obj:0.2.1'

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'

    implementation 'androidx.test.ext:junit:1.1.3'
    implementation 'androidx.test.espresso:espresso-core:3.4.0'

    androidTestImplementation 'androidx.test:runner:1.0.1'
    implementation 'com.android.support.test:rules:1.0.2'

    implementation 'androidx.test.uiautomator:uiautomator:2.2.0'//
}

解决方案

核心问题是你使用的android.media.Image类本身没有getRGB方法,之前找到的方案都是针对java.awt.image.BufferedImage或AndroidBitmap类的,而ARCore深度图像属于Image类型,需要转换或直接解析像素数据。

方法一:转换为Bitmap后获取颜色

先将Image转为Bitmap,再用getPixel方法获取指定坐标颜色:

// 获取深度图像
Image depthImage = mActivityTestRule.getActivity().getDepthImage();
// 转为Bitmap
Bitmap bitmap = imageToBitmap(depthImage);

// 获取指定坐标颜色
int color = bitmap.getPixel(x, y);
int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);
int alpha = Color.alpha(color);

// 辅助转换方法
private Bitmap imageToBitmap(Image image) {
    Image.Plane[] planes = image.getPlanes();
    ByteBuffer buffer = planes[0].getBuffer();
    byte[] data = new byte[buffer.capacity()];
    buffer.get(data);
    return BitmapFactory.decodeByteArray(data, 0, data.length);
}

需额外导入android.graphics.BitmapFactory。

方法二:直接解析Image像素缓冲区

无需转换为Bitmap,直接读取图像平面数据,根据格式计算像素位置:

Image depthImage = mActivityTestRule.getActivity().getDepthImage();
Image.Plane plane = depthImage.getPlanes()[0];
ByteBuffer buffer = plane.getBuffer();

// 获取图像参数
int width = depthImage.getWidth();
int height = depthImage.getHeight();
int pixelStride = plane.getPixelStride();
int rowStride = plane.getRowStride();
int rowPadding = rowStride - pixelStride * width;

// 计算目标像素在缓冲区的位置
int bufferPosition = y * rowStride + x * pixelStride;

// 以RGBA_8888格式为例解析颜色
int red = buffer.get(bufferPosition) & 0xFF;
int green = buffer.get(bufferPosition + 1) & 0xFF;
int blue = buffer.get(bufferPosition + 2) & 0xFF;
int alpha = buffer.get(bufferPosition + 3) & 0xFF;

注意:ARCore深度图像格式可能为DEPTH16或RGBA_8888,需先通过depthImage.getFormat()确认格式,再调整解析逻辑。

额外注意事项

  1. 删除无效导入:移除import java.awt.Image;,Android平台不支持AWT库,这是导入报错的原因。
  2. 坐标校验:确保(x,y)在图像宽高范围内,避免数组越界异常。

内容的提问来源于stack exchange,提问作者Borja Davó

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:50:27