Avatar billede MadsHaupt Juniormester
12. januar 2014 - 14:39 Der er 40 kommentarer og
2 løsninger

Bytes in php

Hvor dan kan jeg læse og behandle og udskive bytes i php?.
Avatar billede arne_v Ekspert
12. januar 2014 - 15:29 #1
Du kan ikke laese og udskrive noget uden at laese og skrive bytes.

:-)

Men jeg gaetter paa at det er funktioner som:

http://www.php.net/manual/en/function.fopen.php
http://www.php.net/manual/en/function.fread.php
http://www.php.net/manual/en/function.fwrite.php
http://www.php.net/manual/en/function.fclose.php

du leder efter.
Avatar billede MadsHaupt Juniormester
12. januar 2014 - 17:12 #3
Problemet er at jeg ikke ved hvordan man behandler bytes i php, her er et eksempel på hvordan man kan behandle bytes i visual basic.

Eksempel i vb:
Dim data() As Byte = File.ReadAllBytes(path)
data(2) = 1
data(4) = 2
File.WriteAllBytes(path, data)
Avatar billede Slater Ekspert
12. januar 2014 - 18:41 #4
Som arne siger, ALT du arbejder med på en computer er bytes.
Ud fra det der ser det ud til at du mener at læse og skrive fra og til filer, og det er netop de funktioner arne smed i sin første kommentar.

Dog har PHP også et par lettere funktioner til det, hvis du skal læse eller skrive det hele. De hedder file_get_contents og file_put_contents.

F.eks. kan du sige
$data = file_get_contents($path);

Når du så har en streng, kan du få fat i de enkelte characters (eller bytes) i den ved at behandle den som en normal array.

$data[0] // <-- dette er første byte i strengen.
Avatar billede arne_v Ekspert
12. januar 2014 - 19:28 #5
PHP har ikke en byte type.

Umiddelbart var det saa maaske mest logisk at bruge et array af integer.

Men det kan de indbyggede PHP funktioner ikke haandtere.

Alternativet er at bruge en streng.

Det er hvad de indbyggede PHP funktioner forventer.

Og det virker. Fordi en streng i PHP ikke er en sekvens af tegn men en sekvens af bytes.

Saa du bruger bare strenge hvor du ellers ville have brugt byte arrays.
Avatar billede arne_v Ekspert
12. januar 2014 - 19:31 #6
Et klassisk eksempel er at:

<?php
$s = 'ÆØÅ';
echo strlen($s) . "\r\n";
echo mb_strlen($s, 'UTF-8') . "\r\n";
?>

hvis der bruges UTF-8 vil udskrive:

6
3
Avatar billede MadsHaupt Juniormester
12. januar 2014 - 19:38 #7
Hvordan kan jeg så oprette en ny streng lige som man i vb opretter en ny byte array.

Eksempel i vb
Dim array(5) As Byte
Avatar billede Slater Ekspert
12. januar 2014 - 19:47 #8
Hvorfor vil du gøre det?

Normalt vil du bare læse den streng du vil arbejde med ind i en variabel. Men hvis du endelig vil definere en streng af en bestemt længde kan du f.eks. bruge str_pad('', 5);
Avatar billede arne_v Ekspert
12. januar 2014 - 19:56 #9
PHP er et dynamisk sprog, saa du erklareer ikke variable - du bruger dem bare naar du har lyst.
Avatar billede arne_v Ekspert
12. januar 2014 - 19:57 #10
Og de kan ogsaa skifte type undervejs.

$x = 123;
$x = 'ABC';

er legalt.
Avatar billede MadsHaupt Juniormester
12. januar 2014 - 20:11 #11
Er der nogen der ved hvad man bruger i php, i stedet for bitmap.unlockbits og bitmap.lockbits i visual basic?.
Avatar billede arne_v Ekspert
12. januar 2014 - 20:29 #12
Det tvivler jeg paa at der er en PHP funktion til.

