2009-10-28 1 views
3

델파이 7에서는 TCanvas 구성 요소를 사용하여 정보를 출력하는 라이브러리가 있습니다. 결과 이미지는 약 4800 * 6000 픽셀이고 인쇄하려면 .jpeg으로 저장하고 싶습니다..jpeg로 저장하기 위해 델파이로 큰 이미지 처리

이 작업을 수행하기 위해 TBitmap을 만들어 Canvas를 라이브러리의 매개 변수로 지정한 다음 jpeg에 비트 맵을 할당했습니다. 비트 맵의 ​​너비와 높이를 설정하려고 할 때 "이 명령을 처리 할 수있는 저장소가 부족합니다"라는 예외가 발생하기 때문에 이것은 너무 많은 메모리를 사용하고 있습니다.

// output to printer 
Printer.BeginDoc(); 
doPrint(Printer.Canvas); 
Printer.EndDoc(); 

// output in bmp.Canvas 
bmp := TBitmap.Create; 
bmp.Width := Printer.PageWidth; 
bmp.Height := Printer.PageHeight; // <- BAM! Exception! 
doPrint(bmp.Canvas); 

// save as jpeg 
jpg := TJPEGImage.Create; 
jpg.Assign(bmp); 
jpg.SaveToFile('...'); 

// free 
bmp.Free(); 
jpg.Free(); 

내가 뭘 잘못하고 있니? Printer.Canvas를 .jpeg 파일로 직접 저장할 수 있습니까?

편집 : 업데이트 된 이미지 크기 근사 * 2000 2000 4800 * 6000 개

+0

어떤 라이브러리인가요, GETMEM 또는 이와 유사한 것을 강요 당합니까? 이게 TBitmap 인 것처럼 내가 묻는 이유는 너 괜찮을거야. RE – Reallyethical

+0

나는 특별한 것을 사용하지 않고있다. 라이브러리는 캔버스를 사용하여 정보를 출력하는 것일뿐 아니라 Delphi로 작성되었으며 전체 소스 코드는 "var s : TStringList"및 " cnv.TextOut (..) "그래서 그것은 쉽게 다시 컴파일 될 수 있고 괜찮을 것이다. – Tom

답변

3

