DSPACK 구성 요소 라이브러리로 작성된 Delphi6 DirectShow 필터 (푸시 소스 비디오 필터)가 있습니다. 필자는 FillBuffer() 호출에서 대상 미디어 샘플에 수정 된 비트 맵을 출력하기 전에 비트 맵을 수정하는 간단한 코드에 대해 정말로 애처로운 문제를 겪고 있습니다. 코드는 아래와 같습니다.TBitmap에 대한 변경 사항은 Delphi 6 DirectShow 필터의 렌더링 된 이미지에 나타나지 않고 많은 소프트 페이지 오류를 생성합니다.
위에서 볼 수 있듯이 Byte 포인터를 사용하여 24 비트 비트 맵의 RGB 값을 통과하는 간단한 루프가 두 개 있습니다. 이 코드는 DirectShow가 아닌 테스트 응용 프로그램에있을 때 잘 동작했습니다. 그러나, 내 DirectShow 필터에서 사용되는 값에 관계없이 렌더링 된 비트 맵에서 변경 내용을 볼 수 없습니다. 심지어 모든 Byte를 0으로 설정하는 테스트 라인을 볼 수 있습니다. 나는 이미지를 수정하지 않은 채로 보았습니다. 팬텀 또는 손상된 비트 맵 객체가 없는지 확인하기 위해 비트 맵에 간단한 문장을 인쇄하는 줄을 추가했습니다. 문장 은 렌더링 된 비트 맵에으로 표시됩니다.
이 코드가 실행될 때 작업 관리자가보고 한대로 초당 페이지 수는입니다. 이 코드를 비활성화하면 소프트 페이지 오류가 사라집니다. 무엇이 코드를 그렇게 할 수 있습니까? 나는 루프를 추적하고 각 라인 이후에 Byte 값이 값을 변경하는 것을 보았지만 이미지는 영향을받지 않습니다.
마지막으로, Scanline을 사용하지 않고 픽셀 접근을하는 빠른 방법을 알고 있다면 알고 싶습니다. 나는 TBitmap.Scanline을 추적하고 FreeImage를 호출합니다. 내가 할 수 있다면 메모리 할당을 최소화하고 싶습니다. Synopse의 빠른 jpeg 디코더를 사용하고 TBitmap32 개체와 함께 작동하지 않기 때문에 GR32.TBitmap32를 사용할 수 없습니다.
UPDATE : 문제는 내가 주사선 속성에 액세스하기 전에 pf24Bit에 비트 맵의 PixelFormat 속성을 설정하지 않은 것이 었습니다. 자세한 내용은이 스레드를 참조하십시오 : Pixel modifying code runs quick in main app, really slow in Delphi 6 DirectShow filter with other problems이
procedure brightnessTurboBoost(var clip: TBitmap; rangeExpansionPowerOf2: integer; shiftValue: Byte);
var
p0: PByte;
x,y: Integer;
begin
if (rangeExpansionPowerOf2 = 0) and (shiftValue = 0) then
exit; // These parameter settings will not change the pixel values.
for y := 0 to clip.Height-1 do
begin
p0 := clip.scanline[y];
// Can't just do the whole buffer as a big block of bytes since the
// individual scan lines may be padded for CPU alignment.
for x := 0 to (clip.Width - 1) * 3 do
begin
if rangeExpansionPowerOf2 >= 1 then
p0^ := IntToByte((p0^ shl rangeExpansionPowerOf2) + shiftValue)
else
p0^ := IntToByte(p0^ + shiftValue);
// Test wiping the image (didn't work, still see image).
// p0^ := 0;
Inc(p0);
end;
end;
clip.Canvas.TextOut(10, 10, 'HELLO THERE IS THERE ANYONE THERE?');
end;
@iamjoosy, DIB 스캔 라인? DWORD 경계에 있습니다. – OnTheFly
페이지 결함은 정상입니다. 이것이 가상 메모리가 물리적 메모리에 의해 뒷받침되는 방법입니다. –
@DavidHeffernan. 내가 본 전화 번호가 아니야. 코드에 표시된 루프가 켜지면 약 50,000의 작업 관리자에 PF 델타가 표시됩니다. 그리고 렌더링 된 이미지에서 픽셀 수정을 보지 못하는 문제가 여전히 있습니다. 내가 도울 수 없지만 문제가 관련 있다고 생각합니다. –