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

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

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

Canvas в JPEG - Программирование Android

27.10.2012, 13:54. Просмотров 2415. Ответов 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 - Программирование Android
Здравствуйте. Задача растянуть все изображения во весь экран- SurfaceView (не зависимо от разрешения телефона и соотношения его сторон),...

Android canvas - Программирование Android
Как передать параметры в класс с методом onDraw? Этот самый класс мне нужно вызвать в xml! я так то сделал вложеный класс, и...

Столкновения на canvas - Программирование Android
Здравствуйте. Задача определить позиции столкновения для 2 объектов-рисунков .png, которые при этом еще и вращаются...

Intent в Canvas - Программирование Android
в private void draw нужно использовать переменную T из соседнего класса я использую, строка с примечанием, но выдает ошибку подскажите...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Еще ссылки по теме:

Растянуть Canvas - Программирование Android
Господа, вопрос, у меня 2 телефона, первый 1280x720, второй 800x600, мое App было сделано для 800x600, в частности речь о Canvas,...

canvas.rotate - Программирование Android
Данный код работает не стабильно на разных устройствах. Под разные плотности экрана (ldpi, mdpi, hdpi, xhdpi) в каждую папку был...

Canvas и Activity - Программирование Android
Есть класс наследующийся от activity. из которого переходишь в класс который рисует спрайты. Спрайты рисуются в потоке, собственно есть...

Использование canvas - Программирование Android
Интересует насколько глупо использовать слудующий метод рисование и как тогда быть. Есть игра где все происходит в координатной системе....

Canvas и Button - Программирование Android
можно ли в канвасе на холсте разместить view-элементы? кнопки к примеру или textview.


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

Или воспользуйтесь поиском по форуму:
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