Den slags er meget platform specifikt.
Avatar billede MadsHaupt Juniormester
12. januar 2014 - 22:44 #13
Jeg ved i hvert et fald at der er en Image klasse i php, men kan man få værdigerne der fra?.
Avatar billede repox Seniormester
12. januar 2014 - 23:33 #14
Måske lidt opklaring af hvad det er du præcist forsøger at opnå ville kunne give dig nogle bedre svar?

Problemet er din forståelse af hvad bytes er i din form du vil bruge det i.

file.ReadAllBytes() bruges i VB til at indlæse alle bytes  fra en binær fil i den variabel du har angivet.

I PHP vil file_get_contents() give dig samme resultat.

En streng i PHP er jo blot at skrive noget ala:
$streng = "Indholdet her er en streng";

Bitmap.lockbits samt Bitmap.unlockbits er hokummelsesmæssige operationer - og det er ikke umiddelbart noget du vil arbejde med i PHP; men hvis du kan forklare hvad det er du vil opnå, så kan man jo væsentligt nemmere hjælp dig fremfor at finde og sammenligne operationer der ikke har pendanter til hinanden på tværs af sprogene.
Avatar billede MadsHaupt Juniormester
13. januar 2014 - 09:35 #15
Jeg har lavet mit eget billede format programmeret i vb, men jeg vil også programmere min hjemmeside til at læse og konverter fra og til mit eget format.
Avatar billede repox Seniormester
13. januar 2014 - 09:58 #16
Hvad skal det sige at du har lavet dit eget billedeformat?

Har du opfundet en ny MIME? Hvis det er tilfældet kan du ikke bruge den på din hjemmeside uanset, da browseren skal understøtte dit format for at kunne rendere det i browseren.
Avatar billede MadsHaupt Juniormester
13. januar 2014 - 10:06 #17
Det jeg ønsker er ikke at vise mit billede format i browseren, det jeg ønsker er at konverter fra og til mit format, via php.
Avatar billede repox Seniormester
13. januar 2014 - 10:15 #18
Det kræver indsigt i dit format at komme med en mulig forklaring.
Avatar billede MadsHaupt Juniormester
13. januar 2014 - 11:51 #19
Mit billede format er bygget op på følgende måde.

Først står bredden på billedet som en streng som er skrævet direkte i filen med Asc funktionen til at omdanne vær char til byte.

Bagefter kommer der et regn der ikke er et tal, jeg har valgt en binde streg også skrævet direkte i filen.

Til sidst kommer billedet, i argb farve rækkefølge.

