Jump to content

VB to C#


kristaps.liepa
 Share

Recommended Posts

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

kristaps.liepa

Laikam iebraucu.

 

c# tas izskatās kā 

a = alphaMap[(g * 2) - r - b];
Link to comment
Share on other sites

AndrisBB

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 - AndrisBB
Link to comment
Share on other sites

kristaps.liepa

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

kristaps.liepa

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

AndrisBB
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

Š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 :)_

  • Kādas šausmas! 1
Link to comment
Share on other sites

AndrisBB
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 - AndrisBB
Link to comment
Share on other sites

kristaps.liepa

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

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 kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...