Это то понятно, да. Но вот как посчитать площадь? Считать для клипнутого параллелограмма? Если не затруднит, подкиньте пожалуйста формулу(код тоже не помешает).
ArtProg
> Считать для клипнутого параллелограмма?
Я же написал:
> На картинке показано с поворотом, просто не стал новую картинку рисовать.
Это скейл без поворота, никаких параллелограммов, только прямоугольники, код такой:
Используется только целочисленная математика (fixed point), никаких зависимостей, даже от стандартной библиотеки.
Возможен разный масштаб по вертикали и по горизонтали.
*src - указатель на массив источник, *dest - указатель на массив приёмник.
ws, hs - ширина и высота изображения в массиве источнике.
wd, hd - то же для массива приёмника.
Вот, с кодом совсем другое дело. Мне до такого еще долго бы пришлось додумыватся). Спасибо!
Mikle
а можно как-то создать новый спрайт по cbuf-у?
ну т.е если я делаю что-то, и у меня есть массив с argb значениями
и создать новый спрайт по этому массиву, без setpixel циклов?
или быстрее не будет?
SilentPrayerCG
Сделай CopyMemory, быстрее не придумаешь.
Mikle
это из той-же истории что lockbits?
я так и не разобрался с этим
где-то видел пример использования понятный, на телефоне... надо на компе найти чтобы попытаться вкурить его
Посмотри как в LoadFromBitmap() копируются данные из битмапа в cBuf спрайта.
Mikle
Я так понимаю, чтобы создать новый спрайт тупо из цбуфера
достаточно сделать так
Public Sub New(ColorBuffer() As Integer, SpriteSize As Size)
Init(SpriteSize.Width, SpriteSize.Height)
cBuf = ColorBuffer
End Sub
проверил работает
вот если в битмап нужно залить данные, тогда локбитс нужен
Просто NET сам неявно делает лок, если ты попробуешь сделать именно CopyMemory — тут уже без лока ColorBuffer не получится. Вот cBuf не нужно локать — он локается в Init.
Возможно, так будет грамотнее:
cBuf = ColorBuffer.Clone
Давно NET не загружал.
Mikle
а погоди.. я если через аргументы передам, он свяжет их как-бы..
copymemory это marshal.copy?
я просто посмотрел тот код который ты сказал посмотреть,
там инит с размерами, да просто через маршал копируется буфер в цбуф
но если у меня на руках просто массив интеджеров, я не вижу способа через маршал его скопировать
ну точнее я ничего в этом маршале не понимаю, но ему intptr нужен
работает вот так
Public Sub New(ColorBuffer() As Integer, SpriteSize As Size)
Init(SpriteSize.Width, SpriteSize.Height)
ColorBuffer.CopyTo(cBuf, 0)
End Sub
копито, тогда будет копия массива в массив
.clone создает shallow copy, и я так и не понял что это значит
я пытался делать clone двух массивов, и у них значения связаны получаются., т.е меняешь в одном меняется в другом, я не уверен в чем разница между clone и если их просто сделать = друг другу
--
еще вопрос, почему даже когда копируешь cbuf в битмап через локбитс через маршал, то у битмапдаты, imagelock стоит readonly
я же записываю что-то туда... как это работает
В LoadFromBitmap битмап локается с флагом Imaging.ImageLockMode.ReadOnly. Очевидно, что для записи нужен другой флаг.
SilentPrayerCG
> copymemory это marshal.copy?
Скорее так: marshal.copy — это copymemory с проверками безопасности.
SilentPrayerCG
> я пытался делать clone двух массивов, и у них значения связаны получаются
Интересно, надо будет затестить...
Mikle
ты мне давал тогда код для получения битмапы из спрайта
Public Function GetNewBitmap() As Bitmap Dim BmpDest As Bitmap BmpDest = New Bitmap(meWidth, meHeight, Imaging.PixelFormat.Format32bppArgb) Dim BMD As Imaging.BitmapData = BmpDest.LockBits(Rectangle.Round(BmpDest.GetBounds(GraphicsUnit.Pixel)), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb) Marshal.Copy(cBuf, 0, BMD.Scan0, meWidth * meHeight) BmpDest.UnlockBits(BMD) Return BmpDest End Function
тут тоже рид онли
я сейчас проверял, работает, взял из спрайта цбуф, и скопировал в битмап и вывел, хотя стоит ридонли
Mikle
Дак почему в этом коде где cbuf копируется в лоченый bitmap, всё-таки стоит readonly? И при этом работает.
Или все-таки я как-то не так понимаю этот флаг?
SilentPrayerCG
Я, когда давал тебе этот код, просто недосмотрел, не поменял флаг при копипасте, но код работает... Это выглядит странно.
Mikle
вот и я о том-же...
но как показывается практика, это скорее всего не баг а фича