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
[58785] Re:[질문] 사진(Image)을 원이나 타원형으로 나오게 하는 방법 없나요?
넘초보 [mspower] 1377 읽음    2009-10-15 08:21
웨잇포림 님이 쓰신 글 :
: 안녕하세요.
:
: 이미지(사진)를 원이나 타원형으로 나오게 하고 싶은데 방법을 못 찾겠습니다.
:
: 빌더에 포함되어 있는 TImage 컨트롤은 사각형으로 밖에 안되더군요.
:
: 타원형으로 나오게 할 수 있는 방법이 없을까요?
:
: 감사합니다.

Region 키워드로 검색해 보세요. 아래는 제가 작업했던 소스중 일부 입니다. 참고하세요.^^

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

#include "PreComplieHeader.h"

#include "BitmapRgn.h"

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

#pragma package(smart_init)


//---------------------------------------------------------------------------
__fastcall TBitmapRegin::TBitmapRegin(int DefaultRect)
{
    m_RegionData = NULL;
    DefaultRectCount = DefaultRect;
    TransparentPixel = new char[4];
}
//---------------------------------------------------------------------------
__fastcall TBitmapRegin::~TBitmapRegin()
{
    delete []TransparentPixel;
    if(m_RegionData != NULL){
        delete []m_RegionData;
        m_RegionData = NULL;
    }
}
//---------------------------------------------------------------------------
bool __fastcall TBitmapRegin::IsTransparent(int X)
{
    //typedef TRGBTriple * PTPixels24;
    //PTPixels24 T

    switch(PixelFormat){
        case pf8bit :
            return !memcmp(Pixels, TransparentPixel, 1);
        case pf16bit:
            return !memcmp(Pixels, TransparentPixel, 2);
        case pf24bit:
            /*
            if(
                abs(((TRGBTriple *)Pixels)[X].rgbtRed - PRGBTriple(TransparentPixel)->rgbtRed) < 10 &&
                abs(((TRGBTriple *)Pixels)[X].rgbtGreen - PRGBTriple(TransparentPixel)->rgbtGreen) < 10 &&
                abs(((TRGBTriple *)Pixels)[X].rgbtBlue - PRGBTriple(TransparentPixel)->rgbtBlue) < 10 )
                return true;
            return false;
            */

            if(
                ((TRGBTriple *)Pixels)[X].rgbtRed == PRGBTriple(TransparentPixel)->rgbtRed &&
                ((TRGBTriple *)Pixels)[X].rgbtGreen == PRGBTriple(TransparentPixel)->rgbtGreen &&
                ((TRGBTriple *)Pixels)[X].rgbtBlue == PRGBTriple(TransparentPixel)->rgbtBlue )
                return true;
            return false;
           

        case pf32bit:
            return !memcmp(Pixels, TransparentPixel, 4);
            //Result := TPixels32( Pixels^ )[ X ] = PCardinal( TransparentPixel )^;
    }
    return false;
}
//---------------------------------------------------------------------------
void __fastcall TBitmapRegin::AddRect(bool LastCol)
{
    if((RegionBufferSize / sizeof(TRect)) == m_iRectCount){
        RegionBufferSize += sizeof( TRect ) * DefaultRectCount;
        m_RegionData = (PRgnData)realloc(m_RegionData, sizeof(TRgnDataHeader) + RegionBufferSize + 3);
    }

    if(LastCol) X++;

    ((TRect *)m_RegionData->Buffer)[ m_iRectCount ].Left = NewRectLeft;
    ((TRect *)m_RegionData->Buffer)[ m_iRectCount ].Top = Y;
    ((TRect *)m_RegionData->Buffer)[ m_iRectCount ].Right = X;
    ((TRect *)m_RegionData->Buffer)[ m_iRectCount ].Bottom = Y + 1;

    m_iRectCount++;
    NewRectLeft = -1;
}
//---------------------------------------------------------------------------

HRGN __fastcall TBitmapRegin::CreateBitmapRgn(Graphics::TBitmap *Bitmap)
{
    PixelFormat = Bitmap->PixelFormat;
    Pixels = Bitmap->ScanLine[0];

    switch(PixelFormat){
        case pf8bit  : memcpy(TransparentPixel, Pixels, 1); break;
        case pf16bit : memcpy(TransparentPixel, Pixels, 2); break;
        case pf24bit : memcpy(TransparentPixel, Pixels, 3); break;
        case pf32bit : memcpy(TransparentPixel, Pixels, 4); break;
    }

    m_iRectCount = 0;
    RegionBufferSize = sizeof(TRect) * DefaultRectCount;
    m_RegionData = (PRgnData)new char[sizeof(TRgnDataHeader) + RegionBufferSize + 3];

    try {
        for(Y = 0; Y < Bitmap->Height;Y++){
            Pixels = Bitmap->ScanLine[Y];
            NewRectLeft = -1;
            for(X = 0; X < Bitmap->Width; X++){
                if(IsTransparent(X)){
                    if(NewRectLeft >= 0) AddRect();
                }
                else {
                    if(NewRectLeft == -1) NewRectLeft = X;
                    if((X == Bitmap->Width - 1) && (NewRectLeft >= 0) ) AddRect(true);
                }
            }
        }

        m_RegionData->rdh.dwSize = sizeof(TRgnDataHeader);
        m_RegionData->rdh.iType = RDH_RECTANGLES;
        m_RegionData->rdh.nCount = m_iRectCount;
        m_RegionData->rdh.nRgnSize = m_iRectCount * sizeof( TRect );

        return ExtCreateRegion(NULL, m_RegionData->rdh.dwSize + m_RegionData->rdh.nRgnSize, m_RegionData);
    }
    __finally {
        delete []m_RegionData;
        m_RegionData = NULL;
    }
}
//---------------------------------------------------------------------------




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

#ifndef BitmapRgnH
#define BitmapRgnH
//---------------------------------------------------------------------------

//#include <vcl.h>
//#include <Graphics.hpp>

class TBitmapRegin
{

public:

    __fastcall TBitmapRegin(int DefaultRect = 50);
    __fastcall ~TBitmapRegin();

    HRGN __fastcall CreateBitmapRgn(Graphics::TBitmap *Bitmap);

private:

    int DefaultRectCount;

    TPixelFormat PixelFormat;
    void *Pixels;
    void *TransparentPixel;
    int  RegionBufferSize;
    int  m_iRectCount, NewRectLeft;
    int  X, Y;
    PRgnData m_RegionData;

    bool __fastcall IsTransparent(int X);
    void __fastcall AddRect(bool LastCol = false);

};


#endif

+ -

관련 글 리스트
58782 [질문] 사진(Image)을 원이나 타원형으로 나오게 하는 방법 없나요? 웨잇포림 1113 2009/10/14
58785     Re:[질문] 사진(Image)을 원이나 타원형으로 나오게 하는 방법 없나요? 넘초보 1377 2009/10/15
58789         다음과 같이 해서 해결했습니다. 웨잇포림 1132 2009/10/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.