Q&A

  • 비트맵출력 다시질문입니다.
hBm := bm.ReleaseHandle;      <<==========여기서 메모리 에러가 나네요
RGB값이라 에러가 나는것 같네요.여기를 bitmap으로 바꿔야 할것 같은데.
방법이 생각이 안나네요..
요것 저것해봐도 자꾸 메모리 에러가 떨어지네요..
흑흑...초보좀 도와주세요..


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  preConv,postConv,TEmp : array[0..320*240*3-1] of byte        ;
  prefile,postFile : TFileStream;
   DestDC : hdc;
   FileHandle,iBytesRead : Integer;
   bitMap : TbitMap;
   i,j,k : Integer;
begin

    try
    prefile := TFileStream.Create('C:다운로드김수현RGBtestConv1.yvu',fmOpenReadWrite);
    prefile.Position :=0;
    prefile.Read(preConv,320*240*3);

    ConvertYV12ToRGB24(        @(preConv[0]), @(preConv[320*240]), @(preConv[320*240 + 320*60]), @postConv, 320, 240 );

    postFile := TFileStream.Create('C:다운로드김수현RGBtestConv1.rgb',fmOpenReadWrite);
    postFile.Position :=0;
    postFile.write(PostConv, 320*240*3);

    finally
    prefile.Free;
    postFile.free;
    end;

   // bitmap:= Canvas.;
    BltTBitmapAsDib(DestDC ,0,0,320,240,@postConv);

end;
procedure TForm1.BltTBitmapAsDib(DestDC : hdc;{ handel of where blt}
                          x : word; {blt at x}
                          y : word; {blt at y}
                          Width : word; {width to stretch}
                          Height : word; {height to stretch}
                          bm : TbitMap); {the TBitmap to Blt}
var
OriginalWidth : longInt;                   {width of BM}
dc : hdc;                                  {screen dc}
IsDestPaletteDevice : bool;                {if the device uses palettes}
BitmapInFoSize : integer;                  {sizeof the bitmapinfoheader}
lPBitmapInFo : PBitmapInFo;                {the bitmap info header}
hBm : hBitmap;                             {handle to the bitmap}
hPal : hPalette;                           {handel to the palette}
OldPal : hPalette;                         {temp palette}
hBits : THandle;                           {handle to the DIB bits}
pBits : pointer;                           {pointer to the DIB bits}
lPPalEntriesArray : PPalEntriesArray;      {Palette entry array}
NumPalEntries : integer;                   {number of palette entries}
i : integer;                               {looping variable}

begin
//비트맵 원래의 너비를 저장해 둔다.
Originalwidth := 320;

//비트맵 원래의 너비를 저장해 둔다.
Bitmapinfosize := sizeof(Tbitmapinfo);
GetMem(lPBitmapInFo, BitmapInFoSize);

