ArtProg
> как именно высчитываются весовые коэффициенты для каждого отдельного цветового
> канала(R,G,B,A)?
Для всех четырёх каналов (R,G,B,A) одинаково. За единицу принимаем площадь пикселя приёмника. Цвет каждого пикселя источника умножается на площадь участка, попадающего на приёмник.
Это то понятно, да. Но вот как посчитать площадь? Считать для клипнутого параллелограмма? Если не затруднит, подкиньте пожалуйста формулу(код тоже не помешает).
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
Я, когда давал тебе этот код, просто недосмотрел, не поменял флаг при копипасте, но код работает... Это выглядит странно.