당신이 Graphic32에서 TBitmap32를 사용하여 큰 비트 맵을 처리 할 수 ​​있어야한다 (http://www.graphics32.org/wiki/)

+0

잘 작동합니다. 감사합니다! – Tom

0

델파이은 TBitmap 클래스는 큰 비트 맵을 처리하는 문제가있다. 아니요, TCanvas를 .jpg 파일에 직접 저장할 수는 없습니다.

+0

아무도 아이디어/해결 방법을 곧 제공하지 못하면 귀하의 답변을 수락합니다. – Tom

+0

'TBitmap' 클래스 자체는 전혀 문제가 없으며 단지 Windows API 함수를 감싸는 래퍼 일뿐입니다. Windows 버전 및 그래픽 카드 (드라이버)에 따라 문제가있을 수도 있고 간단하지 않을 수도 있지만 Delphi는 실제로 그것에 들어 가지 않습니다. 내 시스템에 문제없이 10000 x 10000 픽셀의 비트 맵을 만들 수 있습니다. 색상으로 채우거나 파일 (380MB 크기)로 저장하는 데 시간이 걸립니다. – mghie

+0

대답의 절반은 여전히 ​​맞습니다 ... – Tom

0

내 컴퓨터 (Windows XP, Delphi 2006)에서 다음 코드를 시도했지만 예외가 발생하지 않았습니다. 어떤 OS를 사용하고 있습니까?

procedure TForm3.Button3Click(Sender: TObject); 
    var 
    bmp : TBitmap; 
    begin 
    bmp := TBitmap.Create; 
    bmp.PixelFormat := pf32bit; 
    bmp.Width := 6000; 
    bmp.Height := 4800; 
    bmp.Free; 
    end; 
+0

1GB RAM이 장착 된 Windows XP SP1. 이 응용 프로그램은 Windows 7에서 2GB의 RAM이있는 번거 로움없이 사용되지만 시스템에서 정상적으로 작동하는지 확인하고 싶습니다 (최소한 디버깅 용). – Tom

2

당신은 pixelformat을 설정해야 볼 시스템에 많이 의존 벤 지글러 (Ben Ziegler)가 제안한 것처럼 bmp를 크기 조정하기 전에 bmp를 위해. 이것은 모든 차이를 만듭니다.

+0

나는 이것도 시험해 볼 것이다. 어쨌든 흑백 이미지이다. – Tom

0

PixelFormat을 pf32bit 또는 pf24bit로 설정하십시오 (예 : Ben Ziegler). 대부분의 경우이 PixelFormat이 트릭을 수행합니다 (주로 XP에서 사용됨). 자세한 내용은 here을 참조하십시오.

-1

제대로 작동하는지 확실하지 않습니다.

function SaveComponentToJPeg(mControl: TWinControl): TJpegImage; 
    var 
     bmp: TPicture; 
     jpg : TJpegImage; 
     dc: HDC; 
     wnd: HWND; 
     Params: array[0..255] of Char; 

    begin 
     bmp:=TPicture.Create; 
     jpg := TJpegImage.create; 
     try 
     bmp.Bitmap.Width := mControl.Width - 05; // Deduct for border. 
     bmp.Bitmap.Height := mControl.Height -05; // Deduct for border. 
     wnd    := mControl.Handle; //ctiveWindow; 
     dc    := GetDc(wnd); 
     BitBlt(bmp.Bitmap.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,SrcCopy); 
     ReleaseDc(wnd, dc); 
     jpg.assign(bmp.bitmap); 
     result := jpg 
     finally 
     bmp.Free; 
     end; 
    end; 
+0

나는 이미 이것을하고있다. 코드는 질문에 게시됩니다. – Tom

0

그것은 JPEG 형식이 아니다 : 사양은 32767x32767 픽셀만큼 큰 비트 맵을 허용하지만 우리는 JPEG에 구성 요소를 저장하는 함수를 만들었습니다.

큰 비트 맵 의 엄청난 양의 메모리 소비는 궁극적으로 Windows 플랫폼까지 추적 할 수있는 TCanvas 제한입니다.

내 NativeJpg 라이브러리는 시각화와 별도로 JPEG 처리를 디코딩하며, 예를 들면 다음과 같이 할 수 있습니다. 결과적으로 다루기 쉬운 비트 맵 타일을 사용하여 "스트립 바이 스트립"을 사용하여 그러한 JPEG를 저장하십시오.

NativeJpg는 오픈 소스이고 당신은 여기 lib 디렉토리를 다운로드 할 수 있습니다 다음 tiledemo에서 http://www.simdesign.nl/forum/viewforum.php?f=16

봐 작성하고 거대한 인공 JPEG 이미지를 저장하는 방법을 참조하십시오. 당신은 바탕 화면의 테 크기보다 큰 무언가에 비트 맵의 ​​크기를 설정하면

종류와 관련, 닐스

1

이 오류가 발생합니다.이 오류를 방지하려면 다음과 같은 방법으로 장치 독립적 비트 맵을 만들 수 있습니다

bmp := TBitmap.Create; 
bmp.HandleType := bmDIB; 
bmp.Width := Printer.PageWidth; 
bmp.Height := Printer.PageHeight; 

을이 솔루션은 비디오 카드의 성능에 따라 필요 여부. 이 오류는 많은 비디오 RAM이 한 세션에 할당되지 않은 터미널 서버 상황에서 많이 발생했습니다. 이 솔루션을 사용하면 델파이가 비디오 카드의 메모리 대신 비트 맵에 일반 RAM을 사용하게합니다.

0

적은 메모리를 사용하려면 더 작은 비트 맵을 만들어보십시오. 프린터 높이를 10으로 나눈 값이나 최대 높이를 1000으로 설정한다고 가정 해 보겠습니다. 제안 사항 (귀하의 경우에 해당하는지 확실하지 않음). 결과는 페이지 당 하나의 이미지 이상입니다.