ResizeImage() "beschneidet" anstatt zu resizen.

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

ResizeImage() "beschneidet" anstatt zu resizen.

Beitrag von inc. »

Ist das ab und zu vorkommende Problem hier und da bekannt?


Inc.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

habe ich noch nix gehört das ein solches prob bestehen sollte und funktioniert bei mir auch die ganze zeit super (habe das in einigen projecten verwendet)
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Lass uns mal den Code zukommen der dieses Verhalten bei dir reproduzierbar auslöst! Wir schauen uns das dann einmal an :)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Danke :)

Ausgangsbasis sind reine RGB24 Bilddaten geholt via getRGBFrame(input_frame) an den pointer *rgb24.
getRGBFrame() ist ein Functioncall an die DgDecode.dll welche mpeg2 sources dekodiert und via getRGBFrame() als Bildschirmdarstellbare RGB24 Daten wiedergibt.
Bild lässt sich anstandslos darstellen, nur ... wenns eben eine HDTV Source ist (1280 oder 1920) dann wird via der ResizeImage() Routine lediglich gecropped.

Code: Alles auswählen

Procedure DisplayFrame(input_frame.l, input_imagehdl.l) 
  
  Structure myBITMAPINFO
    bmiHeader.BITMAPINFOHEADER
    bmiColors.RGBQUAD[1]
  EndStructure
  
  
  Global bmi.myBITMAPINFO, hBmp, ImgID2 , no
  Protected bmi.myBITMAPINFO , input_imagehdl;, hBmp 
  If source_width
    
    If d2v = #True   ;// Displaying a d2v file
      bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
      bmi\bmiHeader\biWidth       = source_width
      bmi\bmiHeader\biHeight      = -source_height ; Flip the RGB Image vertically!
      bmi\bmiHeader\biPlanes      = 1
      bmi\bmiHeader\biBitCount    = 24
      bmi\bmiHeader\biCompression = #BI_RGB
      *rgb24 = getRGBFrame(input_frame)
      If *rgb24
        hBmp = UseImage(videobmp)
        hdc  = StartDrawing(ImageOutput())
        SetDIBits_(hdc, hBmp, 0, source_height, *rgb24, bmi, #DIB_RGB_COLORS)
        StopDrawing() 
        SetGadgetState(input_imagehdl.l, hBmp)
      Else 
        MessageRequester("Error!","No d2v RGB Imagedata could be received!",0)
        ProcedureReturn #False
      EndIf
      
    ElseIf avi = #True   ;// Displaying an avi file
      *bih.BITMAPINFOHEADER = CallFunction(#Libavi, "AVIStreamGetFrame", pGetFrameObj, input_frame )
      If *bih
        hBmp = UseImage(videobmp)
        hdc  = StartDrawing(ImageOutput())
        SetDIBits_(hdc, hBmp, 0, source_height, *bih + SizeOf(BITMAPINFOHEADER), *bih, #DIB_RGB_COLORS)
        StopDrawing() 
        If source_width = 1280 Or source_width = 1920
          hBmp = ResizeImage(videobmp, 720, 432)
        EndIf 
        SetGadgetState(input_imagehdl.l, hBmp)
      Else 
        MessageRequester("Error!","No avi imagedata could be received!",0)
        ProcedureReturn #False
      EndIf
      
    EndIf 
    
  Else
    MessageRequester("Error!","The Videodata in the Source contains NO width!?",0)
    ProcedureReturn #False
  EndIf 
  ProcedureReturn #True
EndProcedure
Funktioniert ResizeImage() nur mit RGB32 Daten?
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Beitrag von sharkpeter »

Hi,

na klar gab es das schon mal: http://forums.purebasic.com/german/view ... c&start=10

Gruß Jens
Zuletzt geändert von sharkpeter am 03.02.2013 16:41, insgesamt 1-mal geändert.
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Kann es sein, dass dieser Fehler nur mit RGB24 Bildmaterial vorkommt?

Habe dieser Tage wegen was Anderem mal in der Windows SDK rumgesucht und nebenbei scheinen die Grafikroutinen gerne mit RGB32 Daten vorlieb zu nehmen, da (imho) DWORD aligned, was eben ...

Structure RGB32
blue.b
green.b
red.b
alpha.b
Endstructure

... entspräche.

RGB24 ist ja so im Speicher angelegt:

Structure RGB24
blue.b
green.b
red.b
Endstructure



Nehmen wir mal an, ich habe reine RGB24 Bild-Daten mit einer Breite von 200 und einer Höhe von 100, wie bekomme ich die zu rgb24, also hinter den originalen 3 bytes noch ein "alpha"-dummy byte hinten dran?
Antworten