kristaps.liepa Ierakstīts Augusts 15, 2018 Share Ierakstīts Augusts 15, 2018 Sveiciens! Cīnos ar neliela koda pārtulkošanu no VB uz c#. Atdūros pret šādu te lietu. Man kā c# lietotājam nav saprotama rindiņa "a = alphaMap((g * 2) - r - b)". C# valodā tas izskatās pēc funkcijas ar nosaukumu alphaMap(int n), bet cik man saprotams, tas ir Integer, kurš neatbalsta parametrus. Vai kāds var palīdzēt saprast kā interpretēt? Private alphaMap(509) As Integer ...... Private Function GreenChromaKey(ByVal sourceImage As Image) As Bitmap Dim bmp As New Bitmap(sourceImage) Using fp As New fastpix(bmp) Dim pixels() As Integer = fp.PixelArray For i As Integer = 0 To pixels.Length - 1 Dim clr As Integer = pixels(i) Dim r As Integer = (clr And &HFF0000) >> 16 Dim g As Integer = (clr And &HFF00) >> 8 Dim b As Integer = clr And &HFF Dim a As Integer = 255 If g > r AndAlso g > b Then a = alphaMap((g * 2) - r - b) End If pixels(i) = (clr And &HFFFFFF) Or (a << 24) Next End Using Return bmp End Function Link to comment Share on other sites More sharing options...
argonaut Augusts 15, 2018 Share Augusts 15, 2018 Tas ir masīvs! Skat. pirmo rindiņu definējumu. Link to comment Share on other sites More sharing options...
kristaps.liepa Augusts 15, 2018 Author Share Augusts 15, 2018 Laikam iebraucu. c# tas izskatās kā a = alphaMap[(g * 2) - r - b]; Link to comment Share on other sites More sharing options...
AndrisBB Augusts 15, 2018 Share Augusts 15, 2018 (labots) Nu viss diezgan vienkarsi, ja zala rgb komponente ir lielaka par sarkano on zilo, tad alfu panjem no kautkadas lookup tabulas, savadak aizvieto at FF. Nav jau nozime vai ta ir funkcija vai masivs, nav jau zinams pats algoritms ka alfu konkretajam r g b vertibam aprekinat. Mekle Green Chroma Key lookup tabulu vai funkciju, kas aprekjinas. Pirms 3 minūtēm , kristaps.liepa teica: a = alphaMap[(g * 2) - r - b]; Nu ja tev iz zinamas vertibas, tad ta ari ir. Labots Augusts 15, 2018 - AndrisBB Link to comment Share on other sites More sharing options...
kristaps.liepa Augusts 15, 2018 Author Share Augusts 15, 2018 Ir šis te: Private Sub initAlphaMap(ByVal fullyTransparentEndIndex As Integer, ByVal semiTransparentEndIndex As Integer) Dim alphaMapArray As New List(Of Integer)(510) For i As Integer = 0 To 509 If i < fullyTransparentEndIndex Then alphaMapArray.Add(255) ElseIf i >= fullyTransparentEndIndex AndAlso i < semiTransparentEndIndex Then Dim lengthOfSemis As Double = semiTransparentEndIndex - fullyTransparentEndIndex Dim indexValue As Double = CDbl(i - fullyTransparentEndIndex) Dim multiplier As Double = 1 - (indexValue / CDbl(lengthOfSemis)) Dim alphaValue As Integer = CInt(multiplier * 255.0) alphaMapArray.Add(alphaValue) Else alphaMapArray.Add(0) End If Next alphaMap = alphaMapArray.ToArray() End Sub Link to comment Share on other sites More sharing options...
AndrisBB Augusts 15, 2018 Share Augusts 15, 2018 Nu tur ari tas lookup table tiek aizpildits Link to comment Share on other sites More sharing options...
kristaps.liepa Augusts 15, 2018 Author Share Augusts 15, 2018 Vienīgi pārtulkojot uz c# viss kopā nestrādā. string testfile = @"C:/testgs.jpg"; private Bitmap[] m_Bm = new Bitmap[4]; private int[] alphaMap = new int[510]; public MainWindow() { InitializeComponent(); initAlphaMap(20, 50); imageprew.Source = get_image_source(GreenChromaKey(Image.FromFile(testfile))); } public static BitmapImage get_image_source(Bitmap source) { BitmapImage image = new BitmapImage(); using (var stream = new MemoryStream()) { source.Save(stream,ImageFormat.Bmp); image.BeginInit(); image.CacheOption = BitmapCacheOption.OnLoad; image.StreamSource = stream; image.EndInit(); image.Freeze(); } return image; } private void initAlphaMap(int fullyTransparentEndIndex, int semiTransparentEndIndex) { List<int> alphaMapArray = new List<int>(510); for (int i = 0; i <= 509; i++) { if (i < fullyTransparentEndIndex) alphaMapArray.Add(255); else if (i >= fullyTransparentEndIndex && i < semiTransparentEndIndex) { double lengthOfSemis = semiTransparentEndIndex - fullyTransparentEndIndex; double indexValue = System.Convert.ToDouble(i - fullyTransparentEndIndex); double multiplier = 1 - (indexValue / System.Convert.ToDouble(lengthOfSemis)); int alphaValue = System.Convert.ToInt32(multiplier * 255.0); alphaMapArray.Add(alphaValue); } else alphaMapArray.Add(0); } alphaMap = alphaMapArray.ToArray(); } private Bitmap GreenChromaKey(Image sourceImage) { Bitmap bmp = new Bitmap(sourceImage); using (fastpix fp = new fastpix(bmp)) { int[] pixels = fp.PixelArray; for (int i = 0; i < pixels.Length; i++) { int clr = pixels[i]; int r = (clr & 0xFF0000) >> 16; int g = (clr & 0xFF00) >> 8; int b = clr & 0xFF; int a = 255; if (g > r && g > b) { a = alphaMap[g * 2 - r - b]; } pixels[i] = (clr & 0xFFFFFF) | (a << 24); } } return bmp; } Link to comment Share on other sites More sharing options...
AndrisBB Augusts 15, 2018 Share Augusts 15, 2018 Pirms 15 minūtēm , kristaps.liepa teica: List<int> alphaMapArray = new List<int>(510); Neredzu tur jegu no tas listes, saglaba pa taisno masiva, savadak tads copy/paste bez saprashanas ko tieshi velas panakt. tak uzliec breikpointus un skaties kas notiek. Maz ticams ka te ir kads kas no galvas zin ka C# funkcijas ka apstradat raw attelus Link to comment Share on other sites More sharing options...
rubb Augusts 15, 2018 Share Augusts 15, 2018 Šeit gan ir galvas, kuras sī šārpu zin diezgan labi... tikai šitas "uzdevums" vairāk izskatās kā mēģinājums makšķerēt spečus... ja tā ir - diezgan OK. ja nē, tad use google :)_ 1 Link to comment Share on other sites More sharing options...
AndrisBB Augusts 15, 2018 Share Augusts 15, 2018 (labots) Pirms 6 minūtēm , rubb teica: Šeit gan ir galvas, kuras sī šārpu zin diezgan labi. Viena lieta ir zinat C# labi, pavisam cita atcereties no galvas bitmapu funkcijas. Ja jaut'atu man so jautajumu gadus 10 atpakal, kad tas bij man aktuali un ar to njemos, tad drosi ka atbildi dotu uzreiz, bet ta tagad googlet dokumentaciju kada cita vieta maz ticams ka kads velesies Labots Augusts 15, 2018 - AndrisBB Link to comment Share on other sites More sharing options...
kristaps.liepa Augusts 15, 2018 Author Share Augusts 15, 2018 Neko nemakšķerēju. Padomāju, ka ir simple lieta, ko nesaprotu, nezinot VB sintaksi, to arī noskaidroju. Pirmīt 2h pa googli gāju strupceļā, pieejot problēmai no nepareizā gala. Rakšos tālāk pats.. Paldies! Link to comment Share on other sites More sharing options...
Recommended Posts
Izveido kontu, vai pieraksties esošajā, lai komentētu
Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas
Izveidot jaunu kontu
Piereģistrējies un izveido jaunu kontu, tas būs viegli!
Reģistrēt jaunu kontuPierakstīties
Jums jau ir konts? Pierakstieties tajā šeit!
Pierakstīties tagad!