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

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

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

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

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

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

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

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

Canvas - Программирование Android
Хочу разобраться в канвасе. Полазил по интернету, не нашел никакого простейшего материала про движение обьектов созданных в канвасе по...

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

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

вылетает canvas - Программирование Android
Здравствуйте, такой вопрос. сделал приложение потестил много раз выложил в маркет прошла неделя в консоли разработчика появилась ошибка...

Масштабирование Canvas - Программирование Android
Здравствуйте. Задача растянуть все изображения во весь экран- SurfaceView (не зависимо от разрешения телефона и соотношения его сторон),...

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

9
V0v1k
1159 / 983 / 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
254 / 232 / 17
Регистрация: 31.10.2010
Сообщений: 504
27.10.2012, 15:39 #4
Цитата Сообщение от Creative Посмотреть сообщение
я имел ввиду на эмуляторе есть нечто заменяющее сдкрту?
При создании/редактировании AVD есть пункт SD Card, в котором можно указать нужный размер или выбрать файл. И правильнее так писать на SD-карту.
1
V0v1k
1159 / 983 / 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
1159 / 983 / 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
1159 / 983 / 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
Привет! Вот еще темы с ответами:

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

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

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

Потоки. Canvas - Программирование Android
Добрый день. Подскажите, как реализовать обработку изменения цвета с помощью потоков? Не могу разобраться как обратиться package...


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

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

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