2012-03-09 2 views
0

У меня возникла проблема, когда я застрял сейчас надолго, надеюсь, вы, ребята, можете мне помочь. У меня есть фрагмент кода, который я могу открыть, изменить насыщенность (с помощью панели поиска). то я хочу сохранить измененное изображение. Но эта последняя часть не работает так, как должно быть.Невозможно сохранить измененное растровое изображение (измененная насыщенность)

С помощью этого кода я могу изменить насыщенность, а затем сохранить изменения растрового изображения, но сохраняет растровое изображение с размером ImageView (480 х 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. 

EDIT: Когда я делаю это: (предложение Ricki)

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

7-й линии из-под (отмеченные ** 'код '**), это единственное изменение, остальная часть кода - это тот же самый idd, но он должен лучше смотреть на то, что я делаю. – Bigflow

+0

Я вижу сейчас, thnx – Caner

ответ

1

Есть 2 проблемы с 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); 

EDIT:

Попробуйте этот код, чтобы установить насыщенность:

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) ** вызывает ту же ошибку в логарифме, что и я, выше, не знаю, почему он говорит, что «b» - «null», потому что 1-й код моей работы работает (где я использую «b»,) ** 2) ** Изменил это тоже, спасибо за это уже :) – Bigflow

+0

Это означает, что 'b' является нулевым, а 1-й код работает, потому что' b' там никогда не используется. Я думаю, что ваш код изменения насыщенности не работает. Вы действительно уверены, что это работает в № 1? – Caner

+0

смотри мой отредактированный ответ – Caner

0

Из того, что я могу видеть переменную 'B' содержит насыщенное изображение. Похоже, что вы должны изменить строку

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

To:

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

делает эту работу за вас?

+0

Да, я тоже это думал, но потом он сохраняет изображение 0kb (пусто). Так что все еще не так – Bigflow

Смежные вопросы