2012-10-19 57 views
2

变灰图像我是Android新手ndk.I已开始通过图像处理示例012xxruckus和IBM博客学习。我正在尝试使图像灰白。 这里是我使用无法使用Android ndk

所显示

<?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> 

布局和Java代码的XML文件的代码

package com.example; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 

public class GrayClass extends Activity { 
    private ImageView imageView; 
     private Bitmap bitmap; 
     private Button button; 
     private Bitmap original; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.gray); 
     original = BitmapFactory.decodeResource(getResources(), R.drawable.wallace); 
     bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.wallace); 
     button = (Button) findViewById(R.id.gbutton); 
     imageView = (ImageView) findViewById(R.id.gimageView2); 
     button.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      ((ImageView)findViewById(R.id.gimageView1)).setVisibility(View.GONE); 
      button.setVisibility(View.GONE); 
       GoGray(); 

     } 


    }); 

    } 

    private void GoGray() { 
     Bitmap oBitmap = original.copy(Bitmap.Config.ARGB_8888, true); 
     Bitmap gBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 

     goGrayWithNative(oBitmap,gBitmap); 
     imageView.setImageBitmap(gBitmap); 

    } 

    public native void goGrayWithNative(Bitmap bmp1, Bitmap bmp2); 
} 

这里是我写的.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); 


} 

该代码运行良好,但输出我是gett ING是不同的看到图片enter image description here

点击GoGray按钮后,它显示了这样的形象

enter image description here

谁能告诉我哪里有错误是什么?

回答

4

据我所知,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; 
} 

希望这有助于!

+0

感谢您的宝贵回复。因为我不是一个C/C++的家伙,我不明白我如何通过重复红色,绿色和蓝色通道中的灰度值来将灰度结果存储为彩色图像,将alpha通道设置为完全不透明? – anshul

+0

编辑我的答案推送一些代码。我比C++粉丝更像C瘾,所以这可能需要稍微调整,但我想我们离它不远。让我张贴! – mbrenon

+0

好的,谢谢我会试试这个,让你知道进度。 – anshul

0

我无法帮助您使用NDK,但我确定您可以使用普通Android SDK创建灰色图像。