4

在我的應用程序中,我希望能夠更改ImageView中圖像的亮度。我爲此使用了seekbar。當我向右移動滾動條時,它確實改變了圖像的亮度,但是當我想要降低亮度並向左移動時,亮度不斷增加,圖像變得幾乎變白。此外,使用seekbar作爲用戶也非常困難。它移動不太順暢。有人可以幫助我改進我的代碼,因爲我是編程初學者。 This is how it looks when scrollbar of seekbar moved right (to increase brightness).This is how it looks when scrollbar of seekbar moved left(to decrease brightness).即使移動Seekbar的滾動條,圖像的亮度也會不斷增加

下面是部分代碼:

上的按鈕 「過濾器」 的點擊:

btn_filter.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     Log.e("EditPhoto", "counter value = " + counter); 
     counter++; 
     sbarBrightness = (SeekBar) findViewById(R.id.seekBarForBrightness); 
     if (counter % 2 == 0) { 
      sbarBrightness.setVisibility(View.INVISIBLE); 
     } else { 
      sbarBrightness.setVisibility(View.VISIBLE); 
     } 
    sbarBrightness.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
    int brightness; 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean 
              fromUser) { 

    brightness = progress; 
    imageBitmap = doBrightness(imageBitmap, brightness); 
    putGestureImageOnScreen(imageBitmap); 
} 
    }); 
    } 
}); 

public static Bitmap doBrightness(Bitmap src, int value) { 
    Log.e("Brightness", "Changing brightnhjh"); 

    int width = src.getWidth(); 
    int height = src.getHeight(); 
    Bitmap bmout = Bitmap.createBitmap(width, height, src.getConfig()); 
    int A, R, G, B; 
    int pixel; 
    for (int i = 0; i < width; ++i) { 
     for (int j = 0; j < height; ++j) { 
      pixel = src.getPixel(i, j); 
      A = Color.alpha(pixel); 
      R = Color.red(pixel); 
      G = Color.green(pixel); 
      B = Color.blue(pixel); 
      R += value; 
      if (R > 255) { 
       R = 255; 
      } else if (R < 0) { 
       R = 0; 
      } 
      G += value; 
      if (G > 255) { 
       G = 255; 
      } else if (G < 0) { 
       G = 0; 
      } 
      B += value; 
      if (B > 255) { 
       B = 255; 
      } else if (B < 0) { 
       B = 0; 
      } 
      bmout.setPixel(i, j, Color.argb(A, R, G, B)); 
     } 
    } 
    return bmout; 

} 

搜索欄的聲明佈局:

<SeekBar 
    android:id="@+id/seekBarForBrightness" 
    android:layout_width="500dp" 
    android:layout_height="50dp" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    style="@style/tallerBarStyle"   
    android:layout_marginTop="64dp" 
    android:visibility="invisible" /> 

,這其風格如下:

<style name="tallerBarStyle" parent="@android:style/Widget.SeekBar"> 
    <item name="android:indeterminateOnly">false</item> 
    <item name="android:progressDrawable">@android:drawable/progress_horizontal</item> 
    <item 
    name="android:indeterminateDrawable">@android:drawable/progress_horizontal</item> 
    <item name="android:minHeight">8dip</item> 
    <item name="android:maxHeight">10dip</item> 
</style> 

另外我想保存圖像的亮度級別,以便當我將圖像傳遞給另一個活動時,亮度不會丟失。有人可以引導我,我怎麼能實現它。

謝謝。

回答

2

該問題是由於在相同的Bitmap參考(imageBitmap = doBrightness(imageBitmap, brightness);)上進行操作造成的。因此,當您將滑塊拖動到左側時,您仍然不斷增加圖像的亮度。

嘗試

brightness = progress; 
//imageBitmap = doBrightness(imageBitmap, brightness); 
putGestureImageOnScreen(doBrightness(imageBitmap, brightness)); 

爲了您的第二個問題,你可以使用Intent的亮度值轉移到下一個Activity並做亮度操作一次得到相同的結果。

+0

感謝您的回覆。所以對於第二個問題,我應該像Intent.putExtra(「image_brightness」,亮度)那樣傳遞值「亮度」? – user2688158

+0

這是正確的。我也想直接將圖像'int []'原始數據,但恐怕效率不高,可能會導致內存不足或其他問題。 –

+0

doBrightness方法在Activity B中定義,並且在按鈕單擊時我將亮度作爲Intent.putExtra(「image_brightness」,亮度)傳遞。在活動A中,執行putGestureImageOnScreen(Activity B.doBrightness(imageBitmap,brightness))是正確的; ? – user2688158

相關問題