0

使用 RichTextBox,我放弃了尝试使 PNG 具有透明背景,而且我真的不喜欢 Microsoft 的代码,即为了将图像对象转换为 wmf,您必须编写两个文件,然后阅读它回到了内存流中,所以我打开了 Illustrator,并将一个表情转换为 WMF,因此据称它是 RTF 所需的格式。

随附的是我正在尝试的格式的图像:

  • WMF big-smile.wmf(必须链接这个,因为不允许上传 WMF)
  • PNG大笑.png

我现在遇到的麻烦是以下代码导致没有显示图像:

public string GetImage( string file, int width, int height ) {
    float dpiX;
    float dpiY;
    string rtfimage;

    using ( Graphics g= this.CreateGraphics() ) {
        dpiX=g.DpiX;
        dpiY=g.DpiY;
    }

    using ( MemoryStream ms=new MemoryStream() ) {
        byte[] data=File.ReadAllBytes( file );
        ms.Write( data, 0, data.Length );
        rtfimage=@"{\pict\wmetafile8\picw"+(int)( ( (float)width/dpiX )*2540 )
                            +@"\pich"+(int)( ( (float)height/dpiY )*2540 )
                            +@"\picwgoal"+(int)( ( (float)width/dpiX )*1440 )
                            +@"\pichgoal"+(int)( ( (float)height/dpiY )*1440 )
                            +" "
                    +BitConverter.ToString( ms.ToArray() ).Replace( "-", "" ).ToLower()
                            +"}";
    }
    return rtfimage;
}

虽然以下代码有效(但仅适用于非 wmf 文件):

public static string GetEmbedImageString( Image image ) {
    Metafile metafile=null;
    float dpiX;
    float dpiY;

    using ( Graphics g=Graphics.FromImage( image ) ) {
        IntPtr hDC=g.GetHdc();
        metafile=new Metafile( hDC, EmfType.EmfOnly );
        g.ReleaseHdc( hDC );
    }

    using ( Graphics g=Graphics.FromImage( metafile ) ) {
        g.CompositingMode = CompositingMode.SourceOver;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.DrawImage( image, 0, 0 );
        g.Clear( Color.White );
        dpiX=g.DpiX;
        dpiY=g.DpiY;
    }

    IntPtr _hEmf=metafile.GetHenhmetafile();
    uint _bufferSize=GdipEmfToWmfBits( _hEmf, 0, null, MM_ANISOTROPIC,
    EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault );
    byte[] _buffer=new byte[_bufferSize];
    GdipEmfToWmfBits( _hEmf, _bufferSize, _buffer, MM_ANISOTROPIC,
                                EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault );
    IntPtr hmf=SetMetaFileBitsEx( _bufferSize, _buffer );
    string tempfile=Path.GetTempFileName();
    CopyMetaFile( hmf, tempfile );
    DeleteMetaFile( hmf );
    DeleteEnhMetaFile( _hEmf );

    var stream=new MemoryStream();
    byte[] data=File.ReadAllBytes( tempfile );
    //File.Delete (tempfile);
    int count=data.Length;
    stream.Write( data, 0, count );

    string proto=@"{\pict\wmetafile8\picw"+(int)( ( (float)image.Width/dpiX )*2540 )
                      +@"\pich"+(int)( ( (float)image.Height/dpiY )*2540 )
                      +@"\picwgoal"+(int)( ( (float)image.Width/dpiX )*1440 )
                      +@"\pichgoal"+(int)( ( (float)image.Height/dpiY )*1440 )
                      +" "
                      +BitConverter.ToString( stream.ToArray() ).Replace( "-", "" )
                      +"}";

    return proto;
}

它们都返回适当的字符串格式,用于在 RichTextBox 控件中嵌入 wmf 文件,如下所示

{\pict\wmetafile8\picw[WIDTH]\pich[HEIGHT]\picwgoal[WIDTH (twips)]\pichgoal[HEIGHT (twips)] [HEX BYTE ARRAY OF FILE]}

我正在寻找一种方法来获取适用于 WinForms RichTextBox 组件的适当字符串

我确实觉得这是一个与非常具体的问题相关的非常具体的问题,并且已经提供了足够多的代码和详细信息,以便您复制问题。理想情况下,如果您遇到此问题并找到了不涉及弄乱用户剪贴板的解决方法(我知道复制/粘贴方法不仅速度慢得多,而且会干扰用户剪贴板。我我也知道解决剪贴板问题的方法,该问题将旧剪贴板数据存储在内存中并将其设置回,但是在某些情况下数据无法设置回,这并非没有缺陷)。

我不是在寻找捷径,尽管您会认为到 2015 年,WinForms 中的 RichTextBox 控件将在 .NET 的 10 年中不断发展。

我也意识到,另一种选择是使用 WPF,它打开了潘多拉的盒子来解决使用 WPF 的所有其他问题(以及好处)。我更喜欢坚持使用总体上更成熟的语言。

我需要帮助的内容非常具体:我发布了另一个线程,引用了有关此问题的其他内容,但由于声称它不具体而被关闭。这是同一个问题,还有更多细节,希望您能看到这是多么具体。

C# > WinForms > RichTextBox > 用图像替换字符串,这要求格式非常具体,在 WMF 中作为非常具体的字节字符串,具有非常具体的格式化标签作为字符串 > 在保持透明度的同时以所需格式正确加载图像时出现问题或者如果不能保持矢量的透明度,至少使用可定义的颜色。

4

0 回答 0