1

プロパティを追加したいPNGファイルがあります

  1. 単位あたりのピクセル数、X 軸
  2. 単位あたりのピクセル数、Y 軸
  3. 単位指定子: メートル

これらのプロパティは、PNG 仕様で説明されています: http://www.w3.org/TR/PNG-Chunks.html

のプロパティをプログラムで読み取って、プロパティが存在するかどうかを確認したので、このプロパティの値を設定できましたが、ファイル.pngにこのプロパティが表示されませんでした。.png(pixel-per-unit.JPG参照)

.pngファイルにプロパティを追加するにはどうすればよいですか?

よろしく 代替テキスト

4

2 に答える 2

1

pngcsライブラリを使用してみてください(ダウンロードした dll の名前を「pngcs.dll」に変更する必要があります)。

カスタム テキスト プロパティをいくつか追加する必要がありましたが、さらに多くのことを簡単に行うことができます。

カスタム テキスト プロパティを追加するための実装は次のとおりです。

using Hjg.Pngcs;  // https://code.google.com/p/pngcs/
using Hjg.Pngcs.Chunks;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MarkerGenerator.Utils
{
    class PngUtils
    {

        public string getMetadata(string file, string key)
        {

            PngReader pngr = FileHelper.CreatePngReader(file);
            //pngr.MaxTotalBytesRead = 1024 * 1024 * 1024L * 3; // 3Gb!
            //pngr.ReadSkippingAllRows();
            string data = pngr.GetMetadata().GetTxtForKey(key);
            pngr.End();
            return data; ;
        }


        public static void addMetadata(String origFilename, Dictionary<string, string> data)
        {
            String destFilename = "tmp.png";
            PngReader pngr = FileHelper.CreatePngReader(origFilename); // or you can use the constructor
            PngWriter pngw = FileHelper.CreatePngWriter(destFilename, pngr.ImgInfo, true); // idem
            //Console.WriteLine(pngr.ToString()); // just information
            int chunkBehav = ChunkCopyBehaviour.COPY_ALL_SAFE; // tell to copy all 'safe' chunks
            pngw.CopyChunksFirst(pngr, chunkBehav);          // copy some metadata from reader 
            foreach (string key in data.Keys)
            {
                PngChunk chunk = pngw.GetMetadata().SetText(key, data[key]);
                chunk.Priority = true;
            }

            int channels = pngr.ImgInfo.Channels;
            if (channels < 3)
                throw new Exception("This example works only with RGB/RGBA images");
            for (int row = 0; row < pngr.ImgInfo.Rows; row++)
            {
                ImageLine l1 = pngr.ReadRowInt(row); // format: RGBRGB... or RGBARGBA...
                pngw.WriteRow(l1, row);
            }
            pngw.CopyChunksLast(pngr, chunkBehav); // metadata after the image pixels? can happen
            pngw.End(); // dont forget this
            pngr.End();
            File.Delete(origFilename);
            File.Move(destFilename, origFilename);

        }

        public static void addMetadata(String origFilename,string key,string value)
        {
            Dictionary<string, string> data = new Dictionary<string, string>();
            data.Add(key, value);
            addMetadata(origFilename, data);
        }


    }
}
于 2015-08-24T06:18:16.753 に答える
0

SetPropertyItemを探していると思います。ここでプロパティIDを見つけることができます

プロパティ ID を使用して、メタデータのプロパティ アイテムを取得してから設定します。

編集

必要な 3 つの ID (私が思うに) は次のとおりです。

  1. 0x5111 - 単位 X あたりのピクセル
  2. 0x5112 - 単位 Y あたりのピクセル
  3. 0x5110 - ピクセル単位
于 2010-08-27T18:06:32.987 に答える