Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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
Java 无法保存更改的位图(更改的饱和度)_Java_Android_Image_Bitmap_Save - Fatal编程技术网

Java 无法保存更改的位图(更改的饱和度)

Java 无法保存更改的位图(更改的饱和度),java,android,image,bitmap,save,Java,Android,Image,Bitmap,Save,我遇到了一个问题,我被困了很长一段时间,希望你们能帮我解决。 我得到了一段代码,我可以打开一个图像,改变饱和度(使用seekbar)。然后我想保存更改后的图像。但最后一部分并没有发挥应有的作用 使用这段代码,我可以更改饱和度,然后保存更改后的位图,但它会以ImageView的大小(480 x 517)保存位图,但他确实应用了饱和度更改(这很好) 下一个代码,我也可以改变饱和度,但是当我保存位图时,它会保存原始高度和宽度(3264x2448)的位图,但不会保存饱和度的变化 ColorMatr

我遇到了一个问题,我被困了很长一段时间,希望你们能帮我解决。 我得到了一段代码,我可以打开一个图像,改变饱和度(使用seekbar)。然后我想保存更改后的图像。但最后一部分并没有发挥应有的作用

使用这段代码,我可以更改饱和度,然后保存更改后的位图,但它会以ImageView的大小(480 x 517)保存位图,但他确实应用了饱和度更改(这很好)

下一个代码,我也可以改变饱和度,但是当我保存位图时,它会保存原始高度和宽度(3264x2448)的位图,但不会保存饱和度的变化

   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),但不知何故,我似乎没有让这两个代码一起工作

请告诉我好的方向。 代码可能是一团糟,尝试了很多东西,但结构并没有变得更好

**code** that is the line that changed.
编辑: 当我这样做时:(里基的建议)

我得到这个错误日志:

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)

从我看到的变量“b”包含饱和图像。看来你应该换线了

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


这对您有用吗?

第二个代码有两个问题:

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();
        }

是的,idd,我也这么认为,但它保存了一个0kb(空)的图像。所以soemthing仍然是错误的,从下面的第7行开始(用“code”标记),这是唯一的更改,代码的其余部分是相同的idd,但它应该能更好地理解我所做的事情。1)在我上面发布的logcat上导致相同的错误,不知道为什么它会说“b”是“null”,因为我的第一个代码可以工作(我使用“b”)2)也改变了这一点,已经感谢了:)这意味着
b
为空,第一个代码可以工作,因为
b
在那里从未使用过。我认为你的饱和度变化代码不起作用。你真的确定它在#1中有效吗?
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();
        }