섹션 2: DBImage를 사용하여 JPEG 추출 - 잘못된 방법
DBImage - 하나 가져오기(DBImage - 하나 가져오기)
델파이로 새로운 것을 하려고 할 때, 제가 가장 먼저 하는 일은 델파이에 내장된 방법에 대한 도움말을 요청하는 것입니다. 도움말 문서에서는 다음과 같이 답변합니다. TDBImage(구성요소 팔레트의 데이터 제어 페이지에 있음)는 데이터베이스의 현재 레코드에 있는 BLOB 필드의 그래픽 이미지를 나타냅니다. TDBImage를 사용하여 그래픽 필드 값을 나타냅니다. TDBImage를 사용하면 양식이 데이터베이스의 그래픽 데이터를 표시할 수 있습니다. TDBImage는 TImage 컴포넌트보다 데이터 가시성 속성이 더 많습니다. 가장 중요한 두 가지 속성은 DataSource(데이터 소스)와 Field(필드)입니다. DataSource 속성은 그래픽 구성 요소를 데이터베이스에 연결합니다. 우리 양식에는 데이터 세트를 나타내는 DataSource1이라는 DataSource 구성 요소가 있습니다. Field 속성은 이미지를 보유하는 테이블의 필드를 나타냅니다.
모든 것이 명확합니다. 이제 DBImage 구성 요소를 양식에 배치하고 기본적으로 이름을 DBImage1로 지정합니다. DBImage를 테이블의 BLOB 필드에 실제로 연결하려면 다음 구성만 수행하면 됩니다(Object Inspector 사용).
DBImage1.DataSource = 데이터소스1
DBImage1.Field = 그림
이는 애플리케이션 테이블의 사진 필드에 존재하는 JPEG 이미지를 표시하기 위해 필요한 트릭입니다.
이 구성이 작동하는지 확인하려면 ADOTable1 구성 요소의 Active 속성을 True로 설정하기만 하면 됩니다. 디자인하는 동안 Object Inspector에서 이를 수행할 수 있습니다. 이 작업을 수행하면 다음 대화 상자가 나타납니다.
무엇? "비트맵 이미지가 유효하지 않습니다"라고 표시되는 이유는 무엇입니까? BMP 이미지 대신 JPEG 이미지가 있습니다. 그게 문제인가요? 돌아가서 도와드리겠습니다.
잠시 도움말을 클릭한 후 결론에 도달했습니다. 데이터베이스에서 JPG 이미지를 얻으려면 TJpegImage 개체를 사용해야 합니다. 이미지를 표시하려면 간단하고 보이지 않는 버전의 이미지 구성 요소가 필요합니다. 동시에 BLOB 개체에서 이미지를 로드하려면 스트림을 사용해야 합니다. 도움말 문서 설명: ADO 데이터 세트의 BLOB 또는 메모(메모) 필드 값에 액세스하거나 변경하려면 TADOBlobStream을 사용해야 합니다.
섹션 3: 스트림을 사용하여 JPEG 추출 - 잘못된 방법
JPEG 가져오기 - 2개를 가져가세요!
DBImage로는 아무 것도 할 수 없으므로 양식에서 DBImage를 제거하고 ADOImage라는 일반 TImage 구성 요소(추가 페이지)를 넣습니다. 안타깝게도 이미지 구성 요소에는 데이터 인식 속성이 없으므로 해당 이미지가 나타내는 데이터베이스 테이블의 이미지를 표시하려면 별도의 프로그램이 필요합니다. 이를 수행하는 가장 간단한 방법은 폼에 단추를 배치하고 모든 프로그램 코드를 OnClick 이벤트에 넣은 다음 단추 이름을 "btnShowImage"로 지정하는 것입니다.
ADOBLOBStream을 사용하려면 도움말 문서에서는 TADOBlobStream 인스턴스를 생성하고 "스트림" 메서드를 사용하여 데이터 세트에서 그래픽 필드를 읽은 다음 BLOB 스트림을 해제할 것을 권장합니다. 중간 어딘가에서 LoadFromStream 메소드를 사용하여 TADOBlobStream 객체에서 JPEG 이미지를 로드해야 합니다. 이미지 구성 요소의 그림 및 그래픽 속성은 실제로 그림을 저장하고 표시하는 데 사용됩니다.
필드 객체, 그게 뭔가요?
이 시점에서는 필드 개체에 대한 약간의 지식만으로도 이 장을 마스터할 수 있다고 가정합니다. 델파이 데이터베이스 개발에서 주요 객체 중 하나는 TField 객체입니다. 필드 구성 요소는 런타임(또는 디자인) 타임에 데이터 세트의 필드를 나타내는 비시각적 개체입니다. TADOTable(및 기타 TDataSet 하위 클래스)은 Fields Editor에 대한 디자인 타임 액세스를 제공합니다. 필드 편집기를 사용하면 데이터 세트에 포함할 필드를 선택할 수 있습니다. 더 중요한 것은 애플리케이션의 데이터 세트에 사용되는 강력한 필드 구성 요소 목록을 생성한다는 것입니다. Fields Editor를 호출하려면 TADOTable 구성 요소를 두 번 클릭하십시오. 기본적으로 필드 목록은 비어 있습니다. 추가 버튼을 클릭하면 애플리케이션 테이블의 필드가 나열된 대화 상자가 열립니다. 기본적으로 모든 필드가 선택되어 있으며 확인을 선택합니다.
델파이에서는 필드의 기본 이름을 다음과 같이 지정합니다: 테이블(테이블) 이름 + 필드(필드) 이름. 이는 그림 필드의 이름이 ADOTable1Picture라는 것을 의미합니다.
TADOBlobStream의 Create 메소드는 지정된 BLOB 필드 객체(이 경우 ADOTable1Picture 필드)를 읽거나 쓰기 위한 인스턴스를 생성합니다.
btnShowImage 버튼의 OnClick 이벤트에 프로그램 코드를 작성합니다. 이 코드는 현재 선택된 행의 그림 필드에서 그림을 읽습니다. 소스 코드는 다음과 같습니다.
JPEG를 사용합니다 .
...
PROcedure TForm1.btnShowImageClick(Sender: TObject);
var bS: TADOBlobStream;
사진: TJpegImage;
시작하다
bS := TADOBlobStream.Create
(AdoTable1Picture, bmRead);
노력하다
그림:=TJpegImage.Create;
노력하다
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=그림;
마지막으로
Pic.Free;
끝 ;
마지막으로
bS.무료
끝 ;
끝 ;
좋아, 이 프로젝트를 실행해 보자. 물론 ADOTable1.Active 속성을 True로 설정합니다. 양식이 표시된 후 버튼을 클릭하면 다음 화면이 나타납니다.
무슨 일이에요? 코드는 100% 정확하지만 이미지가 표시되지 않는 이유는 무엇입니까? "절대로 포기하지 말고, 항복하지 말라"는 말을 기억하세요! 바이트 수준으로 드릴다운하여 무슨 일이 일어나는지 살펴보겠습니다!