리치 텍스트 상자에 이미지를 삽입하려면 어떻게 해야 합니까?
제가 보는 대부분의 예들은 클립보드에 넣고 붙여넣기를 사용하라고 하는데, 클립보드를 덮어쓰니까 별로 좋지 않은 것 같습니다.
저는 핀보케를 사용하여 이미지를 수동으로 RTF에 삽입하여 이미지를 wmf로 변환하는 한 가지 방법을 보았습니다.이게 최선의 방법입니까?제가 더 직접적으로 할 수 있는 일이 있나요?
가장 간단한 방법은 RTF 코드를 수정하여 사진을 직접 삽입하는 것입니다.
RTF에서 그림은 다음과 같이 정의됩니다.
\pict (brdr?음영?pictype & pictsize & metafileinfo?) 데이터 '}' 물음표는 제어 단어가 선택 사항임을 나타냅니다."data"는 단순히 16진수 형식의 파일 내용입니다.이진법을 사용하려면 \bin 제어 단어를 사용합니다.
예를 들어:
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860 hex data}
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860\bin binary data}
\pict = 그림 그룹 시작, \pngblip = png 그림 \picwX = 그림의 너비(X는 픽셀 값) \picwX = 그림의 높이 \picwgoalX = 원하는 너비(트위프)
그래서 사진을 삽입하기 위해서는 사진을 열고 데이터를 16진수로 변환한 다음 이 데이터를 문자열로 로드하고 RTF 코드를 추가하여 RTF 사진을 정의하기만 하면 됩니다.이제 문서의 RTF 코드에 삽입할 수 있는 그림 데이터가 포함된 자체 포함 문자열이 있습니다.닫는 "}"을(를) 잊지 마십시오.
그런 다음 RTF 코드를 RichTextBox(rtbBox)에서 가져옵니다.Rtf), 그림을 적절한 위치에 삽입하고 rtbBox의 코드를 설정합니다.Rtf
한 가지 문제는 .NET RTB가 RTF 표준을 잘 지원하지 않는다는 것입니다.
RTB 내의 일부 RTF 코드를 신속하게 테스트하고 어떻게 처리하는지 확인할 수 있는 작은 애플리케이션*을 만들었습니다.RTB 테스터(http://your-translations.com/toys) 에서 다운로드할 수 있습니다.
일부 RTF 콘텐츠(예: Word)를 왼쪽 RTF 상자에 붙여넣고 "Show RTF codes"를 클릭하여 오른쪽 RTF 상자에 RTF 코드를 표시하거나, 오른쪽 RTB에 RTF 코드를 붙여넣고 "Apply RTF codes"를 클릭하여 왼쪽에 결과를 볼 수 있습니다.
물론 코드를 원하는 대로 편집할 수 있으므로 RichTextBox가 필요한 명령을 지원하는지 여부를 테스트하거나 RTF 제어 단어 사용 방법을 배울 때 매우 편리합니다.
온라인으로 RTF의 전체 사양을 다운로드할 수 있습니다.
NB 5분 만에 간단히 정리했기 때문에 파일 열기 또는 저장, 드래그 앤 드롭 또는 기타 문명적인 기능을 구현하지 않았습니다.
다음 코드를 사용하여 먼저 클립보드에서 데이터를 가져와 메모리에 저장하고, 이미지를 클립보드에 설정한 다음 리치 텍스트 상자에 붙여넣고, 마지막으로 클립보드에 데이터를 복원합니다.
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은 각각 OpenFileDialog1, RichTextBox1 및 버튼 컨트롤입니다.
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);
}
}
}
리치 텍스트 제어를 해킹하기 위해 제가 하는 일은 다음과 같습니다.
워드패드 또는 MS-WORD에 필요한 이미지를 삽입합니다.파일을 'rtf'로 저장합니다.Raw rtf 코드를 보려면 메모장에서 rtf 파일을 엽니다.필요한 태그 및 내용을 리치 텍스트 상자의 'rtf' 속성(기존 텍스트에 추가)에 복사합니다.
시행착오가 있지만 효과가 있습니다.
C#에서는 필요한 rtf 코드가 있는 자리 표시자 StringBuilder 개체를 사용합니다.그런 다음 이미지 경로를 추가합니다.
이것은 RTF 구문을 배울 필요가 없는 경우의 해결 방법입니다.
새 스레드에 게시한 나만의 버전, 분명히 검색해서 여기에 게시했어야 했습니다.어쨌든 클립보드를 다시 사용하는 것은 매우 쉽습니다.
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();
}
}
}
만약 당신이 C++에 있었다면, 그것을 하는 방법은 OLE를 통해서입니다.보다 구체적으로, Google에서 ImageDataObject를 검색하면 C++ 코드가 HBITMAP을 RTF 컨트롤에 삽입하는 방법을 보여줍니다.하나의 링크가 여기 있습니다.
이제 이것이 어떻게 해석되는지.넷 코드, 나도 몰라요.저는 현재 세부 사항을 검토할 시간이 없습니다.
저도 이 같은 작업을 위해 무언가를 찾고 있었는데 이것을 발견했습니다 ->
http://sourceforge.net/projects/netrtfwriter/
원하는 모든 유형의 RTF 텍스트를 생성한 다음 원하는 대로 사용할 수 있습니다.사용 중인 이미지 유형(jpg/jpeg/png 등)을 자동으로 감지하고 사용 중인 이미지 파일에 대해 작동하는 매우 잘 구성된 예입니다.만약 당신이 급하다면 이것은 훌륭한 RTF 발전기입니다!
제가 한 일은 c#에서 작은 pictureBox 컨트롤을 만들고 그것을 숨길 수 있을 정도로 큰 다른 물체 뒤에 숨겼는지 확인하는 것뿐이었습니다.그런 다음 사진을 삽입하기 위해 버튼을 눌렀더니 이미지와 함께 pictureBox를 로드하고 리치 텍스트 상자에 넣은 다음 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();
}
}
}
클립보드로 수행할 코드를 삽입한 후 다음을 입력합니다.Clipboard.Clear();
잘 작동하고 클립보드에 마지막으로 추가한 항목만 지워지지 않습니다.
전체 코드:
private void addPictureToRTB()
{
using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Pictures|*.png" })
{
if (ofd.ShowDialog() == DialogResult.OK)
{
ClipBoard.SetImage(Image.FromFile(ofd.FileName));
richTextBox.Paste();
Clipboard.Clear();
}
}
}
그런 다음 필요한 곳에서 이 기능을 참조하십시오.
품질 저하 없이 이미지를 삽입하고 회색 배경을 투명한 이미지/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();
}
언급URL : https://stackoverflow.com/questions/542850/how-can-i-insert-an-image-into-a-richtextbox
'programing' 카테고리의 다른 글
Angular 2 HTTP "'AppService'에 대한 일부 매개 변수를 확인할 수 없습니다." (0) | 2023.06.10 |
---|---|
github private repo에 대한 '터미널 프롬프트 사용 안 함' 오류로 결과를 가져오십시오. (0) | 2023.05.21 |
Swift를 사용하여 텍스트를 클립보드/페이스트보드에 복사하는 방법 (0) | 2023.05.21 |
std::sprintf와 같은 문자열 형식 포맷해서 파일 스트림으로 (0) | 2023.05.21 |
VS 2008 중단점은 현재 적중되지 않습니다.이 문서에 대해 로드된 기호가 없습니다. (0) | 2023.05.21 |