参考までに、私はこの質問に遭遇し、Joel Muellerの答えを使用しましたが、画像パスの解析を自動化することに決めました。たぶん誰かが、私のコードが似たような解決策のスターターにとって有益だと思うかもしれません。それはかなり荒く汚れていますが、うまくやっているようです。
私はC#リソースを使用しています。私のhtmlファイルの中には、イメージファイル名のみを入れています。また、通常のブラウザでファイルを開いて、どのように見えるかをテストすることもできます。コードは自動的にhtml内のfilenameと同じ名前のリソースを探し、アプリケーションデータディレクトリの下に保存してパスを置き換えます。
既に保存されているファイルと異なる場合は、アプリケーションがファイルを上書きすることにも注意してください。開発には主に必要でしたが、実際にはそれらのファイルがほとんどなかったため、ここでのパフォーマンスの低下は気にしませんでした。このチェックを省略し、ファイルが最新であると仮定すると、パフォーマンスが向上するはずです。
Settings.Default.ApplicationId
は、アプリケーション名の単純な文字列で、アプリケーションデータ内のディレクトリ名に使用されます。私のクラスは見終わった方法です
:
class MyHtmlImageEmbedder
{
static protected string _appDataDirectory =
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
Settings.Default.ApplicationId);
static public string getHtml()
{
String apiHelp = Resources.html_file;
Regex regex = new Regex(@"src=\""(.*)\""", RegexOptions.IgnoreCase);
MatchCollection mc = regex.Matches(apiHelp);
foreach (Match m in mc)
{
string filename = m.Groups[1].Value;
Image image = Resources.ResourceManager.GetObject(Path.GetFileNameWithoutExtension(filename)) as Image;
if (image != null)
{
var path = getPathTo(Path.GetFileNameWithoutExtension(filename) + ".png", imageToPngByteArray(image));
apiHelp = apiHelp.Replace(filename, path);
}
}
return apiHelp;
}
static public string getPathTo(string filename, byte[] contentBytes)
{
Directory.CreateDirectory(_appDataDirectory);
var path = Path.Combine(_appDataDirectory, filename);
if (!File.Exists(path) || !byteArrayCompare(contentBytes, File.ReadAllBytes(path)))
{
File.WriteAllBytes(path, contentBytes);
}
return path;
}
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int memcmp(byte[] b1, byte[] b2, long count);
public static bool byteArrayCompare(byte[] b1, byte[] b2)
{
// Validate buffers are the same length.
// This also ensures that the count does not exceed the length of either buffer.
return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
}
public static byte[] imageToPngByteArray(Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms.ToArray();
}
}
はbyteArrayCompareFunctionが唯一のパフォーマンス上の理由からmemcmpを使用していますが、それは簡単な比較ループで置換することができることに注意してください。
次に、私はbrowser.NavigateToString(MyHtmlImageEmbedder.getHtml());
に電話しています。
私のアプリケーションはHTMLを生成していますが、URLには存在しません。 – Tony
しかし、世界中の他のすべてのHTMLページと同様、URLを介して画像やCSSを参照する必要があります。画像が埋め込まれたHTMLページはありません。 –
はい、そうですね。あなたはこれを何とか思ったのですか?多分、HTMLに関するチュートリアルをやめて読んでみようか? –