참조를 위해 나는이 질문에 비틀 거리고 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 튜토리얼을 끝내고 읽을 시간인가? –