C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[62642] Re:Re:Re:이미지를 결합할때는 어떻게 해야 하나요???
박영목.월천 [gsbsoft] 3370 읽음    2010-10-11 19:04
merge_jpg_2.png 500.6KB 배경 투명 합성
답변을 하고 나서... 가만히 생각하니... 언젠가 투명으로 쓸 곳이 있어서...
연구를 했었다는 생각이 나더군요...  다시 첨부터 하려면 또 시간 갈 것이고...

그래서 혹 하는 마음에... 찾아보기로 했습니다. 그런데 어느 컴퓨터인지?
그리고 하드도 한번 날린 적도 있고 해서... 혹시나 하고 찾았는 데...
제가 정리는 잘 못해도... 제목은 항상 잘 달기 때문에....  쉽게 찾았습니다.

저 소스를 어디서 받았을 것인데... 델파이 소스, 출처는 모르겠고...
뭐 약간 생각하면 누구나 할 수 있는 것이기도 하고... 또 모르면 잘 안되고..
중간 에 하나 틀리면 또 안되고... 여하튼 별것 아니지만.... 또 올려 드릴께요...
이제 이미지 합성은 여기까지만 하지요...  ㅋㅋㅋ    기회 되면 밥 사세요....  ㅋㅋㅋ

부산에서 월천 올렸습니다.


원본 사진

로고 반투명 합성

로고 반투명 합성(배경 투명)



//---------------------------------------------------------------------------

#include 
#include 
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "GR32_Image"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


// D://mychildren.JPG 를 불러와서...
// 글자를 반투명하게 넣고 ...
// D://mychildren_copy.JPG 로 저장한다.

// 투명도 조절할 수도 있다.

void __fastcall TForm1::BtnLoadClick(TObject *Sender)
{
  //TImage로 JPG로 불러온다.
  Image321->Bitmap->LoadFromFile( "D:\\mychildren.JPG" );
}
//---------------------------------------------------------------------------


