Skalieren von 2D Pixeln

  • Hallöchen!

    Ich habe ein kleines Problem: Und zwar möchte ich eine Grafik, die die von der Größe einer Potenz zur Basis 2 (2, 4, 8, 16 usw.) auf die doppelte größe vergrößern. Also zum Beispiel von 2x2 auf 4x4 pixel. Das interpolieren zwischen zwei Punkten ist kein Problem aber was mache ich an den unteren/rechten Rändern?

    Ich zeige mein Problem mal an einem Beispiel:
    X ist eine festgelegte Farbe und 0 eine nicht festgelegte Farbe.
    Rot sind die nicht interpolierbaren Pixel und grün die interpolierten.

    Das Ausgangsbild
    X X
    X X

    Würde erst gestreckt warden
    X 0 X 0
    0 0 0 0
    X 0 X 0
    0 0 0 0

    Dann interpoliere ich horizontal zwischen den Pixeln - und hier tritt der erste Fehler auf, da nach dem zweiten X in der ersten und der letzten Zeile kein Bezugspunkt nach rechts mehr mit Farbe vorhanden ist
    X X X 0 
    0 0 0 0
    X X X 0 
    0 0 0 0

    Das gleiche natürlich auch bei der vertikalen interpolierung
    X X X 0 
    X X X 0 
    X X X 0 
    0 0 0 0 

    Also habe ich sieben Pixel, die wegen dem fehlenden Bezugspunkt nicht interpoliert warden können. Hat wer ne Idee, wie ich das lösen könnte?

    Danke schon mal

    Olli

    [EDIT:] Ich hoffe das ist wenigstens einigermaßen verständlich. Sagt ruhig, wenn nicht ;)

  • Das ist etwas kniffelig.
    In GDI+ gibt es dafür das PixelOffset. Ein Pixel liegt also nicht bei integer Koordinaten, sondern irgendwo dazwischen. Für eine doppelte Vergrößerung kann man also folgendes tun.
    Ich versuche das mal Grafisch darzustellen, damit man es sich vorstellen kann. Im Prinzipp wird dann am Rand eine Lineare Interpolation vorgenommen und in der Mitte entscheidet das Verfahren wie man weitermacht.
    [Blockierte Grafik: http://i.imgur.com/FyDG3nT.png]
    Edit: Wenn man Bei GDI+ das Offset falsch wählt werden die Äußeren Pixel einfach mit einem vollständig Transparenten Pixel interpoliert. Dieser "Fehler" ist also auch in GDI+ bekannt und ungelöst.
    lg
    M

  • Hi,
    das Problem ist einfach, welche der vielen verschiedenen Interpolationsverfahren man verwendet.
    Ich würde komplett anders interpolieren...
    Aus
    AB
    CD
    würde bei doppelter "Vergrösserung"
    AABB
    AABB
    CCDD
    CCDD
    Somit kann man einen beliebigen Filter drüberlaufen lassen, bspw. einen schnellen asm-Code von TheShadowAE von hier.

    Der "Rand" bleibt somit immer der vom Orginal.

  • Probiere es mal damit:

    [autoit]


    #include <GDIPlus.au3>

    [/autoit][autoit][/autoit][autoit]

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\test.png")
    $hBmpScaled = _GDIPlus_BitmapScale($hImage)
    _GDIPlus_ImageSaveToFile($hBmpScaled, @ScriptDir & "\Scaled.png")
    _GDIPlus_BitmapDispose($hBmpScaled)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    ShellExecute(@ScriptDir & "\Scaled.png")

    [/autoit][autoit][/autoit][autoit]

    Func _GDIPlus_BitmapScale($hImage, $iFactor = 2) ;coded by UEZ 2013
    Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0(_GDIPlus_ImageGetWidth($hImage) * $iFactor, _GDIPlus_ImageGetHeight($hImage) * $iFactor)
    Local Const $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetInterpolationMode($hGfxCtxt, 5)
    _GDIPlus_GraphicsSetPixelOffsetMode($hGfxCtxt, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
    _GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hImage, 0, 0, _GDIPlus_ImageGetWidth($hImage) * $iFactor, _GDIPlus_ImageGetHeight($hImage) * $iFactor)
    Local Const $hBmpTexture = _GDIPlus_BitmapCreateFromScan0($iFactor, $iFactor)
    Local Const $hTextureCtxt = _GDIPlus_ImageGetGraphicsContext($hBmpTexture)
    _GDIPlus_GraphicsFillRect($hTextureCtxt, 0, 1, $iFactor, $iFactor)
    _GDIPlus_GraphicsFillRect($hTextureCtxt, 1, 0, $iFactor, $iFactor)
    Local Const $hTexture = _GDIPlus_TextureCreate($hBmpTexture)
    _GDIPlus_GraphicsFillRect($hGfxCtxt, 0, 0, _GDIPlus_ImageGetWidth($hImage) * $iFactor, _GDIPlus_ImageGetHeight($hImage) * $iFactor, $hTexture)
    _GDIPlus_BrushDispose($hTexture)
    _GDIPlus_GraphicsDispose($hTextureCtxt)
    _GDIPlus_GraphicsDispose($hGfxCtxt)
    _GDIPlus_BitmapDispose($hBmpTexture)
    Return $hBitmap
    EndFunc

    [/autoit]

    Die aktuelle Beta wird benötigt!

    Das Resultat sollte das aus dem Screenshot entsprechen. Ich hoffe, dass das die Frage war.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (4. November 2013 um 22:35)

  • Zitat

    Du meinst ich soll also einen 2x2 "Blur" über das Bild laufen lassen?

    ja, wenn du willst, kannst du mir ja die Vorschrift, also den eigentlichen Filter beschreiben, in asm sind das nur einige Zeilen, da lässt sich sicher was machen^^

    Also etwas in der Art
    0 -1 0
    -1 4 -1
    0 -1 0

  • Aber ich speicher die einzelnen Farben in einem 2D Array, damit ich da schnellen Zugang

    Der war gut :D
    In einer Bitmap liegen die Pixel doch schon wie in einem Array, und der Zugang ist mindestens 2000x schneller (per ASM/Basic + inlineASM). Klar befinden wir uns hier in AutoIt, aber manchmal ist diese Sprache einfach ungeeignet.

    Ein gutes Beispiel ist das neulich gepostete Screenshotprogramm. In AutoIt lief das über eine Minute, in ASM grade mal 3s.

    Edit: Um an das Array zu kommen muss man einfach das Bitmap über einen Scan0 erstellen. Dann fällt die Struct automatisch ab.

    lg
    M

  • Es geht mir ja eigentlich ja nur um die Technik :D
    Ich übertrag das eh nach c++ - mach ich mit allen meinen Programmen. Ich schreib sie, weils einfacher ist in AutoIT und mach sie dann objektorientiert in C++ neu. Das ist relative hilfreich finde ich ;)


    Zitat

    Edit: Um an das Array zu kommen muss man einfach das Bitmap über einen Scan0 erstellen. Dann fällt die Struct automatisch ab.

    meinst du damit ich soll "DllStructGetData($BitmapData,"Scan0")" mir holen? und das ist dann das Array?

    Edit: Wie kann man eine leere bitmap zu diesem Zweck machen?

  • Ich habs jetzt mal so probiert. Raus kommt aber nur ein schwarzes Bild. Wenn ich das behersche einzelne Pixel zu setzen kann ich Skalieren/Interpolieren.


    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <Array.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    UDMG_Startup( )
    UDMG_CreateSingleMap( 8, 4, 4, 4 )
    ;### Up Down Map Generator ######################################################################################################

    ;################################################################################################################################
    Global $UDMG_PI = 3.1415926
    ;Noise Interpolation Mode
    Global $NIM_LINEAR = 1
    Global $NIM_COSINE = 2
    Global $NIM_CUBIC = 3
    Func UDMG_Startup( )

    _GDIPlus_Startup( )

    EndFunc
    Func UDMG_Shutdown( )

    _GDIPlus_Shutdown( )

    EndFunc
    Func UDMG_CreateSingleMap( $iDetailLevel2Power, $iSeed, $iXOffset, $iYOffset )

    Local $iSize = 2^$iDetailLevel2Power
    Local $hWND = GUICreate( "", $iSize, $iSize )
    GUISetState( )
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND( $hWND )
    Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics( $iSize, $iSize, $hGraphics )
    Local $hBitmapData = _GDIPlus_BitmapLockBits( $hBitmap, 0, 0, $iSize, $iSize )
    Local $hStride = DllStructGetData( $hBitmapData, "Stride" )
    Local $hScan0 = DllStructGetData( $hBitmapData, "Scan0" )
    Local $hPixelData, $iColor, $dHeight, $dMaxHeight

    Local $aHPoints[$iSize][$iSize]

    For $iX = 0 To $iSize - 1

    For $iY = 0 To $iSize - 1

    $dHeight = UDMG_PRandom( $iX + $iXOffset, $iY + $iYOffset, $iSeed )
    If $dHeight > $dMaxHeight Then $dMaxHeight = $dHeight

    Next

    Next

    For $iX = 0 To $iSize - 1

    For $iY = 0 To $iSize - 1

    $hPixelData = DllStructCreate( "dword", $hScan0 + ( $iY * $hStride ) + ( $iX * 4 ) )
    $dHeight = 255 / $dMaxHeight * UDMG_PRandom( $iX + $iXOffset, $iY + $iYOffset, $iSeed )
    $iColor = UDMG_ValToBW( $dHeight )
    DllStructSetData( $hPixelData, 1, $iColor )

    Next

    Next

    _GDIPlus_BitmapUnlockBits( $hBitmap, $hBitmapData )
    _GDIPlus_ImageSaveToFile( $hBitmap, "test.jpg" )

    Return $aHPoints

    EndFunc
    Func UDMG_PRandom( $iX, $iY, $iSeed )

    Local $dXFactor = Log( Sin( $iX ) + 1 * $iY ) / 2
    Local $dYFactor = Log( Cos( $iY ) + 1 * $iX ) / 2
    Local $dSeedFactor = Log( Sin( $iSeed ) + 1 ) / 2

    Return Abs( $dXFactor * $dYFactor * $dSeedFactor )

    EndFunc
    Func UDMG_Interpolate( $aHPoints, $iInteration, $iNoiseInterpolationMode = $NIM_CUBIC )

    For $i = 1 To $iInteration

    Local $iSize = UBound( $aHPoints, 1 )
    Local $aHReturnPoints[$iSize*2][$iSize*2]
    Local $dA, $dB, $dC, $dD

    For $iX = 1 To $iSize

    For $iY = 1 To $iSize

    $aHReturnPoints[($iX-1)*2][($iY-1)*2] = $aHPoints[$iX-1][$iY-1]

    If $iX < $iSize And $iY < $iSize Then

    Switch $iNoiseInterpolationMode

    Case $NIM_LINEAR
    ;$aHReturnPoints[($iX-1)*2+1][($iY-1)*2+1]a*(1-x) + b*x

    Case $NIM_COSINE


    Case $NIM_CUBIC


    EndSwitch

    EndIf

    Next

    Next

    If $iInteration > 1 Then $aHPoints = $aHReturnPoints

    Next

    Return $aHReturnPoints

    EndFunc
    Func UDMG_DisplayMap( $aHPoints )

    Local $iWidth = UBound( $aHPoints, 1 )
    Local $iHeight = UBound( $aHPoints, 2 )
    Local $hGUI = GUICreate( "", $iWidth, $iHeight, -1, -1, $WS_POPUPWINDOW )
    Local $hGraphic = GUICtrlCreateGraphic( 0, 0, $iWidth, $iHeight )

    For $iX = 0 To $iWidth - 1

    For $iY = 0 To $iHeight - 1

    $iColor = "0x" & Hex( $aHPoints[$iX][$iY], 2 ) & Hex( $aHPoints[$iX][$iY], 2 ) & Hex( $aHPoints[$iX][$iY], 2 )

    GUICtrlSetGraphic( $hGraphic, $GUI_GR_COLOR, $iColor )
    GUICtrlSetGraphic( $hGraphic, $GUI_GR_PIXEL, $iX, $iY )

    Next

    Next

    GUISetState( @SW_SHOW, $hGUI )

    Local $iMsg

    While True

    $iMsg = GUIGetMsg( )
    If $iMsg = $GUI_EVENT_CLOSE Then ExitLoop

    WEnd

    GUICtrlDelete( $hGraphic )
    GUIDelete( $hGUI )

    EndFunc
    Func UDMG_ValToBW( $iValue )

    Return "0x" & Hex( $iValue, 2 ) & Hex( $iValue, 2 ) & Hex( $iValue, 2 )

    EndFunc

    [/autoit]
  • Hi,
    das "Problem" ist eigentlich nur der Pointer auf die Pixeldaten.
    Aus diesem Grund hatte ich vor langer Zeit mal eine Funktion erstellt _CreateNewBitmap32(). Damit sind sämtliche für mich wichtigen Features zusammengefasst:
    - Device Context HDC
    - Pointer auf die Bitmapdaten
    - hBitmap, um diese Bitmap in GDI(+) weiterverarbeiten zu können

    Um aus AutoIt den direkten Zugang zur Bitmap zu erhalten, erstellt man eine Struct (entweder bytes oder dwords) an der Position der Bitmap (Pointer)
    So kann man einzelne Pixel einfach bearbeiten, indem man die entsprechenden Werte in die Struct schreibt...

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <GDIPlus.au3> ;nur zum Speichern der Bitmap

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $w = 256 * 1, $h = 256 * 1 ;Höhe und Breite Bitmap

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hgui = GUICreate("", $w, $h) ;Gui erstellen
    GUISetState() ;anzeigen
    $DC_gui = _WinAPI_GetDC($hgui) ;DC holen
    Global $ptr, $hbmp ;
    $DC_bitmap = _CreateNewBmp32($w, $h, $ptr, $hbmp) ;Bitmap erstellen
    $struct = DllStructCreate("byte[" & $w * $h * 4 & "]", $ptr) ;Struct an der position der Bitmap erstellen

    [/autoit] [autoit][/autoit] [autoit]

    for $x = 1 to $w ; wenn man mag, kann man x- und y- koordinaten verwenden statt der direkten adresse
    for $y = 1 to $h
    $adresse = ($y - 1) * $w + ($x - 1) ;Pixeladresse berechnen
    DllStructSetData($struct, 1, Random(0, 000, 1), $adresse * 4 + 0);Alpha
    DllStructSetData($struct, 1, Random(0, 255, 1), $adresse * 4 + 1);Blau
    DllStructSetData($struct, 1, Random(0, 255, 1), $adresse * 4 + 2);Grün
    DllStructSetData($struct, 1, Random(0, 255, 1), $adresse * 4 + 3);Rot
    ;_WinAPI_BitBlt($DC_gui, 0, 0, $w, $h, $DC_bitmap, 0, 0, 0xCC0020);bitmap in DC blitten
    Next
    Next
    _WinAPI_BitBlt($DC_gui, 0, 0, $w, $h, $DC_bitmap, 0, 0, 0xCC0020);Bitmap in DC blitten

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    while GUIGetMsg() <> -3 ;loop endless
    wend

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup() ;bild speichern
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
    _GDIPlus_ImageSaveToFile($hImage, "test.jpg")
    ShellExecute("test.jpg") ;und anzeigen

    [/autoit] [autoit][/autoit] [autoit]

    _DeleteBitmap32($DC_gui, $ptr, $hbmp) ;free mem

    [/autoit] [autoit][/autoit] [autoit]

    exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    $tagBITMAPINFO_dafuqbeta = "struct ;dword Size;long Width;long Height;word Planes;word BitCount;dword Compression;dword SizeImage;long XPelsPerMeter;long YPelsPerMeter;dword ClrUsed;dword ClrImportant;endstruct;dword RGBQuad"
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO_dafuqbeta) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4) ;Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iwidth)
    DllStructSetData($tBMI, "Height", -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

    [/autoit] [autoit][/autoit] [autoit]

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Man kann natürlich auch eine Dword-Struct erstellen und an die Adresse direkt eine Farbe 0xBBGGRRAA schreiben

    und noch die Funktion _CreateNewBmp32FromFile() , macht dasselbe, füllt die Bitmap mit einer Grafikdatei

    Spoiler anzeigen
    [autoit]

    Func _CreateNewBmp32FromFile($bmpfile, ByRef $ptr, ByRef $hbmp, ByRef $iwidth, ByRef $iheight) ;ptr to bitmapdata, it is possible to manipulate one pixel if needed
    ;by [email='Andy@AutoIt.de'][/email]
    Local $hbitmap, $hdc, $hcdc

    [/autoit] [autoit][/autoit] [autoit]

    $hbitmap = _GDIPlus_ImageLoadFromFile($bmpfile)
    If @error Or $hbitmap = 0 Then
    MsgBox(0, "Func _CreateNewBmp32FromFile()", "Error opening File: " & @CRLF & $bmpfile)
    Return -1
    EndIf
    $hbmpfile = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hbitmap)
    $iwidth = _GDIPlus_ImageGetWidth($hbitmap)
    $iheight = _GDIPlus_ImageGetHeight($hbitmap)
    $hcdc = _WinAPI_CreateCompatibleDC(0)
    _WinAPI_SelectObject($hcdc, $hbmpfile) ;image im hcdc

    [/autoit] [autoit][/autoit] [autoit]

    ;neue bitmap
    $tagBITMAPINFO_dafuqbeta = "struct;dword Size;long Width;long Height;word Planes;word BitCount;dword Compression;dword SizeImage;long XPelsPerMeter;long YPelsPerMeter;dword ClrUsed;dword ClrImportant;endstruct;dword RGBQuad"

    [/autoit] [autoit][/autoit] [autoit]

    $tBMI = DllStructCreate($tagBITMAPINFO_dafuqbeta) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $tagBITMAPINFO = ' & $tagBITMAPINFO & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iwidth)
    DllStructSetData($tBMI, "Height", -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet

    [/autoit] [autoit][/autoit] [autoit]

    $hdc = _WinAPI_CreateCompatibleDC(0)
    _WinAPI_SelectObject($hdc, $hbmp) ;leere bitmap im hdc
    _WinAPI_BitBlt($hdc, 0, 0, $iwidth, $iheight, $hcdc, 0, 0, $srccopy);image in leere bitmap
    _WinAPI_DeleteDC($hcdc)
    _WinAPI_DeleteObject($hbmpfile)
    Return $hdc ;DC der Bitmap zurückgeben

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_CreateNewBmp32FromFile

    [/autoit]

    wer sich über den Namen der BITMAPINFO-Struct wundert, der hat die neue Beta noch nicht mit "alten" BITMAPINFO-Funktionen verwendet. In der "neuen" Beta wurden die Namen der Datentypen ohne irgendwelche Veranlassung komplett umgeschrieben...*zu UEZ und eukalyptus rüberschiel* ?(

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    6 Mal editiert, zuletzt von Andy (5. November 2013 um 19:35)

  • Zitat

    kümmere ich mich um die Portierung zu C++

    Das ist imho einfacher, da du nur einen Speicherbereich erstellen oder an der Position der Bitmap allozieren musst.
    Pointer lassen sich in C auch einfacher handhaben wie in AutoIt^^


  • ...
    wer sich über den Namen der BITMAPINFO-Struct wundert, der hat die neue Beta noch nicht mit "alten" BITMAPINFO-Funktionen verwendet. In der "neuen" Beta wurden die Namen der Datentypen ohne irgendwelche Veranlassung komplett umgeschrieben...*zu UEZ und eukalyptus rüberschiel* ?(

    Nicht alles, was in der GDIPlus verändert wurde, ist von uns initiiert worden. Warum man den Prefix "bi" zu den Struct Bezeichnungen hinzugefügt hat, weiß ich nicht.

    Kann sein, dass jpm die Sachen komplett überarbeitet hat.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • hehe, ich hatte auch nicht geglaubt, dass ihr beiden "einfach so" die Datentypen zu eine der wichtigsten Structs ändert 8)
    Nur war ich etwas erstaunt, dass diese Aktion zeitgleich mit der Erweiterung zur GDI+ kam....

    Zitat

    Kann sein, dass jpm die Sachen komplett überarbeitet hat.

    gegen überarbeiten kann man generell ja nichts haben, aber SINNLOS irgendetwas zu ändern nur damit es geändert wird nenne ich einfach mal profilneurotisch! Es gibt nämlich keinen einzigen Grund zu dieser Änderung! Die "bi"-Präfixe gab es irgendwann schon einmal in anderem Zusammenhang, dort hatte dann einer der DEV´s den Kürzeren gezogen und war beleidigt abgedackelt....ich finde die Postings von Valik nicht mehr, der hatte damals nämlich die "bi"-präfixe abgeschossen und Kraft seines Amtes die bis dato aktuellen Namen der Datentypen eingeführt....das jetzige Umändern war dann wohl der Bumerang^^