我看到的大多数示例都说要把它放在剪贴板上并使用粘贴,但这似乎不是很好,因为它会覆盖剪贴板。
我确实看到one method使用pinvoke手动将图像放入RTF以将图像转换为wmf。这是最好的方法吗?我还能做更直接的事吗?
答案 0 :(得分:52)
最直接的方法是修改RTF代码以自己插入图片。
在RTF中,图片的定义如下:
'{'\ pict(brdr?& shading?& picttype& pictsize& metafileinfo?)data'}' 问号表示控制字是可选的。 “data”只是十六进制格式的文件内容。如果要使用二进制文件,请使用\ bin控制字。
例如:
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860 hex data}
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860\bin binary data}
\ pict =启动图片组, \ pngblip = png图片 \ picwX =图片的宽度(X是像素值) \ pichX =图片的高度 \ picwgoalX =以缇为单位的图片所需宽度
因此,要插入图片,只需打开图片,将数据转换为十六进制,将这些数据加载到字符串中,并在其周围添加RTF代码以定义RTF图片。现在,您有一个包含图片数据的自包含字符串,您可以将其插入文档的RTF代码中。不要忘记结束“}”
接下来,您从RichTextBox(rtbBox.Rtf)获取RTF代码,将图片插入适当的位置,并设置rtbBox.Rtf的代码
您可能遇到的一个问题是.NET RTB对RTF标准没有很好的支持。
我刚刚制作了一个小应用程序*,它允许您快速测试RTB中的一些RTF代码并查看它如何处理它。您可以在这里下载: RTB tester(http://your-translations.com/toys)。
您可以将一些RTF内容(例如,从Word中)粘贴到左侧RTF框中,然后单击“显示RTF代码”以在右侧RTF框中显示RTF代码,或者您可以在右侧粘贴RTF代码RTB并单击“应用RTF代码”以查看左侧的结果。
您当然可以根据需要编辑代码,这样可以非常方便地测试RichTextBox是否支持您需要的命令,或者学习如何使用RTF控制字。
您可以在线下载RTF的完整规范。
NB这只是我在5分钟内拍了一下的小东西,所以我没有实现文件打开或保存,拖放或其他文明的东西。
答案 1 :(得分:11)
我使用以下代码首先从剪贴板中获取数据,将其保存在内存中,将图像设置在剪贴板中,将其粘贴到Rich Text Box中,最后在剪贴板中恢复数据。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
OpenFileDialog1.Filter = "All files |*.*"
OpenFileDialog1.Multiselect = True
Dim orgdata = Clipboard.GetDataObject
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
For Each fname As String In OpenFileDialog1.FileNames
Dim img As Image = Image.FromFile(fname)
Clipboard.SetImage(img)
RichTextBox1.Paste()
Next
End If
Clipboard.SetDataObject(orgdata)
End Sub
OpenFileDailog1,RichTextBox1和Button1分别是打开文件对话框,富文本框和按钮控件。
答案 2 :(得分:6)
private void toolStripButton1_Click(object sender, EventArgs e)
{
FileDialog fDialog = new OpenFileDialog();
fDialog.CheckFileExists = true;
fDialog.CheckPathExists = true;
fDialog.RestoreDirectory = true;
fDialog.Title = "Choose file to import";
if (fDialog.ShowDialog() == DialogResult.OK)
{
string lstrFile = fDialog.FileName;
Bitmap myBitmap = new Bitmap(lstrFile);
// Copy the bitmap to the clipboard.
Clipboard.SetDataObject(myBitmap);
DataFormats.Format format = DataFormats.GetFormat(DataFormats.Bitmap);
// After verifying that the data can be pasted, paste
if(top==true && this.rtTop.CanPaste(format))
{
rtTop.Paste(format);
}
if (btmLeft == true && this.rtBottomLeft.CanPaste(format))
{
rtBottomLeft.Paste(format);
}
if (btmCenter == true && this.rtBottomCenter.CanPaste(format))
{
rtBottomCenter.Paste(format);
}
if (btmRight == true && this.rtBottomRight.CanPaste(format))
{
rtBottomRight.Paste(format);
}
}
}
答案 3 :(得分:4)
以下是我破解富文本控件的方法:
在wordpad或MS-WORD中插入所需的图像。将文件另存为“rtf”。在记事本中打开rtf文件以查看原始rtf代码。复制所需的标签&填充到富文本框的'rtf'属性(附加到现有文本)。
有一些试验和错误但有效。
使用C#,我使用占位符StringBuilder对象和必要的rtf代码。然后我只是附加图像路径。
这是一种无需学习RTF语法的解决方法。
答案 4 :(得分:1)
我在新帖子中发布的自己的版本,显然我应该搜索并在此处发布。无论如何,再次使用剪贴板,非常容易。
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "Images |*.bmp;*.jpg;*.png;*.gif;*.ico";
openFileDialog1.Multiselect = false;
openFileDialog1.FileName = "";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
Image img = Image.FromFile(openFileDialog1.FileName);
Clipboard.SetImage(img);
richTextBox1.Paste();
richTextBox1.Focus();
}
else
{
richTextBox1.Focus();
}
}
}
答案 5 :(得分:0)
如果您使用的是C ++,那么通过OLE进行操作的方法就是这样。更具体地说,如果您在Google上搜索ImageDataObject,它将显示如何将HBITMAP插入RTF控件的C ++代码。一个链接是here。
现在,我不知道这是如何转换为.Net代码的。我目前没有时间通过细节工作。
答案 6 :(得分:0)
我也在寻找同样的任务,发现了这个 - >
http://sourceforge.net/projects/netrtfwriter/
您可以生成任何类型的RTF文本,然后根据需要使用它。非常结构化的示例,它将自动感知正在使用的图像类型(jpg / jpeg / png等),并为我一直使用的图像文件工作。如果你赶时间,那么这是一个很棒的RTF发生器!
答案 7 :(得分:0)
我所做的只是在c#中制作一个小的pictureBox控件,并确保它隐藏在另一个足以隐藏它的对象后面。然后我做了一个按钮来插入一张图片,然后它将pictureBox加载到图像然后将它放在richTextBox中,然后它清除了pictureBox控件。
这是代码。
private void InsertPicture_Click(object sender, EventArgs e)
{
{
if (openFileDialog4.ShowDialog() == DialogResult.OK)
{
// Show the Open File dialog. If the user clicks OK, load the
// picture that the user chose.
pictureBox2.Load(openFileDialog4.FileName);
Clipboard.SetImage(pictureBox2.Image);
pictureBox2.Image = null;
this.richTextBox1.Paste();
}
}
}
答案 8 :(得分:0)
几个小时的搜索解决方案,以插入图像而不损失质量,并用透明的image / png固定灰色背景
// assuming the image is in your Resources
var img = Resources.ImageWithTransparentBckgrnd;
var g = Graphics.FromImage(img);
using (var ms = new MemoryStream())
{
img.Save(ms, ImageFormat.Png);
IntPtr ipHdc = g.GetHdc();
Metafile mf = new Metafile(ms, ipHdc);
g = Graphics.FromImage(mf);
g.FillEllipse(Brushes.White, 0, 0, 16, 16); // size you want to fill in
g.Dispose();
mf.Save(ms, ImageFormat.Png);
IDataObject dataObject = new DataObject();
dataObject.SetData("PNG", false, ms);
Clipboard.SetDataObject(dataObject, false);
richTextBox1.Paste();
SendKeys.Send("{RIGHT}");
richTextBox1.Focus();
}