Форум программистов, компьютерный форум CyberForum.ru

Сохранить картинку на канве - Android

Восстановить пароль Регистрация
 
alsh
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
23.05.2015, 18:46     Сохранить картинку на канве #1
Здравствуйте! Делаю игру, и ее часть - это "комната" рисования, где должно сохраняться текущее нарисованное изображение. В ней в виде customView расположен холст, на котором пользователь что-то рисует. Но если ему из этой "комнаты" выйти и опять зайти, то нарисованного ранее конечно уже не будет. Много уже сайтов с решениями перелопатил, но ничего не помогает - или ошибки, или просто ничего не сохраняется. Вот нынешний вариант:

В onCreate():
Java
1
2
3
 encoded=sp.getString("drawedImage", "");
imageAsBytes=Base64.decode(encoded, 0);
if(!encoded.equals("")) {waxboardView.bitmapCanvas.drawBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length), 0, 0, null);}
Метод с сохранением:
Java
1
2
3
4
5
6
7
8
9
public void saveBoard(){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        waxboardView.bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); //bm is the bitmap object
        b = baos.toByteArray();
        encoded = Base64.encodeToString(b, Base64.DEFAULT);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("drawedImage", encoded);
        editor.apply();
    }
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
23.05.2015, 21:51     Сохранить картинку на канве #2
С сайта stackoverflow.com код(попробовал. работает):
Java
1
2
3
4
5
6
7
Bitmap bitmap;  // ссылка на существующий битмап
Context context; //ссылка на контекст приложения
 
//открываем файл в приватном каталоге нашей аппы
OutputStream stream = context.openFileOutput("test.png", MODE_WORLD_WRITEABLE);
bitmap.compress(CompressFormat.PNG, 70, stream);// пишем битмап на PNG с качеством 70%
stream.close();
alsh
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
23.05.2015, 22:29  [ТС]     Сохранить картинку на канве #3
Спасибо большое! Но как мне теперь отобразить сохраненное изображение при следующих заходах пользователя в эту комнату?
И ничего, что у меня получилось только так (на Ваш вариант без try/catch ругается):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public void saveBoard(){
        OutputStream stream = null;
        try {
            stream = ctxt.openFileOutput("test.png", MODE_WORLD_WRITEABLE);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        waxboardView.bitmap.compress(Bitmap.CompressFormat.PNG, 70, stream);// пишем битмап на PNG с качеством 70%
        try {
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
23.05.2015, 22:37     Сохранить картинку на канве #4
try/catch разумеется нужент. вот как с делал:

Java
1
2
3
4
5
6
7
8
9
10
OutputStream stream = null;
        try {
            stream = this.openFileOutput("test.png", MODE_WORLD_WRITEABLE);
            bitmap.compress(Bitmap.CompressFormat.PNG, 70, stream);// пишем битмап на PNG с качеством 70%
            stream.close();
        } catch (FileNotFoundException e) {
            Toast.makeText(this, "FileNotFoundException", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(this, "IOException", Toast.LENGTH_SHORT).show();
        }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
imageView = (ImageView) findViewById(R.id.imageView2);
Bitmap bitmap = getBitmap();
imageView.setImageBitmap(bitmap);
 
//.................
 
private Bitmap getBitmap() {
        InputStream is = null;
        Bitmap bitmap = null;
 
        try {
            is = this.openFileInput("test.png");
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(bitmap == null) {
            bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        }
        return bitmap;
    }
alsh
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
24.05.2015, 09:15  [ТС]     Сохранить картинку на канве #5
Эх, опять у меня не клеится... У меня, правда, нарисованный битмап выводится на канву, но не суть, метод я переделал правильно. Так вот, там, где в onCreate() imageView.setImageBitmap(bitmap) выдаёт nullPointerException и говорит, что длина и ширина должны быть больше нуля. Так как моё приложение должно работать на разных разрешениях, то их определить точно нельзя. Я пытался высчитывать длину и ширину не сразу, ставил в качестве размеров ViewGroup.LayoutParams.MATCH_PARENT, но все равно nullpointerexceotion((
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
24.05.2015, 10:42     Сохранить картинку на канве #6
alsh, код покажи
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2015, 10:50     Сохранить картинку на канве
Еще ссылки по теме:

Android ImageView не видит картинку
Android Получить картинку ImageView
Загрузить картинку в Drawable Android
Получить картинку из ресурсов Android
Android из c# byte получить картинку

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsh
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
24.05.2015, 10:50  [ТС]     Сохранить картинку на канве #7
Перед onCreate:
Java
1
2
 Context ctxt;
    Bitmap btmp;
в onCreate:
Java
1
2
 btmp=getDrawedBitmap();
        waxboardView.bitmapCanvas.setBitmap(btmp);
Получение картинки с холста:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  private Bitmap getDrawedBitmap() {
        InputStream is = null;
        if(waxboardView.bitmap == null) {
            waxboardView.bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.black); 
        }
        else {
            try {
                is = this.openFileInput("test.png");
                waxboardView.bitmap = BitmapFactory.decodeStream(is);
                is.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }};
        return  waxboardView.bitmap;
    }
Сохранение картинки:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
  public void saveBoard(){
        OutputStream stream = null;
        try {
            stream = this.openFileOutput("test.png", MODE_WORLD_WRITEABLE);
            waxboardView.bitmap.compress(Bitmap.CompressFormat.PNG, 70, stream);
            stream.close();
        } catch (FileNotFoundException e) {
            Toast.makeText(this, "FileNotFoundException", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(this, "IOException", Toast.LENGTH_SHORT).show();
        }
 
    }
WaxboardView - это класс-вьюшка, в нем рисование описано, а код выше - в активити.
Yandex
Объявления
24.05.2015, 10:50     Сохранить картинку на канве
Ответ Создать тему
Опции темы

Текущее время: 23:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru