Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用android ndk使图像变灰_Android_C++_C_Android Ndk - Fatal编程技术网

无法使用android ndk使图像变灰

无法使用android ndk使图像变灰,android,c++,c,android-ndk,Android,C++,C,Android Ndk,我是android ndk的新手。我已经开始通过以下示例学习图像处理 《喧闹》和《IBM博客》。我正在尝试使图像变灰。 这是我正在使用的代码 所示布局的xml文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" androi

我是android ndk的新手。我已经开始通过以下示例学习图像处理 《喧闹》和《IBM博客》。我正在尝试使图像变灰。 这是我正在使用的代码

所示布局的xml文件

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"  
  >
    <ImageView
      android:id="@+id/gimageView1"
      android:layout_width="400px"
      android:src="@drawable/wallace"
      android:layout_height="266px"
    />

    <Button
      android:id="@+id/gbutton"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="Go Gray"
    />

    <ImageView
      android:id="@+id/gimageView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
    />
  </LinearLayout>
这是我为灰显逻辑编写代码的.c文件

/*
convertToGray
Pixel operation
*/
JNIEXPORT void JNICALL Java_com_example_GrayClass_goGrayWithNative(JNIEnv
* env, jobject  obj, jobject bitmapcolor,jobject bitmapgray)
{
    AndroidBitmapInfo  infocolor;
    void*              pixelscolor;
    AndroidBitmapInfo  infogray;
    void*              pixelsgray;
    int                ret;
    int             y;
    int             x;

    if ((ret = AndroidBitmap_getInfo(env, bitmapcolor, &infocolor)) < 0) {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return;
    }

    if ((ret = AndroidBitmap_getInfo(env, bitmapgray, &infogray)) < 0) {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return;
    }

    if (infocolor.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
        LOGE("Bitmap format is not RGBA_8888 !");
        return;
    }


LOGE("Bitmap format is not RGBA_8888 !====%d==", infocolor.format ) ;




    if ((ret = AndroidBitmap_lockPixels(env, bitmapcolor, &pixelscolor)) < 0) {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
    }

    if ((ret = AndroidBitmap_lockPixels(env, bitmapgray, &pixelsgray)) < 0) {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
    }


    // modify pixels with image processing algorithm
    LOGI("unlocking pixels height = %d",infocolor.height);
    for(y=0;y<infocolor.height;y++) {
    LOGI("unlocking pixels height = %d",infocolor.width);
        argb * line = (argb *) pixelscolor;
        uint8_t * grayline = (uint8_t *) pixelsgray;

        for(x=0;x<infocolor.width;x++) {

            grayline[x] = 0.3 * line[x].red + 0.59 * line[x].green + 0.11*line[x].blue;
        }
        pixelscolor = (char *)pixelscolor + infocolor.stride;
        pixelsgray = (char *) pixelsgray + infogray.stride;
    }

    LOGI("unlocking pixels");
    AndroidBitmap_unlockPixels(env, bitmapcolor);
    AndroidBitmap_unlockPixels(env, bitmapgray);


}
/*
转换射线
像素运算
*/
JNIEXPORT void JNICALL Java_com_示例_GrayClass_goGrayWithNative(JNIEnv
*环境、作业对象、作业对象位图颜色、作业对象位图灰色)
{
AndroidBitmapInfo信息颜色;
void*像素颜色;
AndroidBitmapInfo信息灰色;
void*像素射线;
int ret;
int-y;
int x;
if((ret=AndroidBitmap_getInfo(env、bitmapcolor和infocolor))<0){
LOGE(“AndroidBitmap_getInfo()失败!错误=%d”,ret);
回来
}
if((ret=AndroidBitmap_getInfo(env、bitmapgray和infogray))<0){
LOGE(“AndroidBitmap_getInfo()失败!错误=%d”,ret);
回来
}
如果(infocolor.format!=ANDROID\u位图\u格式\u RGBA\u 8888){
LOGE(“位图格式不是RGBA_8888!”);
回来
}
LOGE(“位图格式不是RGBA_8888!==%d==”,infocolor.format);
if((ret=AndroidBitmap_lockPixels(env、bitmapcolor和pixelscolor))<0){
LOGE(“AndroidBitmap_lockPixels()失败!错误=%d”,ret);
}
if((ret=AndroidBitmap_lockPixels(env、bitmapgray和pixelsgray))<0){
LOGE(“AndroidBitmap_lockPixels()失败!错误=%d”,ret);
}
//用图像处理算法修改像素
LOGI(“解锁像素高度=%d”,infocolor.height);

就(y=0;y而言,据我所知,Android位图只能处理每像素32位的图像,因此您必须将灰度结果存储在彩色图像的位置,通过在红色、绿色和蓝色通道中重复灰度值,将alpha通道设置为完全不透明

顺便说一句,如果你分析你的屏幕截图,你会发现灰度版的宽度正好是彩色图像的1/4,这往往表明这就是问题所在

在C++部分中使用此代码应该执行以下工作:

// modify pixels with image processing algorithm
LOGI("unlocking pixels height = %d",infocolor.height);
for(y=0;y<infocolor.height;y++) {
LOGI("unlocking pixels height = %d",infocolor.width);
    argb * line = (argb *) pixelscolor;
    argb * grayline = (argb *) pixelsgray;

    for(x=0;x<infocolor.width;x++) {

        uint8_t v = 0.3 * line[x].red + 0.59 * line[x].green + 0.11*line[x].blue;
        grayline[x].red = v;
        grayline[x].green = v;
        grayline[x].blue = v;
        grayline[x].alpha = line[x].alpha
    }
    pixelscolor = (char *)pixelscolor + infocolor.stride;
    pixelsgray = (char *) pixelsgray + infogray.stride;
}
//使用图像处理算法修改像素
LOGI(“解锁像素高度=%d”,infocolor.height);

就(y=0;y而言,据我所知,Android位图只能处理每像素32位的图像,因此您必须将灰度结果存储在彩色图像的位置,通过在红色、绿色和蓝色通道中重复灰度值,将alpha通道设置为完全不透明

顺便说一句,如果你分析你的屏幕截图,你会发现灰度版的宽度正好是彩色图像的1/4,这往往表明这就是问题所在

在C++部分中使用此代码应该执行以下工作:

// modify pixels with image processing algorithm
LOGI("unlocking pixels height = %d",infocolor.height);
for(y=0;y<infocolor.height;y++) {
LOGI("unlocking pixels height = %d",infocolor.width);
    argb * line = (argb *) pixelscolor;
    argb * grayline = (argb *) pixelsgray;

    for(x=0;x<infocolor.width;x++) {

        uint8_t v = 0.3 * line[x].red + 0.59 * line[x].green + 0.11*line[x].blue;
        grayline[x].red = v;
        grayline[x].green = v;
        grayline[x].blue = v;
        grayline[x].alpha = line[x].alpha
    }
    pixelscolor = (char *)pixelscolor + infocolor.stride;
    pixelsgray = (char *) pixelsgray + infogray.stride;
}
//使用图像处理算法修改像素
LOGI(“解锁像素高度=%d”,infocolor.height);

对于(Y=0;Y

我不能帮助NDK,但我确信你可以用普通的Android SDK创建一个灰色图像。

< P>我不能帮助你使用NDK,但是我很确定你可以用普通的Android SDK创建一个灰色的图像。< /P>谢谢你的宝贵回答。因为我不是一个C/C++的人,我不知道我怎么能把灰度结果存储在哪里呢?一个彩色图像,通过重复红色、绿色和蓝色通道中的灰度值,将alpha通道设置为完全不透明的。我的答案是推一些代码。我是一个C++爱好者,而不是一个C++迷,所以这可能需要一点调整,但我想我们离它不远。请保持我的位置。好的,谢谢。我会试试这个,让你知道进展。我只是有点好奇,灰线[x]=0.3*line[x]。红色+0.59*line[x]。绿色+0.11*line[x]之间有什么区别.blue;然后声明v并将其分配给所有通道?我对反转有问题,当图像只有1/4反转时,这可能会有所帮助吗?@mbrenon我对本机函数做了一些小更改,它返回了一个具有灰度效果的图像,但图像失去了亮度。我无法找出问题所在。你能帮我摆脱这个吗?谢谢你的宝贵回答。因为我不是C/C++的人,我不知道我怎么能把灰度结果存储在一个彩色图像里,通过重复红色、绿色和蓝色通道中的灰度值,把alpha通道设置成完全不透明的。我的答案是推一些代码。我更喜欢C上瘾。而不是C++风扇,所以这可能需要一点调整,但我想我们离它不远。请保持我的位置!好的,谢谢。我会试试这个,让你知道进展。@ MbreNon M有点好奇,GreayLe[x]=0.3×行[X]。红色+ 0.59×线[X]。绿色+ 0.11 *线[X].blue;然后声明v并将其分配给所有通道?我对反转有问题,当图像只有1/4反转时,这可能会有所帮助吗?@mbrenon我对本机函数做了一些小更改,它返回了一个具有灰度效果的图像,但图像失去了亮度。我无法找出问题所在。你能帮我把这个处理掉吗?