Page 1 of 1

ResizeImage() "fault" or did i miss somthing?

Posted: Wed Jul 26, 2006 3:06 am
by harry57
Is there something wrong with this code?

Code: Select all


If InitSprite()
  If OpenWindow(0,0,0,100,100,"Icon Test",#PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_SystemMenu)
    If OpenWindowedScreen(WindowID(0),0,0,WindowWidth(0),WindowHeight(0),0,0,0)
      If LoadImage(0,"MouseUp_16x16.ico")
        If CopyImage(0,1)
          If ResizeImage(1,32,32,#PB_Image_Smooth)
            ;ResizeImage(1,32,32,#PB_Image_Smooth)
            If StartDrawing(ScreenOutput())
              DrawImage(ImageID(0),0,0)
              DrawImage(ImageID(1),0,20)
              StopDrawing()
              While WaitWindowEvent()<>#PB_Event_CloseWindow : Wend
            Else
              Debug "Failed to init Drawing"
            EndIf
          Else
            Debug "Failed to resize Image"
          EndIf
          FreeImage(1)
        Else
          Debug "Failed to copy Image"
        EndIf
        FreeImage(0)
      Else
        Debug "Failed to load Image"
      EndIf
      CloseScreen()
    Else
      Debug "Failed to open windowed Screen"
    EndIf
    CloseWindow(0)
  Else
    Debug "Failed to open Window"
  EndIf
Else
  Debug "InitSprite() failed"
EndIf
End
or is ther something wrong with "Resize()" in PB 4?

Posted: Wed Jul 26, 2006 8:29 am
by Dr. Dri
PB only resizes Bitmap images... It doesn't work with icons or cursors yet

Dri :(

Re: ResizeImage() "fault" or did i miss somthing?

Posted: Wed Jul 26, 2006 8:31 am
by Michael Vogel
harry57 wrote:[...]or is ther something wrong with "Resize()" in PB 4?
Resize is definitely buggy - because it does produce wrong (or empty) pictures on some graphic cards!

I fear, we've to wait until fred has again more time for the windows version, in the meantime I used the DrawImage() function, which also fails on certain images in graphic modes less 32 bits.

See also my function Scale() in http://www.purebasic.fr/english/viewtopic.php?t=22668

Michael

Posted: Wed Jul 26, 2006 3:38 pm
by netmaestro
Dr Dri is correct about the .ico image format. You can work with icons natively in PB if you want to avoid using the DrawIconEx_() API, but you will have to employ a tiny workaround to "clean up" the format of the loaded image first:

Code: Select all

;replace CopyImage(0,1) with:
CreateImage(1,ImageWidth(0),ImageHeight(0))
StartDrawing(ImageOutput(1))
  DrawImage(ImageID(0),0,0)
StopDrawing()
Once you've done this the ResizeImage should work correctly.

Re: ResizeImage() "fault" or did i miss somthing?

Posted: Wed Jul 26, 2006 10:00 pm
by harry57
Thaks netmeastro, for your little Workaround, works a treat! :D

Posted: Thu Jul 27, 2006 5:45 am
by superadnim
"pb's" resize is just gdi in windows.

Posted: Thu Jul 27, 2006 5:29 pm
by Michael Vogel
superadnim wrote:"pb's" resize is just gdi in windows.
doesn't seem so, with other programming languages (hopefully using the API) I never had these problems...

...and believe me, I tried a lot of things (maybe they have all been wrong) to get images correctly resized, like the following:

Code: Select all

; offen:	Dekstop-Tiefe ohne ExamineDesktops
; gelöst:	Überblenden geht nicht (Schatten des letzten Bilds)
; offen:	Resize-Fehler

;{
  Global ScreenX=1024;GetSystemMetrics_(#SM_CXSCREEN)
  Global ScreenY=768;GetSystemMetrics_(#SM_CYSCREEN)
  Global FrameSizeX=ScreenX*0.72;640
  Global FrameSizeY=ScreenY*0.74;0.9;540

  Structure PictStruct
    id.l
    x.l
    y.l
    w.l
    h.l
  EndStructure

  Global Dim Picture.PictStruct(1)

;}

Procedure ScalePicture(n)
  Protected factor.f


  Picture(n)\w=ImageWidth(n)
  Picture(n)\h=ImageHeight(n)

  If Picture(n)\w>FrameSizeX
    factor=FrameSizeX/Picture(n)\w
    Picture(n)\w*factor
    Picture(n)\h*factor
  EndIf
  If Picture(n)\h>FrameSizeY
    factor.f=FrameSizeY/Picture(n)\h
    Picture(n)\w*factor
    Picture(n)\h*factor
  EndIf

  Picture(n)\id=ImageID(n)
  Picture(n)\x=(ScreenX-Picture(n)\w)>>1
  Picture(n)\y=(ScreenY-Picture(n)\h)>>1

  ; DOES NOT WORK!!!!!
  ;ResizeImage(n,Picture(n)\w,Picture(n)\h,#PB_Image_Smooth)

  If IsSprite(n) : FreeSprite(n) : EndIf
  CreateSprite(n,Picture(n)\w,Picture(n)\h,#PB_Sprite_Texture)

  ; "Workaround"...
  StartDrawing(SpriteOutput(n))
  ; DOES NOT WORK WITH CERTAIN PICTURES
  ; - even when used with 32 bit colors - small black rectangles at the top etc.
  ; - but more problems with 16/24 bit modes - strange stripes etc.

  DrawImage(Picture(n)\id,0,0,Picture(n)\w,Picture(n)\h); because Resize doesn't work
  StopDrawing()

  If IsSprite3D(n) : FreeSprite3D(n) : EndIf
  CreateSprite3D(n,n)

EndProcedure

UseJPEGImageDecoder()
If (InitSprite() And InitSprite3D())
  If OpenScreen(ScreenX,ScreenY,32,"Diashow")

    ; ////////
    LoadImage(0,"E:\Programs\Prog\Source\!Fade\CIMG0172.jpg",#PB_Image_DisplayFormat)
    ; ///////

    ; /////////////////
    x=2
    ; /////////////////
    FlipBuffers()

    Select x
    Case 1
      ; here's everything ok...
      StartDrawing(ScreenOutput())
      DrawImage(ImageID(0),0,0,Picture(n)\w,Picture(n)\h)
      StopDrawing()
    Case 2
      ; this picture already does not look perfect
      ScalePicture(0)
      StartDrawing(ScreenOutput())
      DrawImage(Picture(n)\id,0,0);,Picture(n)\w,Picture(n)\h)
      StopDrawing()
    Case 3
      ; target - for fade effect in dia show
      ScalePicture(0)
      Start3D()
      DisplaySprite3D(0,Picture(0)\x,Picture(0)\y,255)
      Stop3D()
    EndSelect

    FlipBuffers()

    Delay(5000)
  EndIf
EndIf
Result:
Image
(http://sudokuprogram.googlepages.com/CIMG0172.jpg) will be resized into something like
Image
(http://sudokuprogram.googlepages.com/ResizeError.jpg)!

No I really have no more ideas, what to do...

Posted: Thu Jul 27, 2006 6:32 pm
by Trond
Michael Vogel wrote:
superadnim wrote:"pb's" resize is just gdi in windows.
doesn't seem so
I can assure you, superadnim is right.

Posted: Fri Jul 28, 2006 7:30 am
by Michael Vogel
Trond wrote:
Michael Vogel wrote:
superadnim wrote:"pb's" resize is just gdi in windows.
doesn't seem so
I can assure you, superadnim is right.
So the API produces different results when using ResizeImage() or DrawImage([...],sizex,sizey)?

I'll do a last try this weekend - hopefully I've a little bit time to do some further checks (in the meantime I used already 4 different notebooks which all "produce" different results... - only the ResizeImage() command is stable - and fails completely on all notebooks!)

Posted: Fri Jul 28, 2006 9:47 am
by Trond
Michael Vogel wrote:
Trond wrote:
Michael Vogel wrote:
superadnim wrote:"pb's" resize is just gdi in windows.
doesn't seem so
I can assure you, superadnim is right.
So the API produces different results when using ResizeImage() or DrawImage([...],sizex,sizey)?

I'll do a last try this weekend - hopefully I've a little bit time to do some further checks (in the meantime I used already 4 different notebooks which all "produce" different results... - only the ResizeImage() command is stable - and fails completely on all notebooks!)
I've got some other problems with the ResizeImage(), Fred said that this: "Here we got a problem, as stretchblt() doesn't work properly with 32 bits bitmaps if the HALFTONE property is set..".

If you get different results with api and pb it is most likely because you use different parameters. Have you tried #PB_Image_Raw? It seems to work better here.

Posted: Fri Jul 28, 2006 10:36 am
by Michael Vogel
Trond wrote:Have you tried #PB_Image_Raw? It seems to work better here.
Not for now (see last listing), but I'll try that also (free time of weekend gets shorter and shorter;) -- Thank you for the tip :)

maybe someone will be that keen to write a nice assembler procedure for resizing images 8)

Posted: Fri Jul 28, 2006 4:30 pm
by SoulReaper
Hello

I know this might be silly but I was talking to a friend about your problem with Resize Image and he said about StretchBlt_() instead. oh with halftone...

Maybe StretchBlt_() is the answer to the problem with Resize Image...

Hope I understood the Problem correct :wink:

sorry it was talked about above by Trond :oops:

Regards
Kevin :)