오랫동안 글을 쓰지 않았습니다. 이전 글에서 토마토와 달걀을 많이 먹어서가 아니라, 여러분이 참고할 만한 실질적인 내용이 정말 없기 때문입니다. 그런데 최근 친구의 프로젝트를 도와주던 중 델파이에서 간단한 이미지 처리 과정을 접하게 되어서 계속 인터넷에서 정보를 찾아보고 이전 csdn 포스팅을 찾아보니 정말 많은 분들이 계셨습니다. 여러 프로젝트에서 비슷한 이미지 처리 문제를 겪은 적이 있었을 텐데 대부분 답변이 불완전한 것 같습니다(많은 부분이 게시되지 않았거나 개인 습관의 문제일 수 있기 때문입니다. ㅎㅎ) 이 글을 읽으신 후 내 경우에는 누구나 집에서 작업을 시작할 수 있습니다. 그래서 여러분의 참고를 위해 제가 겪은 문제와 해결책을 아래에 적어두었습니다. 동시에 계속해서 벽돌을 만들어도 좋습니다.
정식 내용에 앞서 내가 해결하고 싶은 문제를 적어야 하고, 또한 내가 문제를 제대로 처리하지 못해 독자들이 짜증을 내지 않도록 좋은 입장을 주어야 한다. 여기서 해결해야 할 가장 큰 문제는 델파이에서 스캐너로 스캔한 이미지를 90도 회전시켜 사용하기에 적합한 이미지를 얻는 것인데, 이미지의 크기를 정확하게 파악할 수 없기 때문에 이미지의 크기를 간단히 조정해야 합니다. 그리고 내 솔루션은 완전히 이 요구 사항을 기반으로 합니다. 왜냐하면 저는 이미지 처리 후 효율성과 명확성에 대해 많이 생각하지 않고 프로그램이 매우 단순해 보인다는 장점이 있기 때문입니다.
우선 스캐너가 없어서 (이미 제공되는) 스캐너를 이용해서 얻은 사진이 어떤 형식인지는 모르겠고, 델파이 도움말에는 "비트맵은 사진을 만드는 데 사용되는 강력한 그래픽 개체입니다. , 조작(크기 조정, 스크롤, 회전 및 페인트)하고 이미지를 메모리에 저장하고 디스크에 파일로 저장합니다. 따라서 첫 번째 단계는 처리를 위해 슬라이스를 TBitmap으로 변환하는 것입니다. 형식을 변환하는 동안 나중에 이미지의 일부를 선택할 필요에 맞게 이미지의 실제 크기를 변경했습니다. 기능은 다음과 같습니다:
PROcedure TMainForm.ChangeImageFormate;
var 비트맵 : TBitmap;
확대/축소: 정수;
시작하다
비트맵 := TBitmap.Create;//1
노력하다
ImageCert로 시작하세요
Bitmap.Assign(Picture.Graphic);//2
그림 := 없음;//3
Zoom := Max(Bitmap.Width div Width,Bitmap.Height div Height)+1;//4
너비 := Bitmap.Width div Zoom;//5
높이 := Bitmap.Height div Zoom;//6
Canvas.StretchDraw(Rect(0,0,너비,높이),비트맵);//7
끝;
마지막으로
비트맵.무료;
끝;
끝;
이 코드는 그다지 복잡하지 않다고 생각합니다. ImageCert는 Form에 배치된 TImage 컨트롤입니다. 유일하게 낯설 수 있는 것은 8번째 문장이지만 Delphi의 도움말에서 많은 설명을 얻을 수 있으므로 여기서는 번역하지 않겠습니다. (내 조언은 더 많은 도움말을 읽어보는 것입니다). 동시에 세 번째 문장이 매우 중요하다는 점을 지적해야 합니다. 이 문장을 제거하고 이미지 형식이 bmp가 아닌 경우 "비트맵만 수정할 수 있습니다"라는 오류가 나타납니다.
두 번째 단계는 이미지 회전을 실현하는 것입니다. 프로그램은 매번 90도 회전만 필요하므로 여기에서 처리하기가 더 쉽습니다. 처리 방법은 픽셀 단위로 교체하는 것입니다. 구현 프로세스는 다음과 같습니다.
절차 TMainForm.RotateImage;
var x,y : 정수;
TmpBitMap : TBitmap;
시작하다
TmpBitMap := TBitmap.Create;
노력하다
TmpBitMap.Assign(ImageCert.Picture.Graphic);
ImageCert로 시작하세요
Picture.Bitmap.Height := TmpBitMap.Width;
Picture.Bitmap.Width := TmpBitMap.Height;
x:=0에서 높이까지
y:=0 ~ 너비 do
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
높이 := TmpBitMap.Width;
너비 := TmpBitMap.Height;
끝;
마지막으로
TmpBitMap.Free;
끝;
끝;
이 프로그램에서는 별로 할 얘기가 없지만 높이와 너비 설정이 너무 많아서 뭔가 더 해야겠다는 생각이 항상 들지만 관심 있는 행이 있으면 삭제할 수 없습니다. 한번 해보세요. 결과를 알려주시면 더 좋을 것 같아요. 그리고 이 경우 TImage와 TBitmap에는 자체 캔버스가 있기 때문에 연구해 볼 가치가 있을 수 있지만 시간이 제한되어 있어 시도해 보지 않았습니다.
이미지 촬영 과정의 일부로 TShape를 사용한 다음 브러시 스타일을 bsclear로 설정하고 ImageCert의 onMouseMove에서 TShape의 위치를 정렬했습니다. 마우스가 TShape에 있을 때는 그렇지 않기 때문입니다. 어떤 영향을 미치더라도 다행히 그 영향은 작을 것입니다. 동시에 TShape의 OnMouseDown 이벤트에서 TShape 아래에서 사진 몇 장을 꺼냈습니다. 이때 이미지의 크기가 조정되지 않은 경우 제거된 이미지가 우리가 보는 위치와 일치하지 않는 것을 발견하게 됩니다(물론 TImage가 이미지 크기를 올바르게 표시하지 않는 경우).