programing

리치 텍스트 상자에 이미지를 삽입하려면 어떻게 해야 합니까?

randomtip 2023. 5. 21. 17:27
반응형

리치 텍스트 상자에 이미지를 삽입하려면 어떻게 해야 합니까?

제가 보는 대부분의 예들은 클립보드에 넣고 붙여넣기를 사용하라고 하는데, 클립보드를 덮어쓰니까 별로 좋지 않은 것 같습니다.

저는 핀보케를 사용하여 이미지를 수동으로 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

반응형