|
2D-программирование Вопросы, касающиеся двумерного программирования |
21.02.2008, 15:08
|
#1
|
Знающий
Регистрация: 10.09.2007
Сообщений: 262
Написано 6 полезных сообщений (для 8 пользователей)
|
Масштаб 2д изображения
Как сделать так, чтобы изображение можно было уменьшить а потом увеличить без потери качества. Стандартные СкайлИмайдж сильно портят картинку
|
(Offline)
|
|
21.02.2008, 15:16
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Масштаб 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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.02.2008, 21:14
|
#3
|
|
Ответ: Масштаб 2д изображения
AndruXa
а зачем ?
имхо проще хранить увеличеную картинку в оригинальном качестве и уменьшеную ...
|
|
|
21.02.2008, 23:37
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Масштаб 2д изображения
Самый лучший и производительный варриант это юзать биллбоарды с текстурами
FastImage как раз работает через 3D.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
24.02.2008, 12:20
|
#5
|
Знающий
Регистрация: 10.09.2007
Сообщений: 262
Написано 6 полезных сообщений (для 8 пользователей)
|
Re: Масштаб 2д изображения
а зачем ?
имхо проще хранить увеличеную картинку в оригинальном качестве и уменьшеную ...
|
Дело в том, что я на экзамен пишу прогу - смесь пайнта и некоторых функций фотошопа, наверно представляете как в фотошопе роликом мыши меняется масштаб...ну я и сделал скайлимайджем, уменьшается-то она нормально, но вот когда снова увеличиваешь - появляется черный квадрат вместо изображения. Всем спасибо буду юзать ФастИмейдж
|
(Offline)
|
|
24.02.2008, 17:48
|
#6
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Re: Масштаб 2д изображения
Сообщение от AndruXa
Дело в том, что я на экзамен пишу прогу - смесь пайнта и некоторых функций фотошопа, наверно представляете как в фотошопе роликом мыши меняется масштаб...ну я и сделал скайлимайджем, уменьшается-то она нормально, но вот когда снова увеличиваешь - появляется черный квадрат вместо изображения. Всем спасибо буду юзать ФастИмейдж
|
1 Нужно хранить исходную картинку
2 выводить на экран нужно ее копию
3 копию делать методом CoryRectStrech (фаст имаже)
__________________
|
(Offline)
|
|
25.02.2008, 13:30
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Масштаб 2д изображения
CopyRectStrech - Это функция из FastExtends библиотеки, но не фастимаговская
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.01.2010, 20:30
|
#8
|
AnyKey`щик
Регистрация: 21.01.2010
Сообщений: 17
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Масштаб 2д изображения
Люди, а как сделать, чтобы изображение "подстраевалось" под монитор? Очень надо. Если, например, картинка 1028х768, а разрешение 800х600 или какое-нить ещё. Как сделать, чтоб картинка подстроилась под любое разрешение экрана
|
(Offline)
|
|
27.01.2010, 02:13
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Масштаб 2д изображения
Scale?
|
(Offline)
|
|
27.01.2010, 02:20
|
#10
|
Элита
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений (для 2,828 пользователей)
|
Ответ: Масштаб 2д изображения
Я делал очень через.опным способом, пока не подключил FastImage, поэтому советую пользоваться FastImage.
Ну а способ был такой:
widthimage#=ImageWidth(картинка)
Heightimage#=ImageHeight(картинка)
ScaleImage картинка,1+(GraphicsWidth()-widthimage)/widthimage,1+(GraphicsHeight()-heightimage)/heightimage
Но я картинку таким способом растягивал на экран бОльшего размера чем сама картинка... Причём это происходило довольно-таки не очень быстро. Но должно работать и если картинка больше разрешения экрана
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.
Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2
Скачать Doom 2D: Remake v0.3.8a
|
(Offline)
|
|
27.01.2010, 06:46
|
#11
|
Мастер
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений (для 2,207 пользователей)
|
Ответ: Масштаб 2д изображения
Это и стандартными возможностями блица делается одной строкой
ResizeImage img,GraphicsWidth(),GraphicsHeight()
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Hurrit за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:52.
|