섹션 4: BLOB에서 JPEG의 시작 찾기
OLE 개체 유형 형식 - 세 가지를 선택하세요!
이제 우리가 해야 할 일은 이미지를 디스크에 (일반 바이너리 파일로) 저장하고 그 안에 무엇이 있는지 이해하는 것뿐입니다.
모든 이미지 파일(형식)에는 이미지를 고유하게 식별하는 파일 헤더가 있습니다. JPG 이미지 파일은 16진수 값이 $FFD8인 소위 SOI 태그로 시작됩니다.
다음 코드 줄은 이미지 필드 값을 작업 디렉터리의 관련 파일(BlobImage.dat)에 저장합니다. 이 코드를 양식의 OnCreate 이벤트에 배치하고 프로젝트를 시작한 후 제거하십시오.
ADOTable1Picture.SaveToFile('BlobImage.dat');
일단 이 파일이 있으면 됩니다. Hex 편집기를 사용하여 내용을 볼 수 있습니다.
당신은 그것을 믿습니까? MS 액세스는 개체 정의의 일부로 OLE 개체 필드에 연결된 OLE 개체에 대한 경로를 저장합니다. OLE 개체의 저장소 정의가 문서화되어 있지 않기 때문에(!? 이것은 MS에서 직접 제공됨) 작성되기 전에 실제 이미지 데이터가 무엇을 얻게 될지 알 수 있는 방법이 없습니다.
이 질문을 두 부분으로 나누어 생각해 보세요. 먼저 'FFD8'을 찾아 거기서부터 이미지 읽기를 시작해야 합니다. 둘째: 'FFD8'은 파일에서 항상 같은 위치에 있을 수는 없습니다. 결론: Access 데이터베이스에 OLE 개체로 저장된 JPG 파일의 SOI 태그 위치를 반환하는 함수가 필요합니다.
올바른 방법 - 4개를 선택하세요!
Blob 유형 필드가 제공되면 함수는 ADOBlobStream에서 'FFD8' 문자열의 위치를 반환해야 합니다. ReadBuffer는 스트림에서 바이트 단위로 데이터를 읽습니다. ReadBuffer를 호출할 때마다 스트림 위치가 바이트 단위로 이동됩니다. 이 함수는 2바이트가 함께 SOI 마커로 이어질 때 스트림의 위치를 반환합니다. 이 기능은 다음과 같습니다.
함수 JpegStartsInBlob(PicField:TBlobField):integer;
var
bS : TADOBlobStream;
버퍼: 단어;
hx: 문자열;
시작하다
결과 := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
노력하다
while (결과 = -1) 및 (bS.Position + 1 < bS.Size) do
시작하다
bS.ReadBuffer(버퍼, 1);
hx:=IntToHex(버퍼, 2);
hx = 'FF'이면 시작됩니다.
bS.ReadBuffer(버퍼, 1);
hx:=IntToHex(버퍼, 2);
hx = 'D8'이면 결과 := bS.Position - 2
그렇지 않으면 hx = 'FF'이면
bS.Position := bS.Position-1;
종료; //만약
종료; //그동안
마지막으로
bS.무료
끝; //시도해 보세요
끝;
SOI 마커의 위치를 확보하면 이를 사용하여 ADOBlob 스트림에서 이미지의 위치를 찾을 수 있습니다.
JPEG를 사용합니다.
...
PROcedure TForm1.btnShowImageClick(Sender: TObject);
var
bS : TADOBlobStream;
사진: TJpegImage;
시작하다
bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
노력하다
bS.Seek(JpegStartsInBlob(AdoTable1Picture),soFromBeginning);
그림:=TJpegImage.Create;
노력하다
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=그림;
마지막으로
Pic.Free;
끝;
마지막으로
bS.무료
끝;
끝;
프로젝트를 실행하세요. OK!
이제 프로그래밍이 재미없다고 누가 말할 수 있겠습니까?
참고: 실제 코드 프로그램에서는 TDataSet의 AfterScroll 이벤트(ADOTable1AfterScroll 이벤트 프로시저에 있음)의 현재 행에서 이미지를 읽고 표시하는 코드를 추가합니다. AfterScroll 이벤트는 응용 프로그램이 한 레코드에서 다른 레코드로 스크롤할 때 발생합니다.
다섯 번째 아이디어!
이것이 바로 이 장의 내용입니다. 이제 관심 있는 모든 JPG 이미지를 저장하고 표시할 수 있습니다. 이 기사의 마지막 페이지에서는 전체 코드(form1 단위)를 제공합니다. 모든 데이터 배열은 양식의 OnCreate 이벤트에 배치됩니다. 이렇게 하면 세 가지 구성 요소가 모두 올바르게 연결됩니다. 디자인할 때 Object Inspector를 사용할 필요가 없습니다.
이 장은 초보자를 위한 것이 아니지만 세상은 잔인한 곳이라는 것을 인정합니다! 또 다른 점: 결국에는 테이블에 있는 사진을 변경(또는 새 추가)하는 방법조차 알지 못한다는 점입니다! 예, 그것은 완전히 다른 이야기입니다!