2012-12-21 1 views
3

질문기존 픽셀 데이터 주위에 TCanvas를 래핑하는 방법은 무엇입니까?

비트 맵 이미지를 보유하는 32 비트 픽셀 데이터 배열이 있습니다.

TPixel = packed record 
    B: Byte; 
    G: Byte; 
    R: Byte; 
    A: Byte; 
end; 

Size = MyBitmapWidth * MyBitmapHeight; 

MyBitmapData : array[0..Size-1] of TPixel; 

새로운 TCanvas 개체를 만들어 기존 픽셀 데이터에 첨부 할 수 있습니까? 캔버스 객체에는 핸들이 할당되어야합니다.

배경

I는 (32 개 비트 픽셀들의 배열로), 비트 맵 데이터를 생성하는 타사 라이브러리를 사용하고 있습니다. TCanvas.Handle을 매개 변수로 사용하는 다른 함수에서 동일한 픽셀 데이터를 사용하고 싶습니다.

+0

이 함수가'TCanvas.Handle'을 인수로 취하면 실제로는'TCanvas'가 필요하지 않습니다. 필요한 것은 Windows 장치 컨텍스트의 핸들 인 'HDC'입니다. –

+1

나는 그것이 불가능한 이유를 설명하는 답을 쓰고 있지만 지금은있을 것이라고 생각합니다. 픽셀 버퍼에 대한 참조를 담고있는'HBitmap'을 생성 한 다음, DC (CreateCompatibleDC와 함께)를 생성하고 마지막으로 DC로 (SelectObject와 함께) 비트 맵을 선택할 수 있어야합니다. 내가 확신 할 수없는 유일한 부분은 첫 번째 부분이다. 'CreateDIBitmap' 또는'CreateDIBSection'이 원본 데이터에 대한 참조를 유지하는지 여부는 문서에서 알 수 없습니다. ('TCanvas'는 그 과정과 관련이 없지만, 정말로 필요할 경우'Handle : = hDC'를 할당하십시오.) –

답변

1

배열의 데이터 방향에 따라 방향을 다음과 같이 변경해야 할 수 있습니다. pscanLine32 [j] .rgbReserved : = Arr [i * Width + Height - j] .A;

type 
    TPixel = packed record 
    B: Byte; 
    G: Byte; 
    R: Byte; 
    A: Byte; 
    end; 

    TMyBitmapData = array of TPixel; 

type 
    pRGBQuadArray = ^TRGBQuadArray; 
    TRGBQuadArray = ARRAY [0 .. $EFFFFFF] OF TRGBQuad; 

Procedure FillBitMap(var bmp: TBitMap; Arr: TMyBitmapData; Width, Height: Integer); 
var 
    pscanLine32: pRGBQuadArray; 
    i, j: Integer; 
begin 
    if not Assigned(bmp) then 
    bmp := TBitMap.Create; 
    bmp.PixelFormat := pf32Bit; 
    bmp.ignorepalette := true; 
    bmp.Width := Width; 
    bmp.Height := Height; 
    for i := 0 to bmp.Height - 1 do 
    begin 
    pscanLine32 := bmp.Scanline[i]; 
    for j := 0 to bmp.Width - 1 do 
    begin 
     pscanLine32[j].rgbReserved := Arr[i * Width + j].A; 
     pscanLine32[j].rgbBlue := Arr[i * Width + j].B; 
     pscanLine32[j].rgbRed := Arr[i * Width + j].R; 
     pscanLine32[j].rgbGreen := Arr[i * Width + j].G; 
    end; 
    end; 
end; 

procedure TForm4.Button1Click(Sender: TObject); 
var 
    MyBitmapWidth: Integer; 
    MyBitmapHeight: Integer; 
    Size: Cardinal; 
    MyBitmapData: TMyBitmapData; 
    bmp: TBitMap; 
    x: Integer; 
begin 
    MyBitmapWidth := 100; 
    MyBitmapHeight := 100; 
    Size := MyBitmapWidth * MyBitmapHeight; 
    SetLength(MyBitmapData, Size); 

    for x := 0 to MyBitmapWidth - 1 do 
    begin 
    MyBitmapData[x * MyBitmapWidth + x].A := 255; 
    MyBitmapData[x * MyBitmapWidth + x].R := 255; 
    end; 


    bmp := TBitMap.Create; 
    try 
    FillBitMap(bmp, MyBitmapData, MyBitmapWidth,MyBitmapHeight); 
    Image1.picture.Assign(bmp); 
    finally 
    bmp.Free; 
    end; 

end; 
+2

당신의 답은 픽셀 데이터의 전체 복사본을 만드는 것처럼 보입니다. 나는 그것이 질문이 요구하는 것이라고 생각하지 않는다. 오히려 질문은 * 기존 * 픽셀 버퍼 주변에 TCanvas 객체를 래핑하는 방법을 묻습니다. 그 효과는'TCanvas' 객체의 메소드를 호출하면 (자), 원의 버퍼의 내용이 직접 변경됩니다. –

+0

@RobKennedy 나는 shure가 아니지만 Bitmap과 HDC의 외부 DBI 구조를 사용할 수 있다고 생각하지 않습니다. 내 주제를 Off Topic으로 삭제해야합니까? – bummi

+0

Bummi에게 감사하지만 Rob이 맞습니다. 나는'TCanvas' 객체를 만들고 기존 픽셀 데이터에 그려 넣고 싶습니다. – Shannon

관련 문제