Hvis bredden er 1920, vil det se nogen lunne sådan her ud i Notesblok:
1920-ÿÀÊßÿX5ÿúÓ˜ÿúÑ•ÿúÑ'ÿùБÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùАÿùБÿúÑ'ÿúÑ•ÿúÓ˜ÿU2ÿ³¿Øÿf}°ÿf}°ÿd|®ÿd|®ÿbz­ÿax«ÿ`w©ÿ]t§ÿ]t§ÿ[s¦ÿ[s¥ÿZs¥ÿYr¤ÿYq¤ÿWp£ÿWo£ÿVo£ÿVn¢ÿTn¢ÿTn¢ÿTm¡ÿSl ÿQk ÿPj ÿOj ÿNiŸÿMgžÿMgŸÿLgŸÿKfžÿIdÿIcÿHcœÿGbœÿGb›ÿEa›ÿD`šÿD_šÿB_˜ÿA]˜ÿ?\—ÿ?\—ÿ>[-ÿ=Z-ÿ=Z•ÿ=Y-ÿ;X•ÿ;W•ÿ:V•ÿ9V"ÿ8U"ÿ7U'ÿ7S"ÿ5T'ÿ5S'ÿ3R‘ÿ3Qÿ3Qÿ1Pÿ1Pÿ1Oÿ0Oÿ0NŽÿ0OŽÿ/OŽÿ.Nÿ.Mÿ-MŽÿ,Kÿ,Kÿ,Kÿ+Jÿ*JŒÿ*JŒÿ*JŒÿ)JŒÿ)I‹ÿ)JŒÿ)JŒÿ*JŒÿ)Jÿ)Jÿ(IŒÿ)IŒÿ)Jÿ*Jÿ)JŽÿ*JŽÿ+Kÿ*LŽÿ+Lÿ,Mÿ,Lÿ-M‘ÿ,M‘ÿ-N'ÿ-O'ÿ.O'ÿ-N'ÿ.O'ÿ.O'ÿ.O'ÿ.P"ÿ/P"ÿ/P"ÿ/P"ÿ.O"ÿ.O"ÿ.O"ÿ/O"ÿ/P"ÿ/P"ÿ/P"ÿ/P"ÿ/P"ÿ0P"ÿ0P"ÿ0P"ÿ0P"ÿ/P"ÿ/P"ÿ/P"ÿ/P"ÿ0P"ÿ0P"ÿ0P"ÿ0P"ÿ0Q"ÿ1Q"ÿ1Q"ÿ1Q"ÿ1Q"ÿ1Q"ÿ1Q"ÿ1Q"ÿ1Q"ÿ1Q"ÿ1R"ÿ1R"ÿ1R"ÿ1R"ÿ1R"ÿ1R"ÿ2R"ÿ2R"ÿ2R•ÿ2R•ÿ2R•ÿ2R•ÿ2R•ÿ2R•ÿ2R•ÿ2R•ÿ2R•ÿ2R•ÿ2R"ÿ2R"ÿ1R"ÿ1R"ÿ1Q"ÿ0Q"ÿ0Q"ÿ/P"ÿ.O"ÿ.O'ÿ-N'ÿ,
...

Her er vb koden til mit billede format:
Imports System.Runtime.InteropServices
Imports System.Drawing.Imaging
Imports System.Drawing
Imports System.IO

#Region "Enums"

Public Enum RotateMode As Integer
    Rotate90Right
    Rotate90Left
    Rotate180
End Enum

Public Enum RotateToMode As Integer
    RotateToNone
    RotateTo90
    RotateTo180
    RotateTo270
End Enum

Public Enum FlipMode As Integer
    Horizontal
    Vertical
End Enum

#End Region

Public Class MHBitmap

    Dim pixels() As Byte
    Dim width_ As Integer

#Region "Public Sub New"

    Public Sub New(ByVal Bytes() As Byte)
        Dim WidthStr As String = ""
        For i = 0 To Bytes.Length - 1
            If IsNumeric(Chr(Bytes(i))) Then
                WidthStr &= Chr(Bytes(i))
            Else
                Exit For
            End If
        Next
        Dim picByte(Bytes.Length - 1 - WidthStr.Length - 1) As Byte
        Dim i2 As Integer = 0
        For i = WidthStr.Length + 1 To Bytes.Length - 1
            picByte(i2) = Bytes(i)
            i2 += 1
        Next
        pixels = picByte
        width_ = WidthStr
    End Sub

    Public Sub New(ByVal FileName As String)
        Dim Bytes() As Byte = File.ReadAllBytes(FileName)
        Dim WidthStr As String = ""
        For i = 0 To Bytes.Length - 1
            If IsNumeric(Chr(Bytes(i))) Then
                WidthStr &= Chr(Bytes(i))
            Else
                Exit For
            End If
        Next
        Dim picByte(Bytes.Length - 1 - WidthStr.Length - 1) As Byte
        Dim i2 As Integer = 0
        For i = WidthStr.Length + 1 To Bytes.Length - 1
            picByte(i2) = Bytes(i)
            i2 += 1
        Next
        pixels = picByte
        width_ = WidthStr
    End Sub

    Public Sub New(ByVal Stream As Stream)
        Dim Bytes(Stream.Length - 1) As Byte
        Stream.Read(Bytes, 0, Stream.Length)
        Stream.Close()
        Dim WidthStr As String = ""
        For i = 0 To Bytes.Length - 1
            If IsNumeric(Chr(Bytes(i))) Then
                WidthStr &= Chr(Bytes(i))
            Else
                Exit For
            End If
        Next
        Dim picByte(Bytes.Length - 1 - WidthStr.Length - 1) As Byte
        Dim i2 As Integer = 0
        For i = WidthStr.Length + 1 To Bytes.Length - 1
            picByte(i2) = Bytes(i)
            i2 += 1
        Next
        pixels = picByte
        width_ = WidthStr
    End Sub

    Public Sub New(ByVal Image As Image)
        Dim img As Bitmap = Image.Clone
        Dim btsdata As BitmapData = img.LockBits(New Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb)
        Dim ptr As IntPtr = btsdata.Scan0
        Dim bytes(btsdata.Stride * btsdata.Height - 1) As Byte
        Dim pixbytes(bytes.Length - 1) As Byte
        Marshal.Copy(ptr, bytes, 0, bytes.Length)
        For i = 0 To bytes.Length - 4 Step 4
            pixbytes(i) = bytes(i + 3)
            pixbytes(i + 1) = bytes(i + 2)
            pixbytes(i + 2) = bytes(i + 1)
            pixbytes(i + 3) = bytes(i)
        Next
        img.UnlockBits(btsdata)
        pixels = pixbytes
        width_ = img.Width
    End Sub

#End Region

    Public Function ToBitmap() As Bitmap
        Dim pic As New Bitmap(Me.Width, Me.Height)
        Dim data As BitmapData = pic.LockBits(New Rectangle(0, 0, pic.Width, pic.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb)
        Dim ptr As IntPtr = data.Scan0
        Dim bytes(data.Stride * data.Height - 1) As Byte
        Marshal.Copy(ptr, bytes, 0, bytes.Length)
        For i = 0 To pixels.Length - 4 Step 4
            bytes(i + 3) = pixels(i)
            bytes(i + 2) = pixels(i + 1)
            bytes(i + 1) = pixels(i + 2)
            bytes(i) = pixels(i + 3)
        Next
        Marshal.Copy(bytes, 0, ptr, bytes.Length)
        pic.UnlockBits(data)
        Return pic
    End Function

    Public Function Clone() As MHBitmap
        Return New MHBitmap(Me.GetBytes) With {.NowMode = Me.NowMode}
    End Function

    Public Function GetIntPtrResource() As IntPtr
        Return GCHandle.ToIntPtr(GCHandle.Alloc(Me.GetBytes))
    End Function

    Public Shared Sub SetWidth(ByVal Image As MHBitmap, ByVal Width As Integer)
        Image.width_ = Width
    End Sub

#Region "Shared"

    Public Shared Function FromFile(ByVal FileName As String) As MHBitmap
        Return New MHBitmap(FileName)
    End Function

    Public Shared Function FromStream(ByVal Stream As Stream) As MHBitmap
        Return New MHBitmap(Stream)
    End Function

    Public Shared Function FromImage(ByVal Image As Image) As MHBitmap
        Return New MHBitmap(Image)
    End Function

    Public Shared Function FromByteArray(ByVal Array() As Byte) As MHBitmap
        Return New MHBitmap(Array)
    End Function

    Public Shared Function FromIntPtrResource(ByVal Ptr As IntPtr) As MHBitmap
        Return New MHBitmap(CType(GCHandle.FromIntPtr(Ptr).Target, Byte()))
    End Function

    Public Shared Function FromIntPtrObject(ByVal Ptr As IntPtr) As MHBitmap
        Return GCHandle.FromIntPtr(Ptr).Target
    End Function

#End Region

#Region "Bytes"

    Public Sub Save(ByVal FileName As String)
        Dim lenstrchs() As Char = width_.ToString
        Dim chslen As Integer = lenstrchs.Length
        Dim Bytes(pixels.Length + chslen) As Byte
        For i = 0 To chslen - 1
            Bytes(i) = Asc(lenstrchs(i))
        Next
        Bytes(chslen) = Asc("-")
        For i = 0 To pixels.Length - 1
            Bytes(i + chslen + 1) = pixels(i)
        Next
        File.WriteAllBytes(FileName, Bytes)
    End Sub

    Public Sub Save(ByVal Stream As Stream)
        Dim lenstrchs() As Char = width_.ToString
        Dim chslen As Integer = lenstrchs.Length
        Dim Bytes(pixels.Length + chslen) As Byte
        For i = 0 To chslen - 1
            Bytes(i) = Asc(lenstrchs(i))
        Next
        Bytes(chslen) = Asc("-")
        For i = 0 To pixels.Length - 1
            Bytes(i + chslen + 1) = pixels(i)
        Next
        Stream.Write(Bytes, 0, Bytes.Length)
    End Sub

    Public Function GetBytes() As Byte()
        Dim lenstrchs() As Char = width_.ToString
        Dim chslen As Integer = lenstrchs.Length
        Dim Bytes(pixels.Length + chslen) As Byte
        For i = 0 To chslen - 1
            Bytes(i) = Asc(lenstrchs(i))
        Next
        Bytes(chslen) = Asc("-")
        For i = 0 To pixels.Length - 1
            Bytes(i + chslen + 1) = pixels(i)
        Next
        Return Bytes
    End Function

#End Region

#Region "Rotate"

#Region "Private"

    Private Sub Rotate90Right()
        Dim bytes(pixels.Length - 1) As Byte
        Dim heightX4 As Integer = Me.Height * 4
        Dim width_X4 As Integer = width_ * 4
        Dim index As Integer = 0
        For i = pixels.Length - width_X4 To 0 Step -width_X4
            Dim height_index As Integer = 0
            For i2 = 0 To width_X4 - 4 Step 4
                Dim bytestart As Integer = height_index + index
                Dim pixstart As Integer = i + i2
                bytes(bytestart) = pixels(pixstart)
                bytes(bytestart + 1) = pixels(pixstart + 1)
                bytes(bytestart + 2) = pixels(pixstart + 2)
                bytes(bytestart + 3) = pixels(pixstart + 3)
                height_index += heightX4
            Next
            index += 4
        Next
        pixels = bytes
        width_ = Me.Height
    End Sub

    Private Sub Rotate180()
        Dim pixlength As Integer = pixels.Length
        Dim bytes(pixlength - 1) As Byte
        For i = 0 To pixlength - 4 Step 4
            Dim start As Integer = pixlength - i - 4
            bytes(start) = pixels(i)
            bytes(start + 1) = pixels(i + 1)
            bytes(start + 2) = pixels(i + 2)
            bytes(start + 3) = pixels(i + 3)
        Next
        pixels = bytes
    End Sub

    Private Sub Rotate90Left()
        Dim bytes(pixels.Length - 1) As Byte
        Dim heightX4 As Integer = Me.Height * 4
        Dim width_X4 As Integer = width_ * 4
        Dim index As Integer = 0
        For i = 0 To pixels.Length - 4 Step width_X4
            Dim height_index As Integer = 0
            For i2 = width_X4 - 4 To 0 Step -4
                Dim bytestart As Integer = height_index + index
                Dim pixstart As Integer = i + i2
                bytes(bytestart) = pixels(pixstart)
                bytes(bytestart + 1) = pixels(pixstart + 1)
                bytes(bytestart + 2) = pixels(pixstart + 2)
                bytes(bytestart + 3) = pixels(pixstart + 3)
                height_index += heightX4
            Next
            index += 4
        Next
        pixels = bytes
        width_ = Me.Height
    End Sub

    Private Sub RotateTo(ByVal tomode As RotateToMode, ByVal nowmode As RotateToMode)
        Select Case tomode
            Case RotateToMode.RotateTo180
                Select Case nowmode
                    Case RotateToMode.RotateToNone
                        Me.Rotate180()
                    Case RotateToMode.RotateTo180

                    Case RotateToMode.RotateTo90
                        Me.Rotate90Right()
                    Case RotateToMode.RotateTo270
                        Me.Rotate90Left()
                End Select
            Case RotateToMode.RotateToNone
                Select Case nowmode
                    Case RotateToMode.RotateToNone

                    Case RotateToMode.RotateTo180
                        Me.Rotate180()
                    Case RotateToMode.RotateTo90
                        Me.Rotate90Left()
                    Case RotateToMode.RotateTo270
                        Me.Rotate90Right()
                End Select
            Case RotateToMode.RotateTo90
                Select Case nowmode
                    Case RotateToMode.RotateToNone
                        Me.Rotate90Right()
                    Case RotateToMode.RotateTo180
                        Me.Rotate90Left()
                    Case RotateToMode.RotateTo90

                    Case RotateToMode.RotateTo270
                        Me.Rotate180()
                End Select
            Case RotateToMode.RotateTo270
                Select Case nowmode
                    Case RotateToMode.RotateToNone
                        Me.Rotate90Left()
                    Case RotateToMode.RotateTo180
                        Me.Rotate90Right()
                    Case RotateToMode.RotateTo90
                        Me.Rotate180()
                    Case RotateToMode.RotateTo270

                End Select
        End Select
    End Sub

#End Region

#Region "Rotate"

    Public Shared Sub Rotate(ByVal FileName As String, ByVal Mode As RotateMode)
        Dim mhbimg As New MHBitmap(FileName)
        Select Case Mode
            Case RotateMode.Rotate180
                mhbimg.Rotate180()
            Case RotateMode.Rotate90Left
                mhbimg.Rotate90Left()
            Case RotateMode.Rotate90Right
                mhbimg.Rotate90Right()
        End Select
        mhbimg.Save(FileName)
    End Sub

    Public Shared Sub Rotate(ByVal Image As MHBitmap, ByVal Mode As RotateMode)
        Select Case Mode
            Case RotateMode.Rotate180
                Image.Rotate180()
            Case RotateMode.Rotate90Left
                Image.Rotate90Left()
            Case RotateMode.Rotate90Right
                Image.Rotate90Right()
        End Select
    End Sub

    Public Sub Rotate(ByVal Mode As RotateMode)
        Select Case Mode
            Case RotateMode.Rotate180
                Me.Rotate180()
            Case RotateMode.Rotate90Left
                Me.Rotate90Left()
            Case RotateMode.Rotate90Right
                Me.Rotate90Right()
        End Select
    End Sub

#End Region

#Region "RotateTo"

    Shared PathList As New List(Of String)
    Shared RotateList As New List(Of RotateToMode)

    Public Shared Sub RotateTo(ByVal FileName As String, ByVal Mode As RotateToMode)
        Dim mhbimg As New MHBitmap(FileName)
        Dim Rotate As RotateToMode = RotateToMode.RotateToNone
        Dim index As Integer
        If PathList.Contains(FileName) Then
            index = PathList.IndexOf(FileName)
            Rotate = RotateList(index)
        Else
            PathList.Add(FileName)
            RotateList.Add(Mode)
            index = PathList.Count - 1
        End If
        mhbimg.RotateTo(Mode, Rotate)
        RotateList(index) = Mode
        mhbimg.Save(FileName)
    End Sub

    Shared ImageList As New List(Of MHBitmap)
    Shared ModeList As New List(Of RotateToMode)

    Public Shared Sub RotateTo(ByVal Image As MHBitmap, ByVal Mode As RotateToMode)
        Dim index As Integer
        Dim Rotate As RotateToMode = RotateToMode.RotateToNone
        If ImageList.Contains(Image) Then
            index = ImageList.IndexOf(Image)
            Rotate = ModeList(index)
        Else
            ImageList.Add(Image)
            ModeList.Add(Mode)
            index = ModeList.Count - 1
        End If
        Image.RotateTo(Mode, Rotate)
        ModeList(index) = Mode
    End Sub

    Dim NowMode As RotateToMode = RotateToMode.RotateToNone

    Public Sub RotateTo(ByVal Mode As RotateToMode)
        Me.RotateTo(Mode, NowMode)
        NowMode = Mode
    End Sub

#End Region

    Public Sub Rotate(ByVal Degrees As Integer, Optional ByVal BackColor As Color = Nothing)
        Dim colorbytes() As Byte = {BackColor.A, BackColor.R, BackColor.G, BackColor.B}
        Dim wm As Integer = Me.Height / 2 / 90 * Degrees
        Dim [step] As Double = Me.Height / 2 / 90
        Dim newwidth As Integer = width_ + wm
        Dim newbytessize As Integer = newwidth * Me.Height * 4
        Dim newbytes(newbytessize - 1) As Byte
        For i = 0 To newbytes.Length - 4 Step 4
            newbytes(i) = colorbytes(0)
            newbytes(i + 1) = colorbytes(1)
            newbytes(i + 2) = colorbytes(2)
            newbytes(i + 3) = colorbytes(3)
        Next
        Dim pp As Double = 0
        Dim newwidthX4 As Integer = newwidth * 4
        For i = 0 To newwidthX4 - 4 Step 4
            Dim start As Integer = i + (CType(pp, Integer) * newwidthX4)
            'newbytes(start) =
            pp += [step]
        Next
        pixels = newbytes
        width_ = newwidth
    End Sub

#End Region

#Region "Flip"

    Private Sub FlipVertical()
        Dim bytes(pixels.Length - 1) As Byte
        Dim widthX4 As Integer = width_ * 4
        Dim iM As Integer = pixels.Length - widthX4
        For i = 0 To iM Step widthX4
            For i2 = 0 To widthX4 - 4 Step 4
                Dim bytestart As Integer = iM + i2
                Dim pixstart As Integer = i + i2
                bytes(bytestart) = pixels(pixstart)
                bytes(bytestart + 1) = pixels(pixstart + 1)
                bytes(bytestart + 2) = pixels(pixstart + 2)
                bytes(bytestart + 3) = pixels(pixstart + 3)
            Next
            iM -= widthX4
        Next
        pixels = bytes
    End Sub

    Private Sub FlipHorizontal()
        Dim bytes(pixels.Length - 1) As Byte
        Dim widthX4 As Integer = width_ * 4
        For i = 0 To pixels.Length - widthX4 Step widthX4
            Dim i2M As Integer = widthX4 - 4
            For i2 = 0 To i2M Step 4
                Dim bytestart As Integer = i + i2M
                Dim pixstart As Integer = i + i2
                bytes(bytestart) = pixels(pixstart)
                bytes(bytestart + 1) = pixels(pixstart + 1)
                bytes(bytestart + 2) = pixels(pixstart + 2)
                bytes(bytestart + 3) = pixels(pixstart + 3)
                i2M -= 4
            Next
        Next
        pixels = bytes
    End Sub

    Public Sub Flip(ByVal Mode As FlipMode)
        Select Case Mode
            Case FlipMode.Vertical
                Me.FlipVertical()
            Case FlipMode.Horizontal
                Me.FlipHorizontal()
        End Select
    End Sub

#End Region

#Region "Size"

    Public ReadOnly Property Width As Integer
        Get
            Return width_
        End Get
    End Property

    Public ReadOnly Property Height As Integer
        Get
            Return pixels.Length / width_ / 4
        End Get
    End Property

    Public ReadOnly Property Size As Size
        Get
            Return New Size(Width, Height)
        End Get
    End Property

#End Region

#Region "Pixel"

    Public Sub SetPixel(ByVal X As Integer, ByVal Y As Integer, ByVal Color As Color)
        Dim index As Integer = (X * width_ + Y) * 4
        pixels(index) = Color.A
        pixels(index + 1) = Color.R
        pixels(index + 2) = Color.G
        pixels(index + 3) = Color.B
    End Sub

    Public Function GetPixel(ByVal X As Integer, ByVal Y As Integer) As Color
        Dim index As Integer = (X * width_ + Y) * 4
        Return Color.FromArgb(pixels(index), pixels(index + 1), pixels(index + 2), pixels(index + 3))
    End Function

#End Region

End Class
Avatar billede MadsHaupt Juniormester
14. januar 2014 - 15:30 #20
Hvordan behandler man billeder i php?.
Avatar billede arne_v Ekspert
14. januar 2014 - 15:40 #21
Normalt vil man bruge en PHP extension.

http://www.php.net/manual/en/refs.utilspec.image.php
Avatar billede repox Seniormester
14. januar 2014 - 15:49 #22
Nu spørger jeg måske lidt fjollet - men hvad er formålet med dit eget format?
Avatar billede MadsHaupt Juniormester
14. januar 2014 - 15:52 #23
Det ved jeg faktisk ikke, men har er sådan en der får mange ideer, nogle kan bruges til noget andre kan ikke.
Avatar billede MadsHaupt Juniormester
14. januar 2014 - 15:54 #24
Hvordan kan jeg så get'te og set'te alle pixel i et billede via php?.
Avatar billede Slater Ekspert
14. januar 2014 - 16:03 #25
F.eks. med imagecolorat() og imagesetpixel() i gd.

Men PHP er et utroligt dårligt valg til at gøre den slags. Funktionerne er ikke lavet til at arbejde med billeder på den måde, og det vil være sløvt.

Den rette måde at gøre det på vil være at skrive en extension til PHP i et andet sprog. Hvis man altså absolut vil have det til at virke i PHP.
Avatar billede MadsHaupt Juniormester
14. januar 2014 - 16:06 #26
Hvordan skriver man så en extension til PHP?.
Avatar billede arne_v Ekspert
14. januar 2014 - 16:06 #27
i C


:-)
Avatar billede repox Seniormester
14. januar 2014 - 16:10 #28
Det bliver sgu en lang tråd det her...
Avatar billede MadsHaupt Juniormester
14. januar 2014 - 16:19 #29
Jeg mente altså ikke hvad for et programmering sprog, men hvordan man gør det.
Avatar billede arne_v Ekspert
14. januar 2014 - 16:31 #30
Du skriver noget kode som buildes med et library og exposer et bestemt API.
Avatar billede MadsHaupt Juniormester
14. januar 2014 - 16:49 #31
Jeg ved ikke hvilken API, er der ikke en tutorial et sted om hvordan man gør det?.
Avatar billede MadsHaupt Juniormester
14. januar 2014 - 16:52 #32
Jeg kan sagtens lave en library, men så der bare det andet.
Avatar billede arne_v Ekspert
14. januar 2014 - 20:28 #34
Men din VB.NET kode kan godt omskrives til PHP kode. Det vil bare tage lidt tid. Og performance bliver naeppe super god.
Avatar billede MadsHaupt Juniormester
15. januar 2014 - 09:58 #35
Jeg har min hjemmeside på one.com.
Avatar billede arne_v Ekspert
15. januar 2014 - 18:39 #36
Saa kan du ikke installere en extension.

Saa maa du jo bare kode det i PHP.

PEAR style ikke PECL style.
Avatar billede MadsHaupt Juniormester
05. februar 2014 - 15:51 #37
Jeg har fundet ud af det, jeg bruger det ikke til store filer som mit eget billede format, jeg bruger det i stedet til små filer, som for eksempel til et Jeopardy spil, se her: http://www.eksperten.dk/spm/990695

arne_v, viperine og repox skriv et svar så får i point.
Avatar billede arne_v Ekspert
05. februar 2014 - 22:58 #38
svar
Avatar billede Slater Ekspert
06. februar 2014 - 07:53 #39
svar
Avatar billede MadsHaupt Juniormester
06. februar 2014 - 11:56 #40
viperine du er kommet til at lave en kommentar i stedet for et svar.
Avatar billede Slater Ekspert
07. februar 2014 - 07:07 #41
Hold da kæft, jeg er et geni. Tak.
Avatar billede MadsHaupt Juniormester
07. februar 2014 - 09:25 #42
Hov, hov, viperine tal pænt.

repox husk at skrive hvis du ikke vil have point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester