forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Масштаб 2д изображения (http://forum.boolean.name/showthread.php?t=5777)

AndruXa 21.02.2008 15:08

Масштаб 2д изображения
 
Как сделать так, чтобы изображение можно было уменьшить а потом увеличить без потери качества. Стандартные СкайлИмайдж сильно портят картинку:mad:

H@NON 21.02.2008 15:16

Ответ: Масштаб 2д изображения
 
использовать библиотеку Михаила FastImage, ибо она работает через спрайты. Можно конеш и самому написать систему проецирования спрайтов на 2д плоскость монитора, но легче и выгоднее заюзать куда гораздо продвинутую и совершенную систему.
Но если все же нужно делать имейджами, то сделай копию того изображения которое тебе нужно уменьшить, а оригинал оставь. После того как ты уменьшил эту копию проверяешь когда тебе нужно обратно увеличить это изображение, и когда событие равно тру, то берешь оригинал, а копию скрываешь с экрана или удаляешь из памяти.
А вот готовая функция :
Код:

; -------------------------------------------------------------------------------------------------------------------------------------
; This function scales an image an arbitrary amount on the X and Y axis, and returns a pointer to the new image.
; The original image is not modified.
;
; This function is 80x faster than the ScaleImage function that comes with Blitz!
; -------------------------------------------------------------------------------------------------------------------------------------
Function ScaleImageFast(SrcImage, ScaleX#, ScaleY#)

    Local SrcWidth,  SrcHeight
    Local DestWidth, DestHeight
    Local ScratchImage, DestImage
    Local SrcBuffer, ScratchBuffer, DestBuffer
    Local X1, Y1, X2, Y2

    ; Get the width and height of the source image.   
        SrcWidth  = ImageWidth(SrcImage)
        SrcHeight = ImageHeight(SrcImage)

    ; Calculate the width and height of the dest image.
        DestWidth  = Floor(SrcWidth  * ScaleX#)
        DestHeight = Floor(SrcHeight * ScaleY#)

    ; If the image does not need to be scaled, just copy the image and exit the function.
        If (SrcWidth = DestWidth) And (SrcHeight = DestHeight) Then Return CopyImage(SrcImage)

    ; Create a scratch image that is as tall as the source image, and as wide as the destination image.
        ScratchImage = CreateImage(DestWidth, SrcHeight)
               
    ; Create the destination image.
        DestImage = CreateImage(DestWidth, DestHeight)

    ; Get pointers to the image buffers.
        SrcBuffer    = ImageBuffer(SrcImage)
        ScratchBuffer = ImageBuffer(ScratchImage)
        DestBuffer    = ImageBuffer(DestImage)

    ; Duplicate columns from source image to scratch image.
        For X2 = 0 To DestWidth-1
            X1 = Floor(X2 / ScaleX#)
            CopyRect X1, 0, 1, SrcHeight, X2, 0, SrcBuffer, ScratchBuffer
        Next
           
    ; Duplicate rows from scratch image to destination image.
        For Y2 = 0 To DestHeight-1
            Y1 = Floor(Y2 / ScaleY#)
            CopyRect 0, Y1, DestWidth, 1, 0, Y2, ScratchBuffer, DestBuffer
        Next               
   
    ; Free the scratch image.
        FreeImage ScratchImage                   
                       
    ; Return the new image.
        Return DestImage
                   
End Function


jimon 21.02.2008 21:14

Ответ: Масштаб 2д изображения
 
AndruXa
а зачем ?
имхо проще хранить увеличеную картинку в оригинальном качестве и уменьшеную ...

moka 21.02.2008 23:37

Ответ: Масштаб 2д изображения
 
Самый лучший и производительный варриант это юзать биллбоарды с текстурами :)

FastImage как раз работает через 3D.

AndruXa 24.02.2008 12:20

Re: Масштаб 2д изображения
 
Цитата:

а зачем ?
имхо проще хранить увеличеную картинку в оригинальном качестве и уменьшеную ...
Дело в том, что я на экзамен пишу прогу - смесь пайнта и некоторых функций фотошопа, наверно представляете как в фотошопе роликом мыши меняется масштаб...ну я и сделал скайлимайджем, уменьшается-то она нормально, но вот когда снова увеличиваешь - появляется черный квадрат вместо изображения. Всем спасибо буду юзать ФастИмейдж

tormoz 24.02.2008 17:48

Ответ: Re: Масштаб 2д изображения
 
Цитата:

Сообщение от AndruXa (Сообщение 77845)
Дело в том, что я на экзамен пишу прогу - смесь пайнта и некоторых функций фотошопа, наверно представляете как в фотошопе роликом мыши меняется масштаб...ну я и сделал скайлимайджем, уменьшается-то она нормально, но вот когда снова увеличиваешь - появляется черный квадрат вместо изображения. Всем спасибо буду юзать ФастИмейдж

1 Нужно хранить исходную картинку
2 выводить на экран нужно ее копию
3 копию делать методом CoryRectStrech (фаст имаже)

moka 25.02.2008 13:30

Ответ: Масштаб 2д изображения
 
CopyRectStrech - Это функция из FastExtends библиотеки, но не фастимаговская ;)

Mustang_GT 26.01.2010 20:30

Ответ: Масштаб 2д изображения
 
Люди, а как сделать, чтобы изображение "подстраевалось" под монитор? Очень надо. Если, например, картинка 1028х768, а разрешение 800х600 или какое-нить ещё. Как сделать, чтоб картинка подстроилась под любое разрешение экрана

moka 27.01.2010 02:13

Ответ: Масштаб 2д изображения
 
Scale?

St_AnGer 27.01.2010 02:20

Ответ: Масштаб 2д изображения
 
Я делал очень через.опным способом, пока не подключил FastImage, поэтому советую пользоваться FastImage.
Ну а способ был такой:

Код:

widthimage#=ImageWidth(картинка)
Heightimage#=ImageHeight(картинка)
ScaleImage картинка,1+(GraphicsWidth()-widthimage)/widthimage,1+(GraphicsHeight()-heightimage)/heightimage

Но я картинку таким способом растягивал на экран бОльшего размера чем сама картинка... Причём это происходило довольно-таки не очень быстро. Но должно работать и если картинка больше разрешения экрана

Hurrit 27.01.2010 06:46

Ответ: Масштаб 2д изображения
 
Это и стандартными возможностями блица делается одной строкой
ResizeImage img,GraphicsWidth(),GraphicsHeight()


Часовой пояс GMT +4, время: 11:59.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot