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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
#1

Canvas в JPEG - Android

27.10.2012, 13:54. Просмотров 2384. Ответов 9
Метки нет (Все метки)

Всем Привет! пытаюсь сохранить все что нарисовано на канве в джпег-файл. Глубоко не загугливаясь обнаружил следующий материал: android-canvas-to-jpg. Попытался повторить фокус получил в лог ошибку о том что файл mnt/sdcard/arun.jpg не найден... в связи с этим несколько вопросов:

1. Нужно ли предварительно этот файл создавать? или я просто чтото не так делаю?
2. Где собственно находится этот mnt/sdcard/..? беглый осмотр папок АВД менеджера результатов не дал..
3. В приведенном примере все манипуляции с сохранением в файл осуществляеются внутри метода onDraw, можно ли их производить вне этого метода? я так понимаю для этого нужно создать какуюто внешнюю переменную типо Canvas поместить туда текущую канву, а потом использовать эту переменную в другом методе... но пока не пойму как.
4. Я хочу чтобы пользователь имел возможность выбирать куда сохранить изображение, предоставляет ли Андроид стандартный диалог выбора пути сохранения?

Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 13:54     Canvas в JPEG
Посмотрите здесь:

вылетает canvas Android
Масштабирование Canvas Android
Canvas Android
Canvas и Activity Android
Canvas и Button Android
canvas.rotate Android
Android Intent в Canvas
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
27.10.2012, 14:08     Canvas в JPEG #2
Цитата Сообщение от Creative Посмотреть сообщение
1. Нужно ли предварительно этот файл создавать? или я просто чтото не так делаю?
2. Где собственно находится этот mnt/sdcard/..?
может у вас просто нет сдкарты? SDCard

Добавлено через 50 секунд
Цитата Сообщение от Creative Посмотреть сообщение
4. Я хочу чтобы пользователь имел возможность выбирать куда сохранить изображение, предоставляет ли Андроид стандартный диалог выбора пути сохранения?
стандартное активити есть.

Добавлено через 55 секунд
Цитата Сообщение от Creative Посмотреть сообщение
3. В приведенном примере все манипуляции с сохранением в файл осуществляеются внутри метода onDraw, можно ли их производить вне этого метода? я так понимаю для этого нужно создать какуюто внешнюю переменную типо Canvas поместить туда текущую канву, а потом использовать эту переменную в другом методе... но пока не пойму как.
mCanvas = canvas;

Добавлено через 2 минуты
http://twigstechtips.blogspot.com/20...lect-file.html
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
27.10.2012, 15:04  [ТС]     Canvas в JPEG #3
Цитата Сообщение от V0v1k Посмотреть сообщение
может у вас просто нет сдкарты?
я имел ввиду на эмуляторе есть нечто заменяющее сдкрту? и если нет то куда сохранять?

java-сохранение-отрисованного-в-canvas-е-в-файл вот здесь предлагают как то в галерею запихнуть...

можете пожалуйста в общем объяснить порядок действий: у меня в одной активити на канве рисуется всякая всячина, а потом я хочу чтобы юзер, допустим, нажал меню и выбрал там пункт сохранить, выбрал путь, а потом собственно произошло сохранение.

я не совсем понимаю в каком классе нужно реализовать метод который собственно будет сохранять и как он найдет нужную канву?
Good-bad man
254 / 232 / 17
Регистрация: 31.10.2010
Сообщений: 504
27.10.2012, 15:39     Canvas в JPEG #4
Цитата Сообщение от Creative Посмотреть сообщение
я имел ввиду на эмуляторе есть нечто заменяющее сдкрту?
При создании/редактировании AVD есть пункт SD Card, в котором можно указать нужный размер или выбрать файл. И правильнее так писать на SD-карту.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
27.10.2012, 16:40     Canvas в JPEG #5
Цитата Сообщение от Creative Посмотреть сообщение
я не совсем понимаю в каком классе нужно реализовать метод который собственно будет сохранять и как он найдет нужную канву?
в каком хотите.
потом вызываете его метод для сохранения и передавая ему канву.
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
28.10.2012, 15:09  [ТС]     Canvas в JPEG #6
Поигрался немного с найденным по ссылкам кодом, в итоге следующая комбинация успешно сохраняет катинку в галерею:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
       //собственно метод для сохранения в галерею
       private String saveImageToMediaStore(Bitmap source, String title, String desc){
            return MediaStore.Images.Media.insertImage(getContentResolver(), source,title, desc);
        }
    //метод в котором создается битмап и вызывается предыдущий метод    
        private void toFile() {
            Canvas canvas = null;           
            Bitmap bmpBase = null;
            bmpBase = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888);
            canvas = new Canvas(bmpBase);
            // draw what ever you want canvas.draw...
            paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.WHITE);
    canvas.drawPaint(paint);
    epura.draw(canvas, paint);
 
            
    saveImageToMediaStore(bmpBase, "GGGG", "");
            
        }
С этим проблем нет.

