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문을 지우면 그림은 제대로 불러와 집니다.