dcsimg
Results 1 to 11 of 11

Thread: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

  1. #1

    Thread Starter
    PowerPoster Elroy's Avatar
    Join Date
    Jun 2014
    Location
    Near Nashville TN
    Posts
    5,835

    Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    The title pretty much says it all. Per a recent post by LaVolpe:

    Quote Originally Posted by LaVolpe View Post
    Regarding transparency. There are a couple basic types:
    1. Alpha channel. Each pixel has its own level of transparency/opacity
    -- I call this type: complex transparency
    2. Mask. A specific color or palette index is made 100% transparent. Typically, the alpha channel is not used as alpha
    -- I call this type: simple transparency
    What I'd like to do is develop a VB6 tool that basically read a PNG with "Simple" transparency and convert it to a PNG with "Complex" transparency. Any tips (such as PNG header structure) would be appreciated. I'm sure I could figure this out on my own, but I suspect there are folks out there way more on top of this stuff than me.

    Also, once I get it done for a PNG, I'd also like to do it for TGA files (which apparently have very similar structures).

    Also, I suspect I'll be getting into color-depth issues. However, as a first pass, I'd like to get it going for an RGB (true-color) PNG and convert it to an RGBA (true-color) PNG. And then, I'll go from there.
    Any software I post in these forums written by me is provided “AS IS” without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. Please understand that I’ve been programming since the mid-1970s and still have some of that code. My contemporary VB6 project is approaching 1,000 modules. In addition, I have a “VB6 random code folder” that is overflowing. I’ve been at this long enough to truly not know with absolute certainty from whence every single line of my code has come, with much of it coming from programmers under my employ who signed intellectual property transfers. I have not deliberately attempted to remove any licenses and/or attributions from any software. If someone finds that I have inadvertently done so, I sincerely apologize, and, upon notice and reasonable proof, will re-attach those licenses and/or attributions. To all, peace and happiness.

  2. #2

    Thread Starter
    PowerPoster Elroy's Avatar
    Join Date
    Jun 2014
    Location
    Near Nashville TN
    Posts
    5,835

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Ok, here's some stuff out of a program I wrote a while back. I'm only allowing a True-Color RGBA type PNG in this program.

    But I'm wondering where that "Simple" transparency flag is, and where the background color is.

    Code:
    
    Option Explicit
    '
    Private Type PngHeaderType
        ID1         As Long
        ID2         As Long
        '
        'ID          As String * 4       ' Only read as 4 bytes (not unicode) when used with "As Binary".
        'DosLineEnd  As String * 2       ' Only read as 2 bytes (not unicode) when used with "As Binary".
        'EofChar     As String * 1       ' Only read as 1 byte (not unicode) when used with "As Binary".
        'UnixLineEnd As String * 1       ' Only read as 1 byte (not unicode) when used with "As Binary".
    End Type
    '
    Private Type PngIhdrType    ' 13 data bytes total.
        Width       As Long     ' >0.
        Height      As Long     ' >0.
        BitDepth    As Byte     ' 1,2,4,8,16.
        ColorType   As Byte     ' 0,2,3,4,6.
        Compression As Byte     ' Should be zero.
        Filter      As Byte     ' Should be zero.
        Interlace   As Byte     ' Zero or one.
        '
        ' ColorType:    (BitDepth allowed)
        '   0           1,2,4,8,16  Each pixel is a grayscale sample.
        '   2           8,16        Each pixel is an R,G,B triple.
        '   3           1,2,4,8     Each pixel is a palette index; a PLTE chunk must appear.
        '   4           8,16        Each pixel is a grayscale sample, followed by an alpha sample.
        '   6           8,16        Each pixel is an R,G,B triple, followed by an alpha sample.
        '
    End Type
    '
    Private Type PngIhdrChunkType
        Length      As Long
        Type        As String * 4       ' Only read as 4 bytes (not unicode) when used with "As Binary".
        Data        As PngIhdrType
        CRC         As Long
    End Type
    '
    
    Public Function GetHeaderAndValidatePngType(sFileSpec As String, Optional WidthPxOut As Long, Optional HeightPxOut As Long, Optional sError As String) As Boolean
        ' Only 32-bit RGBA PNG files are used in this utility.
        ' sError is returned with a description of any error.
        '
        Dim iFle As Long
        Dim Header As PngHeaderType
        Dim Ihdr As PngIhdrChunkType
        Dim ID1 As Long
        Dim ID2 As Long
        '
        ID1 = &H474E5089    '   Chr$(137) & "PNG"
        ID2 = &HA1A0A0D
        '
        iFle = FreeFile
        Open sFileSpec For Binary Access Read As #iFle
        Get #iFle, , Header
        Get #iFle, , Ihdr
        Close #iFle
        '
        If Header.ID1 <> ID1 Or Header.ID2 <> ID2 Then:                 sError = "Bad PNG ID header": Exit Function
        If Ihdr.Type <> "IHDR" Then:                                    sError = "Bad IHDR type": Exit Function
        ' We can read the Ihdr.Data.ColorType = 2 as PixelFormat32bppARGB, which will effectively convert them.
        If Ihdr.Data.ColorType <> 6 And Ihdr.Data.ColorType <> 2 Then:  sError = "Wrong color type (is type " & PngColorTypeDesc(Ihdr.Data.ColorType) & "), not RGBA": Exit Function
        If Ihdr.Data.BitDepth <> 8 Then:                                sError = "Wrong bit depth (is " & Format$(Ihdr.Data.BitDepth) & "), not 8": Exit Function
        If Ihdr.Data.Width = 0 Or Ihdr.Data.Height = 0 Then:            sError = "Image has no width and/or height.": Exit Function
        '
        WidthPxOut = SwapLongEndian(Ihdr.Data.Width)
        HeightPxOut = SwapLongEndian(Ihdr.Data.Height)
        '
        GetHeaderAndValidatePngType = True  ' Good to go.
    End Function
    
    Public Function PngColorTypeDesc(bbType As Byte) As String
        Select Case bbType
        Case 0:     PngColorTypeDesc = "gray scale (no alpha)"
        Case 2:     PngColorTypeDesc = "RGB (no alpha)"
        Case 3:     PngColorTypeDesc = "palette"
        Case 4:     PngColorTypeDesc = "gray scale (w alpha)"
        Case 6:     PngColorTypeDesc = "RGB (w alpha)"
        Case Else:  PngColorTypeDesc = "unknown"
        End Select
    End Function
    
    
    Any software I post in these forums written by me is provided “AS IS” without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. Please understand that I’ve been programming since the mid-1970s and still have some of that code. My contemporary VB6 project is approaching 1,000 modules. In addition, I have a “VB6 random code folder” that is overflowing. I’ve been at this long enough to truly not know with absolute certainty from whence every single line of my code has come, with much of it coming from programmers under my employ who signed intellectual property transfers. I have not deliberately attempted to remove any licenses and/or attributions from any software. If someone finds that I have inadvertently done so, I sincerely apologize, and, upon notice and reasonable proof, will re-attach those licenses and/or attributions. To all, peace and happiness.

  3. #3

    Thread Starter
    PowerPoster Elroy's Avatar
    Join Date
    Jun 2014
    Location
    Near Nashville TN
    Posts
    5,835

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Hmmm, maybe I've figured it out myself.

    It seems that I can read Ihdr.Data.ColorType=2 (RGB) with GdiPlus, and then just save it as Ihdr.Data.ColorType=6 (RGBA). I still don't know where the Ihdr.Data.ColorType=2 saves the background color value, but I don't really need to know.

    The TGA is another issue, but one step at a time.
    Any software I post in these forums written by me is provided “AS IS” without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. Please understand that I’ve been programming since the mid-1970s and still have some of that code. My contemporary VB6 project is approaching 1,000 modules. In addition, I have a “VB6 random code folder” that is overflowing. I’ve been at this long enough to truly not know with absolute certainty from whence every single line of my code has come, with much of it coming from programmers under my employ who signed intellectual property transfers. I have not deliberately attempted to remove any licenses and/or attributions from any software. If someone finds that I have inadvertently done so, I sincerely apologize, and, upon notice and reasonable proof, will re-attach those licenses and/or attributions. To all, peace and happiness.

  4. #4
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    18,527

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    You don't really need to know in advance whether PNG has simple or complex transparency. It is doable by parsing the PNG header and one or two of the PNG chunks. Instead ...

    GDI+ will load PNGs into 32bpp RGBA formats if requested. From that you have a few scenarios:
    1. All alpha bytes are 0. Entire PNG is transparent (unlikely) and I usually default this to mean alpha-channel not used
    2. All alpha bytes are 255. Entire PNG is 100% opaque
    3. All alpha bytes are either 0 or 255, nothing else: simple transparency
    4. Any other scenario: complex transparency

    Should the need to determine pre-multiplied RGB against alpha bytes, that can be calculated with a good degree of confidence, with complex transparency. If any R,G,or B byte is > its Alpha byte then cannot be premultiplied. If 100% of the R,G,B bytes are =< its alpha byte, then likely premultiplied. It is unlikely that non-premultiplied images will contain every pixel where its R,G,B bytes are =< its alpha byte when in complex transparency.

    Now regarding converting complex to simple, say to create a GIF for example. I use a threshold value, say 70-80% opacity. If the alpha byte => threshold, then alpha byte is 255 else it is 0. You can play with various thresholds

    Edited: One does not convert simple to complex, because the alpha byte would not change. No conversion is necessary, result would be exactly the same.
    Last edited by LaVolpe; Nov 11th, 2019 at 12:26 PM.
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

  5. #5
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    18,527

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Quote Originally Posted by Elroy View Post
    Hmmm, maybe I've figured it out myself.

    It seems that I can read Ihdr.Data.ColorType=2 (RGB) with GdiPlus, and then just save it as Ihdr.Data.ColorType=6 (RGBA). I still don't know where the Ihdr.Data.ColorType=2 saves the background color value, but I don't really need to know.
    No, it's not that simple. PNG format is pretty complex, but also well documented. As mentioned in my last reply, you don't need to go that route.

    Edited: The PNG chunk that indicates simple transparency is: tRNS. This chunk, if present, applies when the PNG color type is 0, 2, or 3. If chunk exists, it could theoretically contain indexes where all are opaque (palette images) or for color types 0 & 2, a value that does NOT exist in the PNG. Though legit, bad practice. In those cases, no transparency.

    P.S. If you download my AlphaImage control, there is a TGA class there which can read/write TGA in both versions
    Last edited by LaVolpe; Nov 11th, 2019 at 01:34 PM.
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

  6. #6

    Thread Starter
    PowerPoster Elroy's Avatar
    Join Date
    Jun 2014
    Location
    Near Nashville TN
    Posts
    5,835

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Well, I seem to have done it. WOW, it's amazing how code gets dependent upon other code, depending upon other code, almost ad-infinitum.

    Basically, I'm just converting a ColorType=2 PNG to a ColorType=6 PNG. To do it, I break the channels into four images (Red,Green,Blue,Alpha), and creating the alpha channel. Here's the code where I'm doing that:

    Code:
    
    Private Function Gdip_SplitImageIntoChannels(hGdipImage As Long) As Long()   ' Four new hGdipImage values.  Be sure to dispose.
        ' Only the hGdipImage should initially exist.
        ' Four new images are created, for the channels.
        ' The Alpha channel is reported back as a grayscale.
        ' Order is Rgba, NOT Matrix.
        '
        Dim Index As Long
        Dim Matrix As ColorMatrixType
        Dim hImgAttr As Long
        Dim h(3) As Long
        '
        GErr GdipCreateImageAttributes(hImgAttr)
        '
        For Index = 0 To 2                  ' Alpha is handled differently, grayscale.
            Gdip_ZeroTheMatrix Matrix
            Matrix.CR(Index, Index) = 1!    ' Isolate the channel.
            Matrix.CR(3, 4) = 1!            ' Set Alpha to opaque.
            Gdip_SetMatrixInAttributes hImgAttr, Matrix
            h(Gdip_Mat2Rgba(Index)) = Gdip_NewImageFromOrigWithAttributes(hImgAttr, hGdipImage)
            GErr GdipResetImageAttributes(hImgAttr, ColorAdjustTypeBitmap)
        Next Index
        ' And now Alpha (grayscale).
        Gdip_ZeroTheMatrix Matrix
        Matrix.CR(0, 3) = 1!                ' Transfer Alpha channel to RGB channels (for grayscale).
        Matrix.CR(1, 3) = 1!
        Matrix.CR(2, 3) = 1!
        Matrix.CR(3, 4) = 1!                ' Set Alpha to opaque.
        Gdip_SetMatrixInAttributes hImgAttr, Matrix
        h(Alpha) = Gdip_NewImageFromOrigWithAttributes(hImgAttr, hGdipImage)
        '
        GErr GdipDisposeImageAttributes(hImgAttr)
        Gdip_SplitImageIntoChannels = h
    End Function
    
    
    Truth be told, I'm not sure if I'm doing it correctly or not. I will need to study that some more.

    But basically, here are the "high level" lines that are doing the bulk of the work:

    Code:
    
        Gdip_Start
        '
        hGdipImageIn = Gdip_LoadImageFromFile(sFileSpec)
        hImages = Gdip_SplitImageIntoChannels(hGdipImageIn)
        Gdip_DisposeOfImage hGdipImageIn
        '
        hGdipImageOut = Gdip_CombineChannelsToImage(hImages())
        Gdip_DisposeOfImage hImages(0)
        Gdip_DisposeOfImage hImages(1)
        Gdip_DisposeOfImage hImages(2)
        Gdip_DisposeOfImage hImages(3)
        '
        Gdip_SaveImageToFile sFileSpec, hGdipImageOut
        Gdip_DisposeOfImage hGdipImageOut
        '
        Gdip_Stop
    
    
    It's all just a Sub Main project with no forms, all in one BAS module. The entire module is attached (with the Sub Main and everything needed). You could easily throw it into a new project, set Sub Main, and then execute it.

    I'm still thinking there's probably a much easier way to do this. I'll have to keep studying to figure this out.

    Also, I'd like to expand this to convert any type of PNG file, and also expand it to TGA files.
    Attached Files Attached Files
    Any software I post in these forums written by me is provided “AS IS” without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. Please understand that I’ve been programming since the mid-1970s and still have some of that code. My contemporary VB6 project is approaching 1,000 modules. In addition, I have a “VB6 random code folder” that is overflowing. I’ve been at this long enough to truly not know with absolute certainty from whence every single line of my code has come, with much of it coming from programmers under my employ who signed intellectual property transfers. I have not deliberately attempted to remove any licenses and/or attributions from any software. If someone finds that I have inadvertently done so, I sincerely apologize, and, upon notice and reasonable proof, will re-attach those licenses and/or attributions. To all, peace and happiness.

  7. #7
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    18,527

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    I think the simplest method to convert to Color type 6 would be the following:
    1. Load PNG into GDI+
    2. Create new 32bpp RGBA bmp: GdipCreateBitmapFromScan0
    3. Get device context for new bitmap: GdipGetImageGraphicsContext
    4. Render PNG into new bitmap: GdipDrawImageRectRectI
    5. Save new bitmap & clean up

    However, not sure of the purpose. Appears no change in the pixel values would occur and the PNG file may actually be significantly larger afterwards, especially if "converting" a paletted or grayscale PNG.
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

  8. #8

    Thread Starter
    PowerPoster Elroy's Avatar
    Join Date
    Jun 2014
    Location
    Near Nashville TN
    Posts
    5,835

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Ok, sorry, I think I'm now confusing things.

    Also, I'm clearly NOT there yet with what I posted in post #6.

    LaVolpe, if you'll hang with me, I've basically got a couple of fundamental questions.

    Let's say we have a non-palette, non-alpha-channel PNG. If that's the case, can we have a mask color that's used for transparency? (Say, a ColorType=2 file.)

    And, if we can't have a non-palette mask (or even if we can), if we've got a palette, what's the maximum color-depth our palette can have?

    And, I'm assuming if we've got a palette, that we've always got the possibility of one of the palette entries being marked as the transparency color ... is that correct?

    I'm hoping to get this stuff nailed down in my head.

    (And then on to TGA files, but PNGs first.)
    Any software I post in these forums written by me is provided “AS IS” without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. Please understand that I’ve been programming since the mid-1970s and still have some of that code. My contemporary VB6 project is approaching 1,000 modules. In addition, I have a “VB6 random code folder” that is overflowing. I’ve been at this long enough to truly not know with absolute certainty from whence every single line of my code has come, with much of it coming from programmers under my employ who signed intellectual property transfers. I have not deliberately attempted to remove any licenses and/or attributions from any software. If someone finds that I have inadvertently done so, I sincerely apologize, and, upon notice and reasonable proof, will re-attach those licenses and/or attributions. To all, peace and happiness.

  9. #9
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    18,527

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Palettes (Type 3): Color depth max is 256 colors, indexed 0 to 255, same as bitmaps. Within PNG, multiple indexes can be marked as transparent

    Grayscale & RGB (Type 0 & 2): Within PNG, can only have one color marked as transparent.

    Note: GDI+ can support the various PNG color types for reading, but only supports a subset for saving
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

  10. #10

    Thread Starter
    PowerPoster Elroy's Avatar
    Join Date
    Jun 2014
    Location
    Near Nashville TN
    Posts
    5,835

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Quote Originally Posted by LaVolpe View Post
    Grayscale & RGB (Type 0 & 2): Within PNG, can only have one color marked as transparent.
    Ok, perfect. I'll get to the others later. But, let's take Type 2. Where's the transparency color?

    Or, more to the point, how can I take that Type 2 PNG and create a Type 6 PNG out of it. In other words, I need to find the color, scan the image for that color, and then create an alpha channel of all 0 or &Hff, depending on whether the image's pixel is the transparency color or not.

    If I know what the transparency color is, I can scan manually. Or, is there a GdiPlus trick to do this for me?


    Here's my ultimate objective: To take any TGA or PNG, and convert it to a Type 6 PNG (with VB6 code). I don't care about size.
    Any software I post in these forums written by me is provided “AS IS” without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. Please understand that I’ve been programming since the mid-1970s and still have some of that code. My contemporary VB6 project is approaching 1,000 modules. In addition, I have a “VB6 random code folder” that is overflowing. I’ve been at this long enough to truly not know with absolute certainty from whence every single line of my code has come, with much of it coming from programmers under my employ who signed intellectual property transfers. I have not deliberately attempted to remove any licenses and/or attributions from any software. If someone finds that I have inadvertently done so, I sincerely apologize, and, upon notice and reasonable proof, will re-attach those licenses and/or attributions. To all, peace and happiness.

  11. #11
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    18,527

    Re: Converting a PNG with "Simple" transparency to a PNG with "Complex" transparency.

    Hmmm, in post #7 I described a super simple method for converting any PNG color type to 6. Look at my edited comments in post #5 for the PNG chunk to parse out for the transparent color, a 6-byte value (2 bytes per R,G,B) for Color type 2, 2-byte value for type 0, and 1+ bytes for type 3. The only advantage I can see, in the context of this thread, for parsing the PNG header is to prevent converting type 6 to type 6.

    Edited: TGA > PNG. Get the TGA pixel data into an array in RGBA format. Create Scan0 bitmap based on that array. Save the PNG and release the GDI+ image handle before array is released. FYI: TGA can contain palettes also and may have compression. That TGA class of mine that I mentioned earlier can handle TGA compression with the exception of huffman. Most TGA parsers you may find in the wild only handle TGA RGB,RGBA uncompressed formats. My class handles more. It can't be used as-is for your project, but should be fairly easy to learn from and/or convert for your needs.

    Edited again. One of your comments kinda makes me wonder... You stated you may want to scan for the transparent color. If you are talking about scanning within the PNG file via parsing, then good luck. Most PNGs compress its pixel data and there are 5 or 6 compression algorithms (one algo is actually: uncompressed). This means you need to decompress to scan unless data is uncompressed. That isn't too common with PNG. And if that's the plan, you might as well just load it into GDI+ to deal with compression and, if doing that, post #7 is the way to go.

    Gotta stress. It is really important to be familiar with the PNG specs if you are going to parse PNG files
    https://www.w3.org/TR/2003/REC-PNG-20031110/
    Last edited by LaVolpe; Nov 11th, 2019 at 04:21 PM.
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Featured


Click Here to Expand Forum to Full Width