PDA

Просмотр полной версии : Как экспортировать изображение в XML-формат?


Romario86
25.04.2013, 17:16
Есть "рисовалка", нужно созданное в ней изображение сохранять в формате XML. Как это сделать?

Zebestov
25.04.2013, 17:25
Записывать каждое действие, инициирующее обновление изображения, в XML.
А если еще и время в миллисекундах хранить, то можно изображение в реальном времени воссоздавать ;)

chamele0n
25.04.2013, 17:27
а почему именно xml, чем jpg\png хуже ?

Romario86
25.04.2013, 17:36
В xml нужно по ТЗ к курсовой работе, которую делаю. Подскажите пожалуйста?

mikhailk
25.04.2013, 17:37
Есть "рисовалка", нужно созданное в ней изображение сохранять в формате XML

Есть такой формат SVG
http://ru.wikipedia.org/wiki/SVG

Там как раз примерно об этом.
Векторное изображение описывается xml-файлом.

Посмотрите тут, там есть рисовалка, которая сохраняет в svg
http://graphing.ru/i/svg-examples/

NikolyA
25.04.2013, 17:42
а почему именно xml, чем jpg\png хуже ?

jpg/png ничем не хуже, но есть задача, давай будешь и ты отвечать по теме, хочешь узнать чем хуже jpg или png - лучше создай отдельную тему

Babylon
25.04.2013, 17:44
xml менее компактен. jpg это еще и архив байт в некотором роде.

Romario86
25.04.2013, 17:55
mikhailk, спасибо, но нужно именно в xml

chamele0n
25.04.2013, 17:58
хочешь узнать чем хуже jpg или png - лучше создай отдельную тему
читать научись я такого не спрашивал

ну если по заданию требуется xml это наверно всетаки предпологается запись действий, как предложил Zebestov
и хорошо бы взгялнуть на "рисовалку"

Romario86
25.04.2013, 18:06
кажется нашел что-то подобное. Нужно разобраться
// This function goes through the room objects
// and pulls back their info and creates the XML
private function createXML(e:Event) : void {
// Create a <map /> node
var map:XML = new XML(<map />);
// Create a <rooms /> node to be added to the map XML
var rooms:XML = new XML(<rooms />);
// Add the <rooms> to the <map> node
map.appendChild(rooms);
// aRooms is an array of Room Objects
var len:int = aRoomTiles.length;
for (var i:int = 0; i < len; i++) {
// Create a <room /> node
var room:XML = new XML(<room />);
// Create a bitmap from the bitmapData stored in the room object
var tempImage:Bitmap = new Bitmap(aRooms[i].backgroundImageData);
// Convert the image to a byte array
var bytes:ByteArray = tempImage.bitmapData.getPixels(tempImage.bitmapData.rect);
// This is the Base64 encoded string of the image
var imageString:String = Base64.encode(bytes, false);

// Create a <roomBG /> node
var roomBG:XML = new XML( < bg > { imageString } </bg>);
// Add the roomBG node to the room node
room.appendChild(roomBG);
// Add the room node onto the rooms node
rooms.appendChild(room);
}
}

chamele0n
25.04.2013, 18:20
запихнуть закодированый массив пикселей в тег xml ?
этоже глупо
с таким же успехом можно сделать экспорт в image.jpg и переименовать в image.xml :D

mikhailk
25.04.2013, 19:14
спасибо, но нужно именно в xml

А это и был xml. :)


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version = "1.1"
baseProfile="full"
xmlns = "http://www.w3.org/2000/svg"
xmlns:xlink = "http://www.w3.org/1999/xlink"
xmlns:ev = "http://www.w3.org/2001/xml-events"
height = "400px" width = "400px">
<rect x="0" y="0" width="400" height="400"
fill="none" stroke="black" stroke-width="5px" stroke-opacity="0.5"/>
<g fill-opacity="0.6" stroke="black" stroke-width="0.5px">
<circle cx="200px" cy="200px" r="104px" fill="red" transform="translate( 0,-52)" />
<circle cx="200px" cy="200px" r="104px" fill="blue" transform="translate( 60, 52)" />
<circle cx="200px" cy="200px" r="104px" fill="green" transform="translate(-60, 52)" />
</g>
</svg>


Я предлагал взять принцип из SVG:

1. Рисование производится векторными элементами
2. Каждый элемент (или группа элементов) описывается соответствующей конструкцией XML.

У Вас рисовалка как работает?

Romario86
25.04.2013, 22:35
Рисовалка на основе этой http://www.nocircleno.com/graffiti/examples/drawing_app_1_2/

Партизан
26.04.2013, 01:15
Romario86, так вы лучше сразу с xml экспортером найдите рисовалку...
Вам привели примеры, подсказали форматы вывода на которые стоит ориентироваться. Но судя по приведенному вами коду на предыдущей странице, вы не в том разделе форума копаете. Имхо, раздел "Вакансии" будет в самый раз...

Romario86
26.04.2013, 15:21
Ребят не пинайте сильно я только учусь) Получился вот такой код:
// Сохранение изображения как XML
private function createXML(e:MouseEvent):void {
// Получить изображение из холста
var canvasBmp:BitmapData = canvas.drawing();

// Преобразование изображения в массив байтов
var bytes:ByteArray = canvasBmp.getPixels(canvasBmp.rect);

// Перевод в кодировку Base64

var imageString:String = Base64.encode(bytes);

// Создаем XML

var image:XML = new XML(<bg>{ imageString }(</bg>);

_fileRef = new FileReference();
_fileRef.save(image, "image.xml");
}
Картинка сохраняется в кодировке Base64 и выглядит так примерно:
<bg>//////////////////////////////ZwP//////ZgD////////3Kg/// и т. д.
Неужели нельзя добить, чтоб был xml? Спасибо всем за внимание.

chamele0n
26.04.2013, 15:48
ну а тебе как надо ?

GBee
26.04.2013, 15:50
Romario86, вы ничего толком не объяснили. Если редактор предполагается векторный, то ваше решение не подходит. Вы же даже не понимаете , что делает ваш код. И это XML.
Если вы хотите сохранять в хмл, чтобы потом восстанавливать картинку и иметь возможность редактировать примитивы оттуда, то не надо фоткать экран, все немного сложнее. И SVG хороший вариант, чтобы придумать свой формат. Никто не будет писать за вас курсовую. И судя по вашим вопросам - курсовая под угрозой срыва.

Иначе говоря вам надо запоминать почти все, что делает юзер на холсте. И потом сливать это в хмл.
1) Выбрал инструмент - круг
2) Нарисовал круг / создали объект круг - пихнули в фигуры
3) Изменил его немного - поменяли объекту поля
4) Нажал сохранить - бежим по фигурам и генерим хмл
5) Отправляем хмл куда надо.

Формат ваша забота, вариантов вагон
<circle x=1 y=1 radius=2 id=1 /> или <fig type="circle" x=1 y=1 radius=2 id=1 />