Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
[wlfans]두개의 이미지합성에 관하여?급합니다.
이미지가 두개 있습니다.
이미지1은 배경
이미지2는 사진(인물은외에는 일정한 색(파랑이나 검정)
두이미지를 합성하고 싶은데 쉽지가 않네요.
배경이미지에 이미지2를(인물부분만)합성해서
새이미지를 만들어 저장해야하거든요.
부탁합니다.
질문만 올려서 죄송....^^;
1
COMMENTS
이정욱
•
1999.04.04 04:55
하이텔서 퍼왔습니다.
번 호 : 2827
게시자 : 민성기 (오랑캐꽃)
등록일 : 1999-02-27 23:55
제 목 : [응모] 델파이 퀴즈...
안녕하세요... 민성기 입니다.
항상 퀴즈를 내 주시는 지훈님께 감사 드리며... ^^;
음... 예전엔 복잡하고 희안하게 했다가... 요즘엔 RX의 소스를
고대로 배껴서 쓰고 있습니다. 빠르고 좋길래... 흐흐흐...
퀴즈 응모 입니당...
procedure StretchBltTransparent(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; Palette: HPalette;
TransparentColor: TColorRef);
const
PaletteMask = $02000000;
var
Color: TColorRef;
bmAndBack, bmAndObject, bmAndMem, bmSave:HBitmap;
bmBackOld, bmObjectOld, bmMemOld, bmSaveOld: HBitmap;
MemDC, BackDC, ObjectDC, SaveDC: HDC;
palDst, palMem, palSave, palObj: HPalette;
function PaletteColor(Color: TColor): Longint;
begin
Result := ColorToRGB(Color) or PaletteMask;
end;
begin
{ Create some DCs to hold temporary data }
BackDC := CreateCompatibleDC(DstDC);
ObjectDC := CreateCompatibleDC(DstDC);
MemDC := CreateCompatibleDC(DstDC);
SaveDC := CreateCompatibleDC(DstDC);
{ Create a bitmap for each DC }
bmAndObject := CreateBitmap(SrcW, SrcH, 1, 1, nil);
bmAndBack := CreateBitmap(SrcW, SrcH, 1, 1, nil);
bmAndMem := CreateCompatibleBitmap(DstDC, DstW, DstH);
bmSave := CreateCompatibleBitmap(DstDC, SrcW, SrcH);
{ Each DC must select a bitmap object to store pixel data }
bmBackOld := SelectObject(BackDC, bmAndBack);
bmObjectOld := SelectObject(ObjectDC, bmAndObject);
bmMemOld := SelectObject(MemDC, bmAndMem);
bmSaveOld := SelectObject(SaveDC, bmSave);
{ Select palette }
palDst := 0; palMem := 0; palSave := 0; palObj := 0;
if Palette <> 0 then begin
palDst := SelectPalette(DstDC, Palette, True);
RealizePalette(DstDC);
palSave := SelectPalette(SaveDC, Palette, False);
RealizePalette(SaveDC);
palObj := SelectPalette(ObjectDC, Palette, False);
RealizePalette(ObjectDC);
palMem := SelectPalette(MemDC, Palette, True);
RealizePalette(MemDC);
end;
{ Set proper mapping mode }
SetMapMode(SrcDC, GetMapMode(DstDC));
SetMapMode(SaveDC, GetMapMode(DstDC));
{ Save the bitmap sent here }
BitBlt(SaveDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SRCCOPY);
{ Set the background color of the source DC to the color, }
{ contained in the parts of the bitmap that should be transparent }
Color := SetBkColor(SaveDC, PaletteColor(TransparentColor));
{ Create the object mask for the bitmap by performing a BitBlt() }
{ from the source bitmap to a monochrome bitmap }
BitBlt(ObjectDC, 0, 0,SrcW, SrcH, SaveDC, 0, 0, SRCCOPY);
{ Set the background color of the source DC back to the original }
SetBkColor(SaveDC, Color);
{ Create the inverse of the object mask }
BitBlt(BackDC, 0, 0, SrcW, SrcH, ObjectDC, 0, 0, NOTSRCCOPY);
{ Copy the background of the main DC to the destination }
BitBlt(MemDC, 0, 0, DstW, DstH, DstDC, DstX, DstY, SRCCOPY);
{ Mask out the places where the bitmap will be placed }
StretchBlt(MemDC, 0, 0, DstW, DstH, ObjectDC, 0, 0, SrcW, SrcH, SRCAND);
{ Mask out the transparent colored pixels on the bitmap }
BitBlt(SaveDC, 0, 0, SrcW, SrcH, BackDC, 0, 0, SRCAND);
{ XOR the bitmap with the background on the destination DC }
StretchBlt(MemDC, 0, 0, DstW, DstH, SaveDC, 0, 0, SrcW, SrcH, SRCPAINT);
{ Copy the destination to the screen }
BitBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0,
SRCCOPY);
{ Restore palette }
if Palette <> 0 then begin
SelectPalette(MemDC, palMem, False);
SelectPalette(ObjectDC, palObj, False);
SelectPalette(SaveDC, palSave, False);
SelectPalette(DstDC, palDst, True);
end;
{ Delete the memory bitmaps }
DeleteObject(SelectObject(BackDC, bmBackOld));
DeleteObject(SelectObject(ObjectDC, bmObjectOld));
DeleteObject(SelectObject(MemDC, bmMemOld));
DeleteObject(SelectObject(SaveDC, bmSaveOld));
{ Delete the memory DCs }
DeleteDC(MemDC);
DeleteDC(BackDC);
DeleteDC(ObjectDC);
DeleteDC(SaveDC);
end;
헥헥~
쓸 때는 다음과 같이 ... ^^;
procedure TForm1.Button1Click(Sender: TObject);
var
DestBitmap : TBitmap;
SrcBitmap : TBitmap;
begin
DestBitmap := TBitmap.Create;
SrcBitmap := TBitmap.Create;
try
DestBitmap.Width := Image2.Picture.Bitmap.Width;
DestBitmap.Height := Image2.Picture.Bitmap.Height;
DestBitmap.Canvas.Draw(0, 0, Image2.Picture.Bitmap);
SrcBitmap.Assign(Image1.Picture.Bitmap);
StretchBltTransparent(
DestBitmap.Canvas.Handle,
0, 0, DestBitmap.Width, DestBitmap.height,
SrcBitmap.Canvas.Handle,
0, 0, SrcBitmap.Width, SrcBitmap.Height,
SrcBitmap.Palette,
clBlack
);
Image3.Picture.Bitmap.Assign(DestBitmap);
finally
DestBitmap.Free;
SrcBitmap.Free;
end;
end;
음... Image2의 이미지 중 검은 부분을 Image1에 '투명'하게
올려서리... Image3에 보여주는 놈 입니다.
이번 기회에 성능 죽여주는 투명 비트맵 예제를 건질 수 있으면
좋겠네요~
이상돈 wrote:
> 이미지가 두개 있습니다.
> 이미지1은 배경
> 이미지2는 사진(인물은외에는 일정한 색(파랑이나 검정)
> 두이미지를 합성하고 싶은데 쉽지가 않네요.
> 배경이미지에 이미지2를(인물부분만)합성해서
> 새이미지를 만들어 저장해야하거든요.
> 부탁합니다.
> 질문만 올려서 죄송....^^;
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
공대규
•
1999.04.13 23:50
1
COMMENTS
/
0
LIKES
[Q] VGA 메모리 핸들링 펑션에 대해서 ?
안치봉
•
1999.04.14 00:21
공대규 wrote: > 안녕하신가요? 여러분들... > > 뭐 좀 여쭤 볼께요. > > 버퍼에 있는 Raw Image Da...
김용진
1999.04.13 21:10
0
COMMENTS
/
0
LIKES
델파이4.0 BDE에 관해.....
이진수
•
1999.04.13 10:49
1
COMMENTS
/
0
LIKES
MediaPlayer에 관해서...
신인재
•
1999.04.13 19:58
이진수 wrote: > 안녕하세요.. > 성실한 답변에 항상 감사드립니다.. > > 1) MediaPlayer 컴포넌트를 ...
이순희
•
1999.04.13 03:32
1
COMMENTS
/
0
LIKES
질의결과를 중간에 저장할 수 있는지..
신인재
•
1999.04.13 04:18
이순희 wrote: > 저번의 답변 너무 고마웠습니다.. > 이번에는 다름이 아니라... > 질의에 대한 결과를 ...
공대규
•
1999.04.12 23:46
2
COMMENTS
/
0
LIKES
[Q]TMemoryStream 을 소켓을 통해 전송하기
안치봉
•
1999.04.13 01:05
공대규 wrote: > 안녕하십니까? 질문이 있어서요... > > 1. 버퍼에 있는 로우 포맷의 이미지 데이타를 ...
공대규
•
1999.04.13 23:49
안치봉 wrote: > 공대규 wrote: > > 안녕하십니까? 질문이 있어서요... > > > > 1. 버퍼에 있는 로우 ...
이순희
•
1999.04.12 23:31
1
COMMENTS
/
0
LIKES
테이블 만들시 Time type에 대하여
안치봉
•
1999.04.13 02:21
이순희 wrote: > 안녕하세요.... > 여기 오니깐 보고 배울 것이 참 많군요.. > 다름이 아니라... 델파이...
김재현
•
1999.04.12 23:22
1
COMMENTS
/
0
LIKES
TDatabase 여러개 사용 법
배리스
•
1999.04.18 02:04
김재현 wrote: > 델파이로 CGI 프로그래밍을 하고 있습니다. > ISAPI 방식이 아닌 Standard-alone(EXE 방...
이진수
•
1999.04.12 21:33
1
COMMENTS
/
0
LIKES
테이블의 이미지 데이터를 직접 가져올수 있나요?
신인재
•
1999.04.13 04:32
이진수 wrote: > 안녕하세요..수고 많으십니다. > 다름이 아니고 테이블안에서 텍스트로Search를 해서 그...
최기훈
•
1999.04.12 20:55
1
COMMENTS
/
0
LIKES
Delphi에서 DCOM의 ConnectionPoint를 어떻게 처리합니까?
이정욱
•
1999.04.13 04:21
comobj.pas 파일을 보시면 advise메소드를 이용한 connect와 disconnect가 있습니다. 내부적으로 QueryInt...
홍정희
1999.04.11 08:21
0
COMMENTS
/
0
LIKES
후킹? [winsocket spy?]
이원중
•
1999.04.11 01:36
1
COMMENTS
/
0
LIKES
델파이가 비주얼베이직보다 좋은 이유?
이정욱
•
1999.04.11 08:10
비베와 델파이... 사용자적 입장에서 봐야 합니다. 만약에 빌게이츠 처럼 베이직을 좋아하는 사람이라면,...
이해진
•
1999.04.10 06:52
1
COMMENTS
/
0
LIKES
에디트에서 받은 문자열 검색 방법 - 119
김영묵
•
1999.04.10 18:43
다음과 같이 해보세요... sql.add('select * from smf_db where s_subject like ''%'+edit1.text+'%'' o...
qreport
•
1999.04.08 22:36
1
COMMENTS
/
0
LIKES
qreport 모아서 프린터
이정욱
•
1999.04.08 23:03
com이라는 컴포넌트가 무엇인지요? 세로는 되는데 가로는 안된다면... 확실하지는 않지만 가로의 길이가...
이진수
•
1999.04.08 19:05
1
COMMENTS
/
0
LIKES
[BDE]와 DLL에 관해...
이정욱
•
1999.04.08 23:01
C++로 만든 DLL을 사용하시려면 먼저 *.h의 헤더파일을 델파이용으로 변환하셔야 합니다. 그러면 그 이후에...
심경섭
•
1999.04.07 19:09
1
COMMENTS
/
0
LIKES
순차적으로 에디트시 에러발생...
이정욱
•
1999.04.08 22:55
repeat until 문으로 대체해 보세요. 심경섭 wrote: > 한 레코드의 한 필드를 처음부터 순차적으로 수...
심경섭
•
1999.04.07 19:02
1
COMMENTS
/
0
LIKES
메모컴폰넌트와 qreport의 메모컨컴포넌트
안치봉
•
1999.04.07 19:54
심경섭 wrote: > 메모컴포넌트의 텍스트 내용을 그대로 > > 인쇄를 하려고 레포트에 메모컴포넌트를 썼...
김영묵
•
1999.04.07 17:48
3
COMMENTS
/
0
LIKES
Invalid BLOB handle Error발생
이정욱
•
1999.04.08 22:57
현재 사용하시는 델파이 버전이 어떻게 되는지요? 김영묵 wrote: > 안녕하세요.. 처음으로 이곳에 도착...
김영묵
•
1999.04.09 04:41
델파이 3.0 c/s버전입니다. 참고로 BDE에서 BLOB chace size를 늘려주었는데도 안됩니다. 이정욱 ...
이정욱
•
1999.04.10 19:21
사실은 제가 DB쪽은 잘 모르지만.. ^^; 오라클 8.0을 제데로 지원할 수 있는것은 델파이4라고 하네요. 오...
조휴관
•
1999.04.07 05:28
1
COMMENTS
/
0
LIKES
코드 편집기 부분에 대해 알고 싶어요..!
안치봉
•
1999.04.07 08:46
조휴관 wrote: > 델파이를 시작한지 얼마 되지 않아서요.. > 폼이 처음 생성 되고 코드 편집기로 들어가...
율보
•
1999.04.07 02:42
1
COMMENTS
/
0
LIKES
으.. 후킹되기는 되는데.... T_T
안치봉
•
1999.04.07 02:55
율보 wrote: > 으.. 알려주세요.. > 후킹은 문제없이 됩니다.. > 또한 spy로 살펴보니 키스트로크도 제...
이상돈
•
1999.04.03 22:08
1
COMMENTS
/
0
LIKES
[wlfans]두개의 이미지합성에 관하여?급합니다.
이미지가 두개 있습니다. 이미지1은 배경 이미지2는 사진(인물은외에는 일정한 색(파랑이나 검정) 두이미지를 합성하고 싶은데 쉽지가 않네요. 배경이미지에 이미지2를(인물부분만)합성해서 새이미지를 만들어 저장해야하거든요. 부탁합니...
이정욱
•
1999.04.04 04:55
하이텔서 퍼왔습니다. 번 호 : 2827 게시자 : 민성기 (오랑캐꽃) 등록일 : 1999-02-27 23:55 제 ...
이상돈
1999/04/03 22:08
Views
300
Likes
0
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
번 호 : 2827
게시자 : 민성기 (오랑캐꽃)
등록일 : 1999-02-27 23:55
제 목 : [응모] 델파이 퀴즈...
안녕하세요... 민성기 입니다.
항상 퀴즈를 내 주시는 지훈님께 감사 드리며... ^^;
음... 예전엔 복잡하고 희안하게 했다가... 요즘엔 RX의 소스를
고대로 배껴서 쓰고 있습니다. 빠르고 좋길래... 흐흐흐...
퀴즈 응모 입니당...
procedure StretchBltTransparent(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; Palette: HPalette;
TransparentColor: TColorRef);
const
PaletteMask = $02000000;
var
Color: TColorRef;
bmAndBack, bmAndObject, bmAndMem, bmSave:HBitmap;
bmBackOld, bmObjectOld, bmMemOld, bmSaveOld: HBitmap;
MemDC, BackDC, ObjectDC, SaveDC: HDC;
palDst, palMem, palSave, palObj: HPalette;
function PaletteColor(Color: TColor): Longint;
begin
Result := ColorToRGB(Color) or PaletteMask;
end;
begin
{ Create some DCs to hold temporary data }
BackDC := CreateCompatibleDC(DstDC);
ObjectDC := CreateCompatibleDC(DstDC);
MemDC := CreateCompatibleDC(DstDC);
SaveDC := CreateCompatibleDC(DstDC);
{ Create a bitmap for each DC }
bmAndObject := CreateBitmap(SrcW, SrcH, 1, 1, nil);
bmAndBack := CreateBitmap(SrcW, SrcH, 1, 1, nil);
bmAndMem := CreateCompatibleBitmap(DstDC, DstW, DstH);
bmSave := CreateCompatibleBitmap(DstDC, SrcW, SrcH);
{ Each DC must select a bitmap object to store pixel data }
bmBackOld := SelectObject(BackDC, bmAndBack);
bmObjectOld := SelectObject(ObjectDC, bmAndObject);
bmMemOld := SelectObject(MemDC, bmAndMem);
bmSaveOld := SelectObject(SaveDC, bmSave);
{ Select palette }
palDst := 0; palMem := 0; palSave := 0; palObj := 0;
if Palette <> 0 then begin
palDst := SelectPalette(DstDC, Palette, True);
RealizePalette(DstDC);
palSave := SelectPalette(SaveDC, Palette, False);
RealizePalette(SaveDC);
palObj := SelectPalette(ObjectDC, Palette, False);
RealizePalette(ObjectDC);
palMem := SelectPalette(MemDC, Palette, True);
RealizePalette(MemDC);
end;
{ Set proper mapping mode }
SetMapMode(SrcDC, GetMapMode(DstDC));
SetMapMode(SaveDC, GetMapMode(DstDC));
{ Save the bitmap sent here }
BitBlt(SaveDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SRCCOPY);
{ Set the background color of the source DC to the color, }
{ contained in the parts of the bitmap that should be transparent }
Color := SetBkColor(SaveDC, PaletteColor(TransparentColor));
{ Create the object mask for the bitmap by performing a BitBlt() }
{ from the source bitmap to a monochrome bitmap }
BitBlt(ObjectDC, 0, 0,SrcW, SrcH, SaveDC, 0, 0, SRCCOPY);
{ Set the background color of the source DC back to the original }
SetBkColor(SaveDC, Color);
{ Create the inverse of the object mask }
BitBlt(BackDC, 0, 0, SrcW, SrcH, ObjectDC, 0, 0, NOTSRCCOPY);
{ Copy the background of the main DC to the destination }
BitBlt(MemDC, 0, 0, DstW, DstH, DstDC, DstX, DstY, SRCCOPY);
{ Mask out the places where the bitmap will be placed }
StretchBlt(MemDC, 0, 0, DstW, DstH, ObjectDC, 0, 0, SrcW, SrcH, SRCAND);
{ Mask out the transparent colored pixels on the bitmap }
BitBlt(SaveDC, 0, 0, SrcW, SrcH, BackDC, 0, 0, SRCAND);
{ XOR the bitmap with the background on the destination DC }
StretchBlt(MemDC, 0, 0, DstW, DstH, SaveDC, 0, 0, SrcW, SrcH, SRCPAINT);
{ Copy the destination to the screen }
BitBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0,
SRCCOPY);
{ Restore palette }
if Palette <> 0 then begin
SelectPalette(MemDC, palMem, False);
SelectPalette(ObjectDC, palObj, False);
SelectPalette(SaveDC, palSave, False);
SelectPalette(DstDC, palDst, True);
end;
{ Delete the memory bitmaps }
DeleteObject(SelectObject(BackDC, bmBackOld));
DeleteObject(SelectObject(ObjectDC, bmObjectOld));
DeleteObject(SelectObject(MemDC, bmMemOld));
DeleteObject(SelectObject(SaveDC, bmSaveOld));
{ Delete the memory DCs }
DeleteDC(MemDC);
DeleteDC(BackDC);
DeleteDC(ObjectDC);
DeleteDC(SaveDC);
end;
헥헥~
쓸 때는 다음과 같이 ... ^^;
procedure TForm1.Button1Click(Sender: TObject);
var
DestBitmap : TBitmap;
SrcBitmap : TBitmap;
begin
DestBitmap := TBitmap.Create;
SrcBitmap := TBitmap.Create;
try
DestBitmap.Width := Image2.Picture.Bitmap.Width;
DestBitmap.Height := Image2.Picture.Bitmap.Height;
DestBitmap.Canvas.Draw(0, 0, Image2.Picture.Bitmap);
SrcBitmap.Assign(Image1.Picture.Bitmap);
StretchBltTransparent(
DestBitmap.Canvas.Handle,
0, 0, DestBitmap.Width, DestBitmap.height,
SrcBitmap.Canvas.Handle,
0, 0, SrcBitmap.Width, SrcBitmap.Height,
SrcBitmap.Palette,
clBlack
);
Image3.Picture.Bitmap.Assign(DestBitmap);
finally
DestBitmap.Free;
SrcBitmap.Free;
end;
end;
음... Image2의 이미지 중 검은 부분을 Image1에 '투명'하게
올려서리... Image3에 보여주는 놈 입니다.
이번 기회에 성능 죽여주는 투명 비트맵 예제를 건질 수 있으면
좋겠네요~
이상돈 wrote:
> 이미지가 두개 있습니다.
> 이미지1은 배경
> 이미지2는 사진(인물은외에는 일정한 색(파랑이나 검정)
> 두이미지를 합성하고 싶은데 쉽지가 않네요.
> 배경이미지에 이미지2를(인물부분만)합성해서
> 새이미지를 만들어 저장해야하거든요.
> 부탁합니다.
> 질문만 올려서 죄송....^^;