Попробовал сохранить на карту:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
        
        private void toFile() {
            Canvas canvas = null;
            FileOutputStream fos = null;
            Bitmap bmpBase = null;
            bmpBase = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888);
            canvas = new Canvas(bmpBase);
            // draw what ever you want canvas.draw...
            paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.WHITE);
    canvas.drawPaint(paint);
    epura.draw(canvas, paint);
 
            // Save Bitmap to File
            try
            {
                fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/a.png");
                bmpBase.compress(Bitmap.CompressFormat.PNG, 100, fos);
 
                fos.flush();
                fos.close();
                fos = null;
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (fos != null)
                {
                    try
                    {
                        fos.close();
                        fos = null;
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
            
        }
получаю в лог ошибку, что файл a.png не найден.

метод Environment.getExternalStorageDirectory() возвращает "/sdcard" так что по идее карта памяти работает... может нужно предварительно создать файл какимто методом??
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.10.2012, 16:23     Canvas в JPEG #7
может у вас нет пермишенов на запись файлов?
покажите логи.
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
29.10.2012, 11:44  [ТС]     Canvas в JPEG #8
Цитата Сообщение от V0v1k Посмотреть сообщение
может у вас нет пермишенов на запись файлов?
покажите логи.
Очевидно вы правы...

попробовал заменить строку

Java
1
fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/blabla.png");
на

Java
1
fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory().getPath() + "/blabla.png"));
кажется не помогло...

вот лог:

10-29 07:23:07.580: W/System.err(283): java.io.FileNotFoundException: /sdcard/blabla.png
10-29 07:23:07.590: W/System.err(283): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:244)
10-29 07:23:07.605: W/System.err(283): at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
10-29 07:23:07.610: W/System.err(283): at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
10-29 07:23:07.610: W/System.err(283): at com.balka.SolutionActivity$SolutionPanel.toFile(SolutionActivity.java:274)
10-29 07:23:07.610: W/System.err(283): at com.balka.SolutionActivity$SolutionPanel.onDraw(SolutionActivity.java:321)
10-29 07:23:07.610: W/System.err(283): at android.view.View.draw(View.java:6535)
10-29 07:23:07.610: W/System.err(283): at android.view.View.buildDrawingCache(View.java:6297)
10-29 07:23:07.610: W/System.err(283): at android.view.View.getDrawingCache(View.java:6086)
10-29 07:23:07.621: W/System.err(283): at android.view.ViewGroup.drawChild(ViewGroup.java:1456)
10-29 07:23:07.621: W/System.err(283): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
10-29 07:23:07.621: W/System.err(283): at android.view.View.draw(View.java:6538)
10-29 07:23:07.621: W/System.err(283): at android.widget.FrameLayout.draw(FrameLayout.java:352)
10-29 07:23:07.621: W/System.err(283): at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
10-29 07:23:07.621: W/System.err(283): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
10-29 07:23:07.621: W/System.err(283): at android.view.View.draw(View.java:6538)
10-29 07:23:07.621: W/System.err(283): at android.widget.FrameLayout.draw(FrameLayout.java:352)
10-29 07:23:07.621: W/System.err(283): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830)
10-29 07:23:07.630: W/System.err(283): at android.view.ViewRoot.draw(ViewRoot.java:1349)
10-29 07:23:07.630: W/System.err(283): at android.view.ViewRoot.performTraversals(ViewRoot.java:1114)
10-29 07:23:07.630: W/System.err(283): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
10-29 07:23:07.630: W/System.err(283): at android.os.Handler.dispatchMessage(Handler.java:99)
10-29 07:23:07.630: W/System.err(283): at android.os.Looper.loop(Looper.java:123)
10-29 07:23:07.630: W/System.err(283): at android.app.ActivityThread.main(ActivityThread.java:4363)
10-29 07:23:07.630: W/System.err(283): at java.lang.reflect.Method.invokeNative(Native Method)
10-29 07:23:07.630: W/System.err(283): at java.lang.reflect.Method.invoke(Method.java:521)
10-29 07:23:07.630: W/System.err(283): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-29 07:23:07.630: W/System.err(283): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-29 07:23:07.630: W/System.err(283): at dalvik.system.NativeStart.main(Native Method)

и еще я так и не понял, если мне таки удастся сохранить его на карту памяти (я работаю на эмуляторе AVD) как мне потом этот файл посмотреть? его можно из Винды найти?

Добавлено через 2 минуты
пермишены в манифесте смотреть?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
29.10.2012, 14:03     Canvas в JPEG #9
Цитата Сообщение от Creative Посмотреть сообщение
пермишены в манифесте смотреть?
да посмотрите в манифесте пермишены на запись в файл.
можете попробовать сначала создавать файл методом file.createNewFile(), но он вроде как сам должен создаваться...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 12:58     Canvas в JPEG
Еще ссылки по теме:

Android Столкновения на canvas
Использование canvas Android
Android canvas Android
Android Карта на Canvas
Потоки. Canvas Android

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

Или воспользуйтесь поиском по форуму:
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
30.10.2012, 12:58  [ТС]     Canvas в JPEG #10
спасибо, создал карту с помощью mksdcard, настроил пермишены - заработало
Yandex
Объявления
30.10.2012, 12:58     Canvas в JPEG
Ответ Создать тему
Опции темы

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