Изменение данных XMP с помощью C # - PullRequest
1 голос
/ 27 мая 2009

Я использую C # в ASP.NET версии 2. Я пытаюсь открыть файл изображения, прочитать (и изменить) заголовок XMP и снова закрыть его. Я не могу обновить ASP, поэтому WIC отсутствует, и я просто не могу понять, как заставить это работать.

Вот что у меня есть:

Bitmap bmp = new Bitmap(Server.MapPath(imageFile));

MemoryStream ms = new MemoryStream();

StreamReader sr = new StreamReader(Server.MapPath(imageFile));

*[stuff with find and replace here]*

byte[] data = ToByteArray(sr.ReadToEnd());

ms = new MemoryStream(data);

originalImage = System.Drawing.Image.FromStream(ms);

Есть предложения?

Ответы [ 3 ]

1 голос
/ 27 мая 2009

Как насчет такого рода вещи?

byte[] data = File.ReadAllBytes(path);
... find & replace bit here ...
File.WriteAllBytes(path, data);

Кроме того, я действительно рекомендую не использовать System.Bitmap в процессе asp.net, так как это приводит к утечке памяти и время от времени происходит сбой / случайный сбой (даже MS допускает это)

Вот немного от MS о том, почему System.Drawing.Bitmap не стабилен:

http://msdn.microsoft.com/en-us/library/system.drawing.aspx

"Внимание: Классы в пространстве имен System.Drawing не поддерживаются для использования в службе Windows или ASP.NET. Попытка использовать эти классы из одного из этих типов приложений может привести к непредвиденным проблемам, таким как снижение производительности службы и исключения во время выполнения. "

1 голос
/ 20 января 2010

Часть 1 спецификации XMP 2012, стр. 10 , в частности, говорится о том, как редактировать файл на месте без необходимости понимать окружающий формат (хотя они предлагают это в качестве крайней меры). Встроенный пакет XMP выглядит следующим образом:

<?xpacket begin="■" id="W5M0MpCehiHzreSzNTczkc9d"?>
    ... the serialized XMP as described above: ...
    <x:xmpmeta xmlns:x="adobe:ns:meta/">
    <rdf:RDF xmlns:rdf= ...>
        ...
    </rdf:RDF>
    </x:xmpmeta>
    ... XML whitespace as padding ...
<?xpacket end="w"?>

В этом примере ‘■’ представляет Unicode «неразрывный пробел нулевой ширины символ »(U + FEFF) используется как маркер порядка следования байтов.

(XMP Spec 2010, часть 3, стр. 12) также предоставляет конкретные шаблоны байтов (UTF-8, UTF16, big / little endian), которые нужно искать при сканировании байтов. Это дополнит ответ Криса о чтении файла в виде гигантского потока байтов.

0 голосов
/ 27 мая 2009

Вы можете использовать следующие функции для чтения / записи двоичных данных:

    public byte[] GetBinaryData(string path, int bufferSize)
    {
        MemoryStream ms = new MemoryStream();
        using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
        {
            int bytesRead;
            byte[] buffer = new byte[bufferSize];
            while((bytesRead = fs.Read(buffer,0,bufferSize))>0)
            {
                ms.Write(buffer,0,bytesRead);
            }
        }
        return(ms.ToArray());
    }

    public void SaveBinaryData(string path, byte[] data, int bufferSize)
    {
        using (FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write))
        {
            int totalBytesSaved = 0;
            while (totalBytesSaved<data.Length)
            {
                int remainingBytes = Math.Min(bufferSize, data.Length - totalBytesSaved);
                fs.Write(data, totalBytesSaved, remainingBytes);
                totalBytesSaved += remainingBytes;
            }
        }
    }

Однако загрузка целых изображений в память потребовала бы совсем немного оперативной памяти. Я не знаю много о заголовках XMP, но если возможно, вам следует:

  • Загрузка только заголовков в память
  • Манипулировать заголовками в памяти
  • Записать заголовки в новый файл
  • Скопируйте оставшиеся данные из исходного файла
...