//비트맵의 구조를 할당한다.
FillChar(lpBitmapInFo^,BitmapInfosize, #0);

//Bitmapinfo  구조체에 필요한 데이터를 채워넣는다.
lpBitmapInfo^.bmiHeader.biSize := sizeof(TBitmapInfoHeader);
lpBitmapInfo^.bmiHeader.biWidth := OriginalWidth;
lpBitmapInfo^.bmiHeader.biHeight := 240;
lpBitmapInfo^.bmiHeader.biPlanes := 1;
lpBitmapInfo^.bmiHeader.biBitCount := 24;  //★요부분이 비트수를 결정하는거죠? 4로하면 16칼라로 되나요?★
lpBitmapInfo^.bmiHeader.biCompression := BI_RGB;
lpBitmapInfo^.bmiHeader.biSizeImage := ((lpBitmapInfo^.bmiHeader.biWidth *
    longint(lpBitmapInfo^.bmiHeader.biBitCount)) div 8) *
    lpBitmapInfo^.bmiHeader.biHeight;
lpBitmapInfo^.bmiHeader.biXPelsPerMeter := 0;
lpBitmapInfo^.bmiHeader.biYPelsPerMeter := 0;
lpBitmapInfo^.bmiHeader.biClrUsed := 0;
lpBitmapInfo^.bmiHeader.biClrImportant := 0;

hBm := bm.ReleaseHandle;      <<==========여기서 메모리 에러가 나네요
hPal := bm.ReleasePalette;

//스크린의 DC를 얻는다.
Dc := GetDc(0);

GetDiBits(dc, hBm, 0, lpBitmapInfo^.bmiHeader.biHeight, nil, TBitmapInfo(lpBitmapInfo^),DIB_RGB_COLORS);

//Bit를 위한 메모리 할당
hBits := GlobalAlloc(GMEM_MOVEABLE, lpBitmapInfo^.bmiHeader.biSizeImage);
pBits := GlobalLock(hBits);
GetDiBits(dc, hBm, 0, lpBitmapInfo^.bmiHeader.biHeight, pBits, BitmapInfo(lpBitmapInfo^),DIB_RGB_COLORS);
{Give back the screend dc}
dc := ReleaseDc(0, dc);
stretchDiBits(DestDc, 0, 0, 320, 240, 0, 0, OriginalWidth, lpBitmapInfo^.bmiHeader.biHeight,pBits,
lpBitmapInfo^,DIB_RGB_COLORS, SrcCopy);
GlobalUnLock(hBits);
GlobalFree(hBits);

FreeMem(lpBitmapInfo, BitmapInfoSize);
bm.Handle := hBm;
bm.Palette := hPal;
end;
3  COMMENTS
  • Profile
    최용일 2002.06.26 21:05
    안녕하세요. 최용일입니다.

    BltTBitmapAsDib의 파라매터에는 bm이 TBitmap이라는 객체인데 배열을 넣어주셨네요... 당연히 에러가 나겠죠... TBitmap을 생성해서 넣어주셔야 겠네요...

    ^^ 항상 즐코하세요...

  • Profile
    이호성 2002.06.27 00:55
    최용일님 제가요.
    k:=0;
        bitmap  := Tbitmap.Create;
        for i:= 0 to 319 do begin
           for J:= 0 to 239 do begin

         bitmap.Canvas.Pixels[i,j]:=RGB(postConv[k*3+2],postConv[k*3+1],postConv[k*3]) ;

           inc(k);
           end;
        end;
        finally
        prefile.Free;
        postFile.free;

        //BeginDoc;
        BltTBitmapAsDib(Canvas.Handle ,0,0,320,240,bitmap);
        //EndDoc;


        bitmap.Free;
        end;
    이렇게 배열을 Tbitmap에 할당을 하고 BltTBitmapAsDib함수에서
    canvas.handle을 썼는데요. 폼에 그림이 나와야 하지 않나요?
    아니면 제가 뭘 잘못한건지 폼이나 아니면 다른 image컴퍼는트에
    뿌려주는 방법이 없을까요?
    지금은 에러는 나지 않거든요.

  • Profile
    어린왕자A 2002.07.06 22:39

    이부분이 때론 안될때가 있습니다.
    메뉴얼 보시면 다음과 같이 나와 있습니다.

    Not every device context supports the Pixels property. Reading the Pixels property for such a device context will return a value of -1. Setting the Pixels property for such a device context does nothing.



    • 오소영
    • 2002.06.26 20:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • ㉿Ⅹ┏^_^┓
      2002.06.26 21:27
      Row Cont 에서 한줄 삭제하면 되지 않을까요? ex)   iSearchDatacount := AdvGrid.RowCount...
    • 하얀까마귀
      2002.06.27 02:16
      안녕하세요 하얀까마귀 입니다. 퀵리포트는 연결되어 있는 데이타셋을 자동으로 읽어와서 작업하도록 되...
    • 이현철
      2002.06.26 20:11
      폼 이름은 폼 속성창에서 Name 이란 속성에서 설정하시면 되구요. 폼 파일 이름은 File 메뉴의 Save as에...
    • 델파이사랑
      2002.06.26 20:20
      감사합니다....(냉무)
    • 김도형
    • 2002.06.26 19:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김도형
      2002.06.26 20:25
      Implementation 밑에 있는 {$R *.DFM} 이걸 제가 없애고 해서 그러네요....
    • 호야
    • 2002.06.26 19:48
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이호성
    • 2002.06.26 19:20
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.06.26 21:05
      안녕하세요. 최용일입니다. BltTBitmapAsDib의 파라매터에는 bm이 TBitmap이라는 객체인데 배열을 넣어...
    • 이호성
      2002.06.27 00:55
      최용일님 제가요. k:=0;     bitmap  := Tbitmap.Create;   &...
    • 어린왕자A
      2002.07.06 22:39
      이부분이 때론 안될때가 있습니다. 메뉴얼 보시면 다음과 같이 나와 있습니다. Not every device con...
    • 이현철
      2002.06.26 20:29
      제가 생각하기엔, 자료가 DB 에 있다고 해서 꼭 DB Chart를 쓰실 필요는 없다고 생각합니다. 저도 역시 TC...
    • 쩡이
    • 2002.06.26 18:54
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 염상철
      2002.06.26 19:07
           if DBRadioGroup1.ItemIndex = 0 then begin      &n...
    • 성더기
      2002.06.26 19:18
      쪼끔더 줄일려면.. if 보다 case문을 쓰면 쪼끔더이뿌게 될듯하네욤..^^
    • 쩡이
      2002.06.26 19:17
      감사합니다..
    • 이상현
    • 2002.06.26 18:23
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이현철
      2002.06.26 20:16
      unit Unit1; interface uses   Windows, Messages, SysUtils, Classes, Graphics, Contro...
    • 이재진
    • 2002.06.26 08:52
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박성환
    • 2002.06.26 04:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2002.06.26 05:50
      답변은 아니지만... 저도 퀵리포트 때문에 요즘 머리가 아픈데... 퀵리포트가 윈도우 폰트하고 영향이 있...
    • 박성환
    • 2002.06.26 04:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.10.09 19:57
      역시 환경설정이 문제가 있는듯합니다. 웹서버가 구동중인지 여부확인과 웹서버가 CGI를 지원하는 서버...
    • Malchus.Lee
    • 2002.06.26 03:45
    • 4 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2002.06.26 19:32
      procedure TForm_ABD72710U.BitBtn1Click(Sender: TObject); var   MyFile   &...
    • Malchus.Lee
      2002.06.27 01:32
      가르쳐 주신 것을 아래와 같이 고쳐서 했거든요? SaveDialog는 뭔지 몰라서 헷갈려서 떼어내고...그냥 제...
    • Malchus.Lee
      2002.06.27 02:24
      Query1 에다가 프로퍼티 설정(DB연결) 을 안해줘서 그렇네요. 근데 다음 에러가 다음 에러는 메모리 에러(...
    • Malchus.Lee
      2002.06.27 02:42
      다 해결했어여...더 답변 안해주셔도 됩니다. 감사합니다. 여러분
    • 장윤성
    • 2002.06.26 03:40
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 데빠이
      2002.06.26 18:30
      aa := 'field1';  //필드명 A := Query1.fieldbyname(aa).AsString; 이렇게 해보세요... ...
    • KDDG_ZZOM
      2002.06.26 05:45
      오라클의 로더기능을 예기하시는건지... 잘은모르지만 쿼리콤포넌트로는 불가능할것같고요.... 아니면 스...
    • 왕델초보
      2002.06.26 19:09
      답변 감사합니다. 오라클 로더기능은 테스트해봤구요.. 델파이 자체에서 .ctl 파일이나 .txt 파일을 불...
    • KDDG_ZZOM
      2002.06.26 19:17
      저도 잘은 모르지만... 쿼리로 실행시키시지말고요... 그냥 로더를 실행시키면 않될까요? 델파이에서 다...
    • 왕델초보
      2002.06.26 20:25
      와!! 답변이 무지 빠르네요..감사합니다. 굳이 델파이에서  사용하려고 하는것은 사용자가 ...
    • 이병철
    • 2002.06.26 03:28
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2002.06.27 02:23
      안녕하세요 하얀까마귀 입니다. 정확한건 아니구요.. 아마 스트림으로 만드셔서. 그걸 전송시켰을것 ...
    • 이병철
      2002.06.27 02:51
      하얀까마귀님 답변 감사합니다. 데이터를 압축하라구 했는데 어떻게 압축하구 내용을 주고 받아야 하죠? ...
    • 항아
    • 2002.06.26 03:14
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 이선경
      2002.06.27 22:43
      dao보다는 ado가 훨씬 무지 빠릅니다.. 그리고 최근에 여러가지 상황으로 인하여 억세수룰 sql server...
    • 이현철
      2002.06.26 20:32
      제 생각에는 DB 를 바꾸는 것이 좋다고 생각됩니다. ACCESS 는 소형 데이터를 다루게에 적합하고, MySql ...
    • KDDG_Min
      2002.06.26 03:20
      DAO 컴포넌트를 이용해 보세요. 저희 회사에서 사용해 본 결과 속도차가 분명히 있었습니다. 그...
    • 항아
      2002.06.26 19:40
      import type library로 컴포 등록하려 하는데... 에러가 나네요...  에궁... 모 아시는거 있...
    • 하얀까마귀
      2002.06.27 02:28
      안녕하세요 하얀까마귀 입니다. 겨우 20만건에서 속도 저하가 심각하다는건 좀 그렇네요... 음.. 한...
    • 항아
      2002.06.27 04:40
      네 ..  쿼리를 좀더 최적화해서 어느정도 속도향상은 했구요.. 그래두 좀 맘에 안드네요...&...
    • 호롱불
    • 2002.06.26 03:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 백록화
      2012.04.04 05:08
      uses  {$WARN UNIT_PLATFORM OFF}  FileCtrl,  {$WARN UNIT_PLATFORM ON}엄청 오래된 글에 ...
    • zzang
    • 2002.06.26 02:53
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이현철
      2002.06.28 20:34
      질문의 내용이 조금 이해가 안되네요..  ^^ 외부 ip가 어떤식으로 내부 ip행세를 하나요? 예...
    • zzang
      2002.06.28 23:48
      외부IP를 통해서 밖으로 나가야 하는데.. 안 나가서 tracert로 해보면.. 내부 ip로 잡혀 있어서..외부로 ...
    • 이현철
      2002.08.07 03:59
      회사내는 내부ip를 쓰고 나갈때는 외부 ip를 사용하려면 인터넷 공유기를 쓰면 될것 같은데요.. -_-;; ...
    • 송대섭
    • 2002.06.26 02:44
    • 0 COMMENTS
    • /
    • 0 LIKES