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()确认格式,再调整解析逻辑。
额外注意事项
- 删除无效导入:移除
import java.awt.Image;,Android平台不支持AWT库,这是导入报错的原因。 - 坐标校验:确保(x,y)在图像宽高范围内,避免数组越界异常。
内容的提问来源于stack exchange,提问作者Borja Davó
相关产品推荐
相关产品推荐

