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
[62952] Re:Image 픽셀값 접근 관련...
장성호 [nasilso] 2597 읽음    2010-11-09 12:07
Image1->Picture->Bitmap 에 대해 ..

음 먼저 jpg파일을 TImage로 load했을때..
Image1->Picture->Bitmap 에는 아무 내용이 없습니다.

TImage로 image파일을 load하면..

TImage->Picture->Graphic 에 담기게 됩니다.

Graphic 은 TBitmap이 될수도 있고 , TJPEGImage 도 될수가 있고
TPNGImage도 될수가 있습니다.
즉 TGraphic 인터페이스를 구현한 어떤 클래스든 가능합니다.

jpg파일을 load했으면
TImage->Picture->Graphic 은 아마 TJPEGImage가 될것입니다.

bitmap을 한 pixel씩 접근하려면 jpegimag를 bitmap으로 변환하시면 됩니다.
다음과 같이..

Pixel접근에 대해
Canvas의 Pixel로 접근하는 방법은 속도도 느리고
기타 다른 문제도 있고 해서  바람직하지 않는것 같습니다.
아래에 scanline으로 접근하면 Pixel로 접근하는것보다는 최소 수십배 빠릅니다.

그럼..



unsigned char** image;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        image = new unsigned char*[256];
        for(int i = 0; i < 256; i++)
        {
                image[i] = new unsigned char[256];
        }


}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(OpenDialog1->Execute())
    {
        TJPEGImage *Hjpeg = new TJPEGImage();
        Hjpeg->LoadFromFile(OpenDialog1->FileName);
        Image1->Picture->Bitmap->Assign(Hjpeg);
        delete Hjpeg;

//        Image1->Picture->Graphic
        int r, g, b, color;
        Image1->Picture->Bitmap->PixelFormat=pf32bit;
        for(int i = 0; i < 256; i++)
        {
            int *p=(int *)Image1->Picture->Bitmap->ScanLine[i];
            for(int j = 0; j < 256; j++)
            {
                color=*p;
                r = color & 0xff;
                g = (color>>8) & 0xff;
                b = (color>>16) & 0xff;
                image[i][j] = (r+g+b)/3;
                p++;
            }
        }   
  
        for(int i = 0; i < 256; i++)   
        {   
                for(int j = 0; j < 256; j++)   
                {   
                        Image2->Canvas->Pixels[i][j] = RGB(image[i][j], image[i][j], image[i][j]);
                }   
        }
    }

}


narsinyak 님이 쓰신 글 :
:
: //---------------------------------------------------------------------------
: 
: #include 
: #pragma hdrstop
: 
: #include "Unit1.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm1 *Form1;
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
:         : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:         if(OpenDialog1->Execute())
:         {
:                 Image1->Picture->LoadFromFile(OpenDialog1->FileName);
:                 int r, g, b, color;
:                 for(int i = 0; i < 256; i++)
:                 {
:                         for(int j = 0; j < 256; j++)
:                         {
:                                 color = Image1->Picture->Bitmap->Canvas->Pixels[i][j];
:                                 r = color & 0xff;
:                                 g = (color>>8) & 0xff;
:                                 b = (color>>16) & 0xff;
:                                 image[i][j] = (r+g+b)/3;
:                         }
:                 }
: 
:                 for(int i = 0; i < 256; i++)
:                 {
:                         for(int j = 0; j < 256; j++)
:                         {
:                                 Image2->Canvas->Pixels[i][j] = RGB(image[i][j], image[i][j], image[i][j]);
:                         }
:                 }
:         }
: }
: //---------------------------------------------------------------------------
: 
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
:         image = new unsigned char*[256];
:         for(int i = 0; i < 256; i++)
:         {
:                 image[i] = new unsigned char[256];
:         }
: }
: //---------------------------------------------------------------------------
: 
: 

:
: 질문 1. jpg이미지를 불러온 후, 그 각각의 픽셀값에 접근하는 법을 잘 모르겠습니다.
:
: 질문 2. 그림을 불러온 후 직후 있는 이중 for문을 돌리면 그림이 다시 사라지는데 그 원인을 잘 모르겠습니다.
: for문을 지우면 그림은 제대로 불러와 집니다.

+ -

관련 글 리스트
62951 Image 픽셀값 접근 관련... narsinyak 1051 2010/11/09
62952     Re:Image 픽셀값 접근 관련... 장성호 2597 2010/11/09
62953         Re:Re:Image 픽셀값 접근 관련... narsinyak 999 2010/11/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.