Transparency Maker reads in a .jpg or .png and creates a Pixel Information Database, that can be manipulated in a language I invented called BQL or Bitmap Query language.
The reason I wrote this program originally is when I purchase stock photos, almost all come with a background color and often I need a transparent background. There are other tools that perform background removal, with more now than in 2012 when I started working on Transparency Maker, however I wanted a way to programmaticaly manipulate pixels.
The original purpose of Transparency Maker was to make backgrounds transparent, thus the name. I have now expanded the features to include updating pixels, changing colors, etc.
What do you think? Should I keep the name Transparency Maker, or do you like Pixel Database better?
Let me know by creatiing an Issue on this project, or on any Transparency Maker videos on YouTube.
Visual Studio 2019 is the recommeneded version, but most of the code worked as far back as VS 2010.
I have an install version on my website:
https://datajuggler.com/Downloads/TransparencyMaker.msi
https://www.youtube.com/playlist?list=PLKrW5tXCPiX2PxrLPszDzlcEZwQG-Qb8r
I just updated my channel to be split into more play lists to separate each section.
The first thing that happens when an image is opened, is your file is parsed into a list of PixelInformation objects, aka Pixel Database.
When the program starts, click the Start button to select your image. The image must be a Png or a Jpg.
A Pixel Database is a List of PixelInformation objects that contain properties about the pixel. To find the pixel information for any pixel, turn the Color Picker on.
Tip: To determiine if the Color Picker is on, hover your mouse of any part of your image. If the mouse cursor turns into a pointer (a hand), then the Color Picker is on.
Once the Color Picker is turned on, click any pixel in your image and a Pixel Information Box pops up:
The box contains the following properties:
The Red value of RGB value. Value range is 0 - 255.
The Green value of RGB value. Value range is 0 - 255.
The Blue value of RGB value. Value range is 0 - 255.
The Transparency Level of the pixel. Values are 0 - 255, where 0 is transparent and 255 is visible.
The horizontal position of the pixel clicked.
The sum of Green plus Red.
The sum of Blue plus Green.
The sum of Blue plus Red.
The sum of Red plus Green plus Blue.
The vertical position of the pixel clicked.
You can use all of the above values in your queries to manipulate your image.
This application started out as a plain Windows Form that I would hard code C# statements to replace the background of stock photos with transparent backgrounds. Over time I switched to a more object oriented approach where I analyze the entire image, and thus the Pixel Database was created.
The initial criticism I have received is there are not any controls like most graphic programs. If that is what everyone still wants I am open to ideas about what types of controls are needed. I created BQL because it is similar to SQL that many C# developers already know, thus enabling them to get up to speed quickly. Another reason I created BQL instead of a control based graphical UI is time to develop. Many of my failed endeavors have involved very complicated UI's, and then I am reminded of this small company called Google that started with a webpage that contained a single textbox and a button.
There are two types of queries; Hide/Show and Update.
Any pixels affected by the query will be set to Alpha 0, which makes them invisible.
Hide Pixels Where
Total > 700
Hide Pixels Where can be shortened to:
Hide
Total > 700
Any pixels affected by the query will be set to Alpha 255, which makes them visible.
Show Pixels Where
Red < 200
Show Pixels Where can be shortened to:
Show
Red < 200
This query parser may be rewritten to be more robust someday, but for now certain attributes must be on their own line. I wrote the query parser in a few hours many years ago, and it works pretty well so I have not bothered to refactor it (yet).
So the query above would fail if written like this
Show X < 150
Show
X < 150
It wouldn't be that hard to rewrite the query parser, so let me know if you think the line by line requirement is confusing. I know it is crude, but this app was designed to be quick, dirty and functional at first.
Will match criteria on exact values.
Hide
Red = 233
All pixels that have a Red value of 233 will be set to Alpha 0 to be hidden.
Will match criterian on greater than or equal to
Show
Y > 1200
All pixels with a Y value of 1,200 or higher wil be set to Alpha 255 to be shown.
Will match criteria on less than or equal to
Hide
BlueGreen < 300
All pixels with a BlueGreen value of 300 or less wil be set to Alpha 0 to be hidden.
Will match criteria that is greater than or equal to the first number and less than or equal to the second number.
Hide
Blue Between 200 255
All pixels with a Blue value between 200 and 255 will be hidden.
You can combine criteria to further narrow down the pixels that are manipulated
Show
X > 200
Y Between 112 140
Total = 765
All pixels with X coordinate of 200 or higher and a Y value of 112 - 140 and a Total of 765 (White).
Update queries are very similar to Hide queries, except that you must include a Color attribute
There are two ways to set a color, Named Colors or RGB values.
You can set a pixel to a named color
Note: For a list of Dot Net Colors see System.Drawing.Colors or this website lists them: http://www.flounder.com/csharp_color_table.htm
Update
Set Color FireRed
Where
Total Between 125 150
You set the color by specifying the Red, Green and Blue values
Update
Set Color 121 220 7
Where
Y > 100
You must specify the Where, even if you want to update all pixels
Update
Set Color White
Where
Total > 0
Note: In the above example, all pixels will be set to white, since greater than > is equal to > or equal to.
The adjust color feature lets you adjust 1 color (Red, Green or Blue) or all colors by a certain amount.
Example: Update Set Adjust Red 25 Where Total > 0
The Adjustment value can also be negative.
Update Set Adjust All -15 Where Total > 0
All pixels will be adjusted by 15, so Red = 33, will become red = 18.
It is safe to apply a value as if a color channel of a pixel goes over 255 the value will be 255, or below 0 will be 0.
I added a new useful feature called Swap, that let you replace the value of Red With Blue, Red With Green or Green With Blue, and of course the opposite of swap is the same; green to blue is the same as blue to green.
Update Set Swap Red Blue Where Total > 0
The above query will replace the value of Pixel.Red with Pixel.Blue for all pixels in the image (again greater than > is the same as greater than or equal in BQL.
Swap is safe to use, in terms of if you have a pixel with a vlue of blue 30, and you subtract 50, the resulting value of blue will be zero, not -20. The same is true for adding over the max value of a color (255), the value will be set to 255. One problem with swap and values going out of bounds is the contrast created by slight variances give an image a different look, compared to all pixels being the same color. Some information in your image will be lost if you go below zero or above the maximum for many pixels.
Masks is something I have thought about for a long time. Today I worked on a sample and some unwanted pixels kept getting modified with my query, so I got motivated and created a new property to the PixelInformationObject called Mask.
Mask Rules (This is the my guide for programming them, and is created as I code this).
Masks will stay on after being created until you load a new image, remove the mask, clear all masks or close the program.
Masks only affect Update queries for now. Hide Pixel and Show Pixel and draw line queries are not getting this feature (yet). If it works well I may apply it to the other areas later.
Set Mask Verb Name
Verbs are actions that can be performed to create, add, remove or replace masks.
Add a mask and give it a name.
Example: Set Mask Add Interior
Replacing a mask removes all pixels affected by a mask, then creates a new mask for the pixels affected. Example: Set Mask Replace Mailbox
If any pixels had a Mask applied named Mailbox, they would be removed, and then a new mask named Mask Mailbox is created for the pixels affected in the update query.
Remove a mask by name.
Example: Set Mask Clear Fence.
To remove all masks, pass in the name All.
Set Mask Clear All
Note: Clear and Clear All may require you to still pass in a valid where clause. If yes, You can use:
Update Set Mask Clear Curb Where Total > 0
When I start testing this I will try and document what is actually expected, and if possible I would like to get rid of the required Where clause. It should mean everything from the Select like SQL.
If you want to keep a mask on an image, but want to run another query where the mask isn't active (disabled), you can run this.
Set Mask Disable Bookshelf
To enable the query again:
Set Mask Enable Bookshelf.
By default, Masks are not visible, but a query to show them is as simple:
Show A Mask:
Update Set Mask Show Name
Hide A Mask:
Update Set Mask Hide Name
By default, Masks are displayed in White. You can change this by setting the MaskColor property.
Set MaskColor Color Name
Color must be a .Net Named Color. If you are not sure, use the small box of Crayon colors like Red, Blue, Orange, etc. Name is the name of the Masque to set the MaskColor.
Example: Set MaskColor Turquoise PianoKeys
Note: You must set the MaskColor property prior to showing the Mask.
I needed to write this somewhere to code it, and by writing it here first I don't have to come back and write it again.
One of the uses of Transparency Maker is an image that is grainy or pixelated, you can smooth out an area by setting all pixels in a range to a certain value.
Update
Set Color 220 0 55
Where
Total Between 525 590
X Between 200 360
Y > 400
To Draw a Transparent Line, Type The Following
Line 1: Draw Line LineThickness
Line 2: First two points are Line Start Point X Y
Second two points are Line End Point X Y
Line 3 (Optional): Repeat Direction Iterations Move
Draw Line 4
161 125 457 66
Repeat Down 15 1
Type Line 1 Draw Line (Thickness), then hit enter to place your cursor on the next line. Ensuriing the Color Picker is toggled on, Click on your image to establish Point 1:
Draw Line 4
161 125
Then click your mouse again for the end point of the line:
Draw Line 4
161 125 457 66
(Optional) Type line 3 if you want to repeat.
Then click Apply.
Draw Line 4
161 125 457 66
Repeat Down 15 1
Use with Repeat with Down, Up, Left and Right
Draw Line 2
0 64 457 66
Repeat Up 100 2
The above line will be drawn 100 times, and each time it will move the Y coordinate up (minus) two pixels.
Note: The line will go futher than the bounds of the image, so Repeat 50 would accomplish the same thing.
Draw Line 1
225 412 105 430
Repeat Left 25 2
The above line will be drawn 25 times and will move the StartPoint.X and EndPoint.X left two pixels each iteration.
Draw Line 5
140 300 90 600
Repeat Right 50 10
The above line will draw transparent stripes through an image because the Repeat Move (last parameter) is greater than the line thickness from Line 1.
Drawing transparent lines is slower than any other operation using Transparency Maker because what it actually does is create a copy of the source image and draws a line trhough the copy in a color that doesn't exist in the copy, then creates a Pixel Database out of the copy image and determines which pixels were modified. The pixels that were modified in the copy are then applied to the source Pixel Database and set to Transparent.
I think this is a good candidate for letting people with a powerful GPU take advantage of this, but I haven't learned how to apply this yet. I have a 1080 TI, but I have never written any code to take advantage of a GPU. Volunteers anyone?
Clicking Save sometimes causes an error. You can think click Continue, and are returned to your image. Click Save As works.
It has been on my list for a long time to add a Save prompt if there are changes and you attempt to close the file or the application.
Let me know what features you think are needed or any feedback you may have.
I thought I had code to draw a line in a specific color, but this has not been done yet apparently. It will be coming soon.
If anyone wants this feature let me know.
Any suggestions or feedback is welcome.