void __fastcall TForm1::BtnWriteClick(TObject *Sender)
{
  Image321->Bitmap->Font->Name  = "Arial Black";
  Image321->Bitmap->Font->Size  = 36;
  Image321->Bitmap->Font->Style = Image321->Bitmap->Font->Style << fsBold;;
  Image321->Bitmap->RenderText( 96, 32, "Merry Christmas", 200, 0x80FF0000);
                                 //x  y   내용               //안티알리아싱,
  //Image321->Bitmap->RenderText( 96, 32, "Merry Christmas", 200, 0x80FF0000);

  //0x80FF0000  80: BYTE는 FF이면 투명도 없음, 80이면 중간 정도입니다.
  //그 다음 FF 00 00 는 알겠지요...  R G B 입니다.

  //Image321->Bitmap->CombineMode
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BtnSaveClick(TObject *Sender)
{
  //JPG로 저장하기 위해...
  TJPEGImage  *jpg = new TJPEGImage();

  //Image32에서 바로 TJPEGImage에 넣지 못하므로 TBitmap로 바꾼다. 그리고  TJPEGImage으로
  Graphics::TBitmap *bmp = new Graphics::TBitmap();
  bmp->Assign(Image321->Bitmap);
  jpg->Assign( bmp );

  jpg->CompressionQuality = 80;   //80%로
  jpg->Compress();                //압축한다.  물론 손실압축이지요.

  jpg->SaveToFile( "D:\\mychildren_copy.JPG"  );

  delete bmp;
  delete jpg;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::BtnImageMergeClick(TObject *Sender)
{
  if( Image321->Bitmap->Empty()==true )
  {
    ShowMessage( "먼저 이미지를 불러 오세요" );
    return;
  }

  Image322->Bitmap->DrawMode =  dmBlend;

  Image322->Bitmap->MasterAlpha = 80;

  Image321->Bitmap->Draw( 150, 162, Image322->Bitmap );
}
//---------------------------------------------------------------------------


/*
원본 소스 이것은 어디서 받았을 것인데... 몇년이 흘러서...
이것을 C로 수정했습니다. 이것도 참고하시고...

procedure CromaKey(ABitmap: TBitmap32; TrColor: TColor32);
var
  P: PColor32;
  C: TColor32;
  I: Integer;
begin
  TrColor := TrColor and $00FFFFFF;
  with ABitmap do
  begin
    P := PixelPtr[0, 0];
    for I := 0 to Width * Height - 1 do
    begin
      C := P^ and $00FFFFFF;
      if C = TrColor then P^ := C;
      Inc(P)
    end;
  end;
end;
*/

void __fastcall CromaKey(TBitmap32 *ABitmap, TColor32 TrColor )
{
  TColor32 *P;
  TColor32 C;
  int I;

  TrColor = TrColor & 0x00FFFFFF;

  P = ABitmap->PixelPtr[0][0];
  I=0;
  while( IWidth * ABitmap->Height )
  {
    C = *P & 0x00FFFFFF;
    if( C==TrColor ) *P = C;
    P++;
    I++;
  }
}

void __fastcall TForm1::BtnTransferClick(TObject *Sender)
{
  if( Image321->Bitmap->Empty()==true )
  {
    ShowMessage( "먼저 이미지를 불러 오세요" );
    return;
  }

  ShowMessage( "혹 앞에 이미지 합성을 했다면 한번 불러오기 하세요" );

  Image322->Bitmap->DrawMode =  dmBlend;

  Image322->Bitmap->MasterAlpha = 80;

  TColor32 c=0x00000000;
  CromaKey( Image322->Bitmap, c );


  Image321->Bitmap->Draw( 150, 162, Image322->Bitmap );
}
//---------------------------------------------------------------------------







이지석 님이 쓰신 글 :
: 한가지 질문 더 드리겠습니다.
: 텍스트는 알려주신데로 해보니 잘됩니다...
: 그런데 이미지를 하려면 어떻게 해야 하나요??
:
: 아래와 같이 하니까 되긴하는데 투명을 어떻게 해야 하는지 찿아봐도 잘 모르겠네요^^
:
: TBitmap32 *b = new TBitmap32();
: b->LoadFromFile("E:\\A.JPG");
:
: Image321->Bitmap->Draw(0, 0, b);
:
:
:
:
: 박영목.월천 님이 쓰신 글 :
: : 안녕하세요.  부산에 계속 살고 있는 월천입니다. 저도 초보인데...  그냥 어제 밤샘을 좀 했더니 낮잠을
: : 자게 되고.. 쩝   잠이 오지 않내요... 그래서...  재미있을 것 같아서...  시작했는 데..  이것도 제법 시간이
: : 갔습니다.  이렇게 되면 오늘 또 낮잠을 자게 될 것 같습니다. 후유증.... ㅋㅋㅋ
: :
: : 저도 사용한지 몇년 되다 보니....  어떻게 사용하더라...???  좀 찾고 한다고....   찾을 때는 google로 하세요
: : 다른 사이트는 답이 없습니다.  검색은 당연히 영어로...
: :
: : 아~ 그리고 마크나 그림도 투명하게 넣을 수 있을 것입니다. 거의 100%,  연구해 보시면... 쉬울 것입니다.
: :
: : 그리고 웹에서 사용하실 것인가요?  PHP 같은 언어에서 사용하게끔 나온 것도 돌아 다닐 것인데..
: : 굳이 응용해서 할 필요가? 웹에서 원본 손상 주지 않고 보여질 때... 마크 투명하게 넣어서...
: : 보여줄 수 있는 데... 제가 해 본 것은 아니고... 몇년 전 PHP 프로그래머가 하더군요...
: : 어디서 찾아보고... 반나절 안걸렸는 데... 그리고 다른 웹언어라고 하더라도 그런 소스나 자료가 있을
: : 것입니다.  웹에서 사용할 것이면 웹프로그래머에게 자료를 찾아 적용시키라고 하세요... 간단히..
: : 해결될 것입니다. 저는 요즘 PHP도 좀 해보고 JSP도 해보고 합니다. JSP가 상당히 괜찮다는 생각이
: : 아직 초보라... 다 만들지는 못하고 연습하는 정도... 이런 것은 언제 사용하지... 웹프로그래머로 전향할까?
: :
: : 그래도 질문을 하셨으니...  답을 드려야지요...  GDI+에서도 잘 될 것이라 생각합니다.
: : 방법은 여러가지이지만... 원리는 같으니까!
: :
: : 여기서는 GR32 Component를 사용했습니다. 이게 알파값을 넣을 수 있기 때문에... 투명값을 조절할 수 있습니다.
: : 저도 왠만하면 이런 것 잘 사용하지 않는 데... 이런 곳에는 사용하는 것이 정신 건강에 이롭겠지요...
: :
: : JPG에 글을 쓴다. JPG는 손실압축이지요... 글을 쓰려고 하면 바로 쓸 수 없습니다. 컴퓨터 내부에서 그림(GIF, JPG...)은 전부 BITMAP로 처리되지요... BITMAP로 바꾸어야  뭐 할 수 있다는... GIF, JPG는 사실 그림이기 보다는 그냥 DATA
: : 로 보시면 되고 이것을 읽어서 풀어 화면에 나타날 때는 BITMAP이라 보시면 됩니다. 저도 잘 몰라요...
: : 어디서 들었는지... 그냥 그렇게 생각하는지... 중요한 것도 아니고... ㅋㅋㅋ
: :
: : 어쨌던 JPG은 BITMAP를 손상시키면서 압축을 시켜두었고... 이것을 다시 불러와서 BITMAP으로 만들고
: : 그 위에 글을 반투명하게 쓰고 다시 JPG로 압축해야 하니.... 또 손실이 조금 발생하겠지요...
: :
: : 다 아실 것인데... 혹 모르는 다른 분이 있을까 싶어 적어 보았습니다.
: : 
: :
: : 그냥 소스 보시면 이해가 쉬울 것입니다.
: :
: : 그리고 소스, 실행파일 전부 올립니다. 참고 하시고...
: :
: : 물론 GR32를 설치하셔야 합니다. 이것 자료실에 있을 것이고 사용법이나 설치법들은 이곳에 계시는 많은 고수님들께 물어보면 답을 주실 것입니다.
: :
: : 그럼 저는 이제 물러 갑니다.  하시는 프로젝트 잘 끝내시기를 바랍니다.   
: :
: :
: :
: : //---------------------------------------------------------------------------
: : 
: : #include 
: : #include 
: : #pragma hdrstop
: : 
: : #include "Unit1.h"
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma link "GR32_Image"
: : #pragma resource "*.dfm"
: : TForm1 *Form1;
: : //---------------------------------------------------------------------------
: : __fastcall TForm1::TForm1(TComponent* Owner)
: :         : TForm(Owner)
: : {
: : }
: : //---------------------------------------------------------------------------
: : 
: : 
: : // D://mychildren.JPG 를 불러와서...
: : // 글자를 반투명하게 넣고 ...
: : // D://mychildren_copy.JPG 로 저장한다.
: : 
: : // 투명도 조절할 수도 있다.
: : 
: : void __fastcall TForm1::BtnLoadClick(TObject *Sender)
: : {
: :   //TImage로 JPG로 불러온다.
: :   Image321->Bitmap->LoadFromFile( "D:\\mychildren.JPG" );
: : }
: : //---------------------------------------------------------------------------
: : 
: : 
: : void __fastcall TForm1::BtnWriteClick(TObject *Sender)
: : {
: :   Image321->Bitmap->Font->Name  = "Arial Black";
: :   Image321->Bitmap->Font->Size  = 36;
: :   Image321->Bitmap->Font->Style = Image321->Bitmap->Font->Style << fsBold;;
: :   Image321->Bitmap->RenderText( 96, 32, "Merry Christmas", 200, 0x80FF0000);
: :                                  //x  y   내용               //안티알리아싱,
: :   //Image321->Bitmap->RenderText( 96, 32, "Merry Christmas", 200, 0x80FF0000);
: : 
: :   //0x80FF0000  80: BYTE는 FF이면 투명도 없음, 80이면 중간 정도입니다.
: :   //그 다음 FF 00 00 는 알겠지요...  R G B 입니다. 
: : }
: : //---------------------------------------------------------------------------
: : 
: : void __fastcall TForm1::BtnSaveClick(TObject *Sender)
: : {
: :   //JPG로 저장하기 위해...
: :   TJPEGImage  *jpg = new TJPEGImage();
: : 
: :   //Image32에서 바로 TJPEGImage에 넣지 못하므로 TBitmap로 바꾼다. 그리고  TJPEGImage으로
: :   Graphics::TBitmap *bmp = new Graphics::TBitmap();
: :   bmp->Assign(Image321->Bitmap);
: :   jpg->Assign( bmp );
: : 
: :   jpg->CompressionQuality = 80;   //80%로
: :   jpg->Compress();                //압축한다.  물론 손실압축이지요.
: : 
: :   jpg->SaveToFile( "D:\\mychildren_copy.JPG"  );
: : 
: :   delete bmp;
: :   delete jpg;
: : }
: : //---------------------------------------------------------------------------
: : 
: : 

: :  
: :
: :
: : 이지석 님이 쓰신 글 :
: : : JPG 파일에 테스트나 특정 심볼을 약간 반투명하게 결합시키서 그 파일에 다시 업데이트 시키려고 합니다.
: : : 즉, 쇼핑몰 보면 이미지 도용을 막기위해 자기가 찍은 사진위에 특정 텍스트나 자기회사 로고를 반투명하게 결합시키잖아요?
: : :
: : : 그런 원리로 프로그램에서 하려고 하는데요... 어디서부터 시작해야 할지 막막하네요.
: : :
: : : 아시는분 조언 부탁드리겠습니다...

+ -

관련 글 리스트
62615 JPG 파일에 텍스트 합성 이지석 956 2010/10/08
62628     Re:JPG 파일에 텍스트 합성 박영목.월천 1521 2010/10/11
62634         Re:Re:이미지를 결합할때는 어떻게 해야 하나요??? 이지석 863 2010/10/11
62642             Re:Re:Re:이미지를 결합할때는 어떻게 해야 하나요??? 박영목.월천 3370 2010/10/11
62643                 Re:Re:Re:Re:잘됩니다!!! 이지석 1528 2010/10/11
62639             Re:Re:Re:이미지를 결합할때는 어떻게 해야 하나요??? 박영목.월천 1115 2010/10/11
62633         Re:Re:JPG 파일에 텍스트 합성 이지석 1019 2010/10/11
62618     Re:JPG 파일에 텍스트 합성 천재범 1266 2010/10/08
62632         Re:Re:JPG 파일에 텍스트 합성 이지석 1089 2010/10/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.