Что нового

Концепция загрузки изображения частями

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Приветствую %username%!

Собственно хотел поинтересоваться о следующем:
У нас имеются изображения с именами квадратX_квадратY.png.
Размер квадрата к примеру 256x256. Размер окна, в котором рисуется изображение - WxH.

В данный момент у нас выбрана координата 5000x6000. Следовательно необходимым квадратом будет:
Код:
Round(5000/256) & '_' & Round(6000/256)


Отлично. Так же нам известно, что координата (5000x6000) - это (W/2)x(H/2) нашего окна(фон движется в окне на стрелки к примеру).

Надеюсь, что похожее уже реализовано, так как если я примусь - выйдет это все не красиво, а о скорости выполнения я уже молчу.
Зарисовать квадратами(частями изображения) нужно будет всю область окна, даже если один из них(квадратов) частично будет уходить из виду.

Как вы догадались изображение очень больших размеров. И рисовать его разом будет слишком медленно, да и нагрузка лишняя.
Быть может кто встречал подобное? Заранее спасибо.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
firex
Чисто ради любопытства, куда вы планируете разместить окно размером 5000х6000?
Пожалуйста, опишите всё более развёрнуто, ибо не совсем понятно что, как и зачем...
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Возможно firex имел ввиду изображение в окно не сразу помещать, а рисовать его по кусочкам(которые по его заданию составляют 256х256 размер). Я где-то подобное видел в примерах Yashied'а вот только вспомнить не могу
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
DarWiM
Нет, окно у нас размеров нормальных. К примеру 800x800.
Рисовать картинку в нем приходится с центрированием на ранее неизвестных координатах(в картинке), а сама отрисовка в окне(центр) = (800/2)x(800/2). И чтобы не перегружать постоянно программу, регион будет загружаться по частям.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
firex
А можно скриншот или рисунок, как оно должно выглядеть?

C2H5OH что-то подобное делал, но там загрузка процессора большая
http://autoit-script.ru/index.php?topic=11104.0
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
WSWR
Спасибо конечно, но я все же решил сделать свой вариант:

Код:
;Части изображений квадратные( 256x256 )
Global $_lcW = Round($__FEng_WinW / 256) + 2 ;Load coundW(for map parts)
Global $_lcH = Round($__FEng_WinH / 256) + 2 ;Load coundH(for map parts)

Global $_hSpr_Map[$_lcW*$_lcH][5] ;0 hImg; 1 num_x; 2 num_y; 3 draw_x; 4 draw_y;


Обходим в цикле массив, 0-0 = центральное изображение

Получаем текущее центральное изображение
Код:
For $IdxW = 1 To $_lcW Step 1
    For $IdxH = 1 To $_lcH Step 1
        If Если центральное изображение сменилось Then
            Смотрим текущее изображение, если его не нужно рисовать - зачищаем.
            Если текущая ячейка пуста, то рисуем изображение(по его индексам) исходя из формулы:
            
            Изображение с индексами( (x - ($_lcW/2))+$IdxW, (y - ($_lcH/2))+$IdxH )
        EndIf

        По координатам: ( (индекс_центрального - ((x - ($_lcW/2))+$IdxW)) * 256, так и с Y )
    Next
Next


Как то так.
Преимущества:
Если произойдет смена центрального квадрата, то все остальные не будут перерисовываться, а только те, которые нужно перерисовать.

Если кто хочет посоветовать еще - выслушаю с удовольствием :3



Добавлено:
Сообщение автоматически объединено:

Набросал пример(без круговой прорисовки, пока только центр):

Код:
Global $_IlumS_V[4] = [ $__FEng_WinW/2, 0, $__FEng_WinW/2, $__FEng_WinH ]
Global $_IlumS_H[4] = [ 0, $__FEng_WinH/2, $__FEng_WinW, $__FEng_WinH/2 ]

Global $_cX[2] = [ 0, 250 ], $_cY[2] = [ 0, 100 ]

Global $_lcW = Floor($__FEng_WinW / $_aIlumMap[1]) + 2 ;Load coundW(for map parts)
Global $_lcH = Floor($__FEng_WinH / $_aIlumMap[1]) + 2 ;Load coundH(for map parts)

Global $_hSpr_U, $_hSpr_Map[$_lcW*$_lcH][5] ;0 hSpr; 1 nx; 2ny; 3dx; 4dy;
Global $_hTmp_X1, $_hTmp_Y1, $_hTmp_X2, $_hTmp_Y2, $_hTmp_Img

; ...

	If $_IlumC Then
		$_cX[1] = $_cX[0]
		$_cY[1] = $_cY[0]
	Else
		Select
			Case _IsPressed('25')
				$_cX[1] -= 2
			Case _IsPressed('27')
				$_cX[1] += 2

			Case _IsPressed('26')
				$_cY[1] -= 2
			Case _IsPressed('28')
				$_cY[1] += 2
		EndSelect
	EndIf

	If $_cX[1] <> $_hSpr_Map[0][3] Or $_cY[1] <> $_hSpr_Map[0][4] Then
		$_hSpr_Map[0][3] = $_cX[1]
		$_hSpr_Map[0][4] = $_cY[1]

		$_hTmp_X1 = Floor( $_cX[1] / $_aIlumMap[1] )
		$_hTmp_Y1 = Floor( $_cY[1] / $_aIlumMap[1] )
		If ($_hSpr_Map[0][1] <> $_hTmp_X1 Or $_hSpr_Map[0][2] <> $_hTmp_Y1) And ($_hTmp_X1 >= 0 And $_hTmp_Y1 >= 0 ) Then
			$_hSpr_Map[0][1] = $_hTmp_X1
			$_hSpr_Map[0][2] = $_hTmp_Y1

			MsgBox( 64, 'New load', 'Resources\' & $_aIlumMap[0] & '\' & $_IlumC_Scale & '_' & $_hTmp_Y1 & '_' & $_hTmp_X1 & '.png' )
			__FEng_Image_Dispose( __FEng_Image_hImg( __FEng_Sprite_ContainsImage( $_hSpr_Map[0][0] ) ) )

			$_hTmp_Img = _FEng_ImageLoad('Resources\' & $_aIlumMap[0] & '\' & $_IlumC_Scale & '_' & $_hTmp_X1 & '_' & $_hTmp_Y1 & '.png', $_aIlumMap[1], $_aIlumMap[1])
			_FEng_Sprite_ImageSet( $_hSpr_Map[0][0], $_hTmp_Img )
		EndIf
		$_hTmp_X2 = ($_IlumS_V[0] - ($_hSpr_Map[0][3] - ($_hSpr_Map[0][1] * $_aIlumMap[1])))
		$_hTmp_Y2 = ($_IlumS_H[1] - ($_hSpr_Map[0][4] - ($_hSpr_Map[0][2] * $_aIlumMap[1])))

		_FEng_Sprite_PosSet( $_hSpr_Map[0][0], $_hTmp_X2, $_hTmp_Y2 )
	EndIf
	_FEng_Sprite_Draw( $_hSpr_Map[0][0] )


Если у кого есть предложения по улучшению - прошу.
 
Верх