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

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

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

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

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

Заранее спасибо!
http://www.cyberforum.ru/android-dev/thread726923.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 13:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Canvas в JPEG (Программирование Android):

Intent в Canvas
в private void draw нужно использовать переменную T из соседнего класса я...

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

Масштабирование Canvas
Здравствуйте. Задача растянуть все изображения во весь экран- SurfaceView (не...

Столкновения на canvas
Здравствуйте. Задача определить позиции столкновения для 2 объектов-рисунков...

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

9
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
27.10.2012, 14:08 #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
1
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
27.10.2012, 15:04  [ТС] #3
Цитата Сообщение от V0v1k Посмотреть сообщение
может у вас просто нет сдкарты?
я имел ввиду на эмуляторе есть нечто заменяющее сдкрту? и если нет то куда сохранять?

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

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

я не совсем понимаю в каком классе нужно реализовать метод который собственно будет сохранять и как он найдет нужную канву?
0
Good-bad man
255 / 233 / 38
Регистрация: 31.10.2010
Сообщений: 504
27.10.2012, 15:39 #4
Цитата Сообщение от Creative Посмотреть сообщение
я имел ввиду на эмуляторе есть нечто заменяющее сдкрту?
При создании/редактировании AVD есть пункт SD Card, в котором можно указать нужный размер или выбрать файл. И правильнее так писать на SD-карту.
1
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
27.10.2012, 16:40 #5
Цитата Сообщение от Creative Посмотреть сообщение
я не совсем понимаю в каком классе нужно реализовать метод который собственно будет сохранять и как он найдет нужную канву?
в каком хотите.
потом вызываете его метод для сохранения и передавая ему канву.
0
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
28.10.2012, 15:09  [ТС] #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" так что по идее карта памяти работает... может нужно предварительно создать файл какимто методом??
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.10.2012, 16:23 #7
может у вас нет пермишенов на запись файлов?
покажите логи.
0
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
29.10.2012, 11:44  [ТС] #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 минуты
пермишены в манифесте смотреть?
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
29.10.2012, 14:03 #9
Цитата Сообщение от Creative Посмотреть сообщение
пермишены в манифесте смотреть?
да посмотрите в манифесте пермишены на запись в файл.
можете попробовать сначала создавать файл методом file.createNewFile(), но он вроде как сам должен создаваться...
1
Creative
22 / 8 / 1
Регистрация: 13.07.2012
Сообщений: 66
30.10.2012, 12:58  [ТС] #10
спасибо, создал карту с помощью mksdcard, настроил пермишены - заработало
0
30.10.2012, 12:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 12:58
Привет! Вот еще темы с решениями:

Использование canvas
Интересует насколько глупо использовать слудующий метод рисование и как тогда...

canvas.rotate
Данный код работает не стабильно на разных устройствах. Под разные плотности...

Карта на Canvas
Здравствуйте! Решил попробовать написать игру под андроид, до этого писал...

Android canvas
Как передать параметры в класс с методом onDraw? Этот самый класс мне нужно...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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