> 백엔드 개발 > C++ > Windows 클립보드에 이미지를 복사할 때 투명성을 유지하는 방법은 무엇입니까?

Windows 클립보드에 이미지를 복사할 때 투명성을 유지하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-12 14:32:45
원래의
957명이 탐색했습니다.

How to Maintain Transparency When Copying Images to the Windows Clipboard?

투명하게 이미지 복사: Windows 클립보드 솔루션

문제: Windows 클립보드에 복사할 때 이미지 투명도가 유지됩니다.

배경

Windows 클립보드는 기본적으로 투명도를 지원하지 않습니다. 그러나 알파 채널(투명도)을 지원하는 PNG를 포함하여 다양한 데이터 형식을 처리할 수 있습니다.

솔루션

투명성을 유지하려면 다음 전략을 사용하세요.

이미지 저장

  1. MemoryStreamImage.Save()을 사용하여 이미지를 PNG 스트림으로 변환합니다.
  2. 또한 투명성 처리를 위해 널리 사용되는 DIB(Device Independent Bitmap) 형식으로 변환하세요.
  3. PNG 및 DIB 스트림을 표준 비트맵과 함께 DataObject 내에 저장합니다.

이미지 검색

  1. 클립보드에서 DataObject에 접속하세요.
  2. 이미지를 PNG로 검색하는 것을 우선시하세요. 사용할 수 없는 경우 DIB를 사용해 보세요. 그런 다음 표준 비트맵 또는 이미지 유형으로 돌아갑니다.
  3. 가장 중요한 것은 리소스 충돌과 잠재적인 충돌을 방지하기 위해 검색된 이미지의 복제본을 생성하는 것입니다.

코드 구현

public static void SetClipboardImage(Bitmap image, Bitmap imageNoTr, DataObject data)
{
    Clipboard.Clear();
    data ??= new DataObject(); //Null-conditional operator for brevity

    imageNoTr ??= image; //Null-conditional operator for brevity

    using (MemoryStream pngMemStream = new MemoryStream())
    using (MemoryStream dibMemStream = new MemoryStream())
    {
        data.SetData(DataFormats.Bitmap, true, imageNoTr);
        image.Save(pngMemStream, ImageFormat.Png);
        data.SetData("PNG", false, pngMemStream);

        byte[] dibData = ConvertToDib(image);
        dibMemStream.Write(dibData, 0, dibData.Length);
        data.SetData(DataFormats.Dib, false, dibMemStream);
        Clipboard.SetDataObject(data, true);
    }
}

public static Bitmap GetClipboardImage(DataObject retrievedData)
{
    Bitmap clipboardimage = null;

    if (retrievedData.GetDataPresent("PNG", false))
    {
        MemoryStream pngStream = retrievedData.GetData("PNG", false) as MemoryStream;
        using (Bitmap bm = new Bitmap(pngStream))
            clipboardimage = ImageUtils.CloneImage(bm);
    }
    else if (retrievedData.GetDataPresent(DataFormats.Dib, false))
    {
        MemoryStream dib = retrievedData.GetData(DataFormats.Dib, false) as MemoryStream;
        clipboardimage = dib != null ? ImageFromClipboardDib(dib.ToArray()) : null;
    }
    else if (retrievedData.GetDataPresent(DataFormats.Bitmap))
    {
        clipboardimage = new Bitmap(retrievedData.GetData(DataFormats.Bitmap) as Image);
    }
    else if (retrievedData.GetDataPresent(typeof(Image)))
    {
        clipboardimage = new Bitmap(retrievedData.GetData(typeof(Image)) as Image);
    }

    return clipboardimage;
}
로그인 후 복사

위 내용은 Windows 클립보드에 이미지를 복사할 때 투명성을 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