2012-03-09 65 views
0

我遇到了一个问题,现在我被困在很长时间,我希望你们能帮助我。 我得到了一段代码,可以打开图像,更改饱和度(使用seekbar)。那么我想保存更改后的图像。但是最后一部分并不适合。使用此代码,我可以更改饱和度,然后保存更改后的位图,但它将ImageView的大小保存为位图(480 x 517),但是他确实应用了饱和度更改(这很好)。无法保存已更改的位图(已更改饱和度)

ColorMatrix cm = new ColorMatrix(); 

System.out.println(progress2); 
cm.setSaturation(progress2); 
ColorFilter = new ColorMatrixColorFilter(cm); 
bitmap_image = BitmapFactory.decodeFile(filePath); 
ImageView img = (ImageView) findViewById(R.id.gallery1); 
img.setColorFilter(ColorFilter); 
img.setImageBitmap(bitmap_image); 
img.buildDrawingCache(true); 
img.setDrawingCacheEnabled(true); 
Bitmap b = img.getDrawingCache(); 


Bitmap resizedBitmap = Bitmap.createBitmap(bitmap_image, 0, 0, 3264, 2448); 
File file = new File(sdcard+"/DCIM/Camera/image3.jpg"); 
try { 
    file.createNewFile(); 
    FileOutputStream ostream = new FileOutputStream(file); 
    **b.compress(CompressFormat.JPEG, 100, ostream);** 
    ostream.close(); 
} catch (Exception e) 
      { 
      System.out.println("WRITING HAS FAILED"); 
      e.printStackTrace(); 
      } 

而下一个代码,我也可以改变饱和度,但是当我保存位图时,它确实保存了原始高度和宽度(3264 x 2448)的位图,但不保存饱和度更改。

ColorMatrix cm = new ColorMatrix(); 

System.out.println(progress2); 
cm.setSaturation(progress2); 
ColorFilter = new ColorMatrixColorFilter(cm); 
bitmap_image = BitmapFactory.decodeFile(filePath); 
ImageView img = (ImageView) findViewById(R.id.gallery1); 
img.setColorFilter(ColorFilter); 
img.setImageBitmap(bitmap_image); 
img.buildDrawingCache(true); 
img.setDrawingCacheEnabled(true); 
Bitmap b = img.getDrawingCache(); 


Bitmap resizedBitmap = Bitmap.createBitmap(bitmap_image, 0, 0, 3264, 2448); 
File file = new File(sdcard+"/DCIM/Camera/image3.jpg"); 
try { 
    file.createNewFile(); 
    FileOutputStream ostream = new FileOutputStream(file); 
    **resizedBitmap.compress(CompressFormat.JPEG, 100, ostream);** 
    ostream.close(); 
    } catch (Exception e) 
     { 
     System.out.println("WRITING HAS FAILED"); 
     e.printStackTrace(); 
     } 

但我需要的是可以节省的饱和度变化(代码1),并保持原来的宽度 - 高度(代码2),但不知何故,我似乎并没有得到这些代码2一起工作。

请把我放在好的方向。代码可能是一团糟,尝试了很多东西,结构并没有越来越好。

**code** that is the line that changed. 

编辑: 当我这样做:(瑞奇的建议)

Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, 3264, 2448); 

我得到这个错误日志:

03-09 15:03:02.880: E/AndroidRuntime(847): FATAL EXCEPTION: main 
03-09 15:03:02.880: E/AndroidRuntime(847): java.lang.NullPointerException 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.graphics.Bitmap.createBitmap(Bitmap.java:409) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.graphics.Bitmap.createBitmap(Bitmap.java:383) 
03-09 15:03:02.880: E/AndroidRuntime(847): at com.dlv.groenmeter.GroenMeterActivity$13.onStopTrackingTouch(GroenMeterActivity.java:937) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.widget.SeekBar.onStopTrackingTouch(SeekBar.java:115) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:303) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.view.View.dispatchTouchEvent(View.java:3938) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 15:03:02.880: E/AndroidRuntime(847): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1730) 
03-09 15:03:02.880: E/AndroidRuntime(847): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1142) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.app.Activity.dispatchTouchEvent(Activity.java:2102) 
03-09 15:03:02.880: E/AndroidRuntime(847): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1714) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2218) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.view.ViewRoot.handleMessage(ViewRoot.java:1889) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.os.Looper.loop(Looper.java:123) 
03-09 15:03:02.880: E/AndroidRuntime(847): at android.app.ActivityThread.main(ActivityThread.java:3691) 
03-09 15:03:02.880: E/AndroidRuntime(847): at java.lang.reflect.Method.invokeNative(Native Method) 
03-09 15:03:02.880: E/AndroidRuntime(847): at java.lang.reflect.Method.invoke(Method.java:507) 
03-09 15:03:02.880: E/AndroidRuntime(847): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
03-09 15:03:02.880: E/AndroidRuntime(847): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
03-09 15:03:02.880: E/AndroidRuntime(847): at dalvik.system.NativeStart.main(Native Method) 
+0

七号线(标有**“代码'**),这是唯一的改变,其余的代码是相同的IDD,但它应该给我更好的视角。 – Bigflow 2012-03-09 14:01:45

+0

我现在看到了,thnx – Caner 2012-03-09 14:11:57

回答

1

有2个问题,第二个代码:

1) 你的饱和图像b所以resizedBitmap应该从创建这样的:

Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, 3264, 2448); 

2) 你打造后启用DrawingCache

img.buildDrawingCache(true); 
img.setDrawingCacheEnabled(true); 

它应该是相反的顺序:

img.setDrawingCacheEnabled(true); 
img.buildDrawingCache(true); 

编辑:

试试这个代码来设置饱和度:从下

Bitmap bmp = BitmapFactory.decodeFile(filePath); 
    Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); 
    Canvas canvas = new Canvas(alteredBitmap); 
    Paint paint = new Paint(); 
    ColorMatrix cm = new ColorMatrix(); 
    cm.setSaturation(progress2); 
    paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
    Matrix matrix = new Matrix(); 
    canvas.drawBitmap(bmp, matrix, paint); 

Bitmap resizedBitmap = Bitmap.createBitmap(alteredBitmap, 0, 0, 3264, 2448); 
File file = new File(sdcard+"/DCIM/Camera/image3.jpg"); 
try { 
    file.createNewFile(); 
    FileOutputStream ostream = new FileOutputStream(file); 
    resizedBitmap.compress(CompressFormat.JPEG, 100, ostream); 
    ostream.close(); 
    } catch (Exception e) 
     { 
     System.out.println("WRITING HAS FAILED"); 
     e.printStackTrace(); 
     } 
+0

** 1)**导致上面我张贴的logcat发生同样的错误,不知道为什么它说'b'是'null',因为我的第一个代码确实工作(我使用'b' ) ** 2)**也改变了这一点,谢谢你已经:) – Bigflow 2012-03-09 14:20:59

+0

这意味着'b'为空,第一个代码可以工作,因为'b'永远不会在那里使用。我认为你的饱和改变代码不起作用。你确定它在#1中有效吗? – Caner 2012-03-09 14:32:04

+0

看到我编辑的答复 – Caner 2012-03-09 14:34:46

0

从我可以看到变量 'B'包含饱和图像。它看起来像你应该改变行

Bitmap resizedBitmap = Bitmap.createBitmap(bitmap_image, 0, 0, 3264, 2448); 

要:

Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, 3264, 2448); 

这是否对你的工作?

+0

是的idd,我也这么认为,但是它保存了0kb(空)的图像。所以soemthing仍然是错误的 – Bigflow 2012-03-09 14:00:55