Photobooth Plugin

Woah this seems super useful. can’t wait to try it out! Might help me a lot with item icon creation haha

Hellloo, I’ve stumbled upon this masterpiece of a resource, but I do have an issue I can’t quite figure out;

In the picture below, I have leather armor to where the white section can be colored with any arbitrary, to where I then want to use a separate image just for that.

However, how would I achieve this with photobooth? e.g. mask out anything that overlaps the white part.


There are hundreds of these type of item, therefore an external image editor wouldn’t be idle.

Hmm this is a tricky question. There’s no out of the box solution for this. You would have to write a custom process with the bindings to achieve your desired behaviour.

Let me think on this more. I have some ideas, but i need to try them out when i have some time.

1 Like

Alright, I got something working! I’ll use this car as an example:

By playing with the lighting settings and adjusting part properties I was able to capture the following.

By combining w/ the first image to determine what pixels in the above are actually visible I can generate a mask. Using this mask I can seperate the original image into two layers:


If I did this again I’d prob also include the trim in the mask b/c it’s pretty close to white

Then in studio I can use two image labels (or whatever) and modify the ImageColor3 property on the white body layer. This gives the following result:

The code I wrote for this is very messy so I don’t want to share it at the moment, but I may release it in the future. Hopefully my description of the approach is enough for now.

8 Likes

Version 2.0.0 is here! Once again we hit a new major release version so it’s worth covering what’s changed.

Better crop mode!

First off, we now have a better viewport crop mode tool! By holding the shift key while the viewport is in focus you can now drag around your capture rect and resize it without mirroring! This makes it super easy to make adjustments to your capture without dealing with painful camera micro adjustments.

You’ll also note that while holding shift the dimensions bar changes a bit. While in this mode you can now view and edit the rect information directly. This can be helpful for exact changes and also copy / pasting the rect values for things like bindings captures.

Better bindings!

One of the most common feature requests I get for photobooth is to add more automation. I.e. “Give us a nice UI where we can capture all our icons and add outlines, etc”. I’ve always felt that this was a challenge to include in photobooth b/c each user has different needs when it comes to these kinds of processes. My intent with providing bindings was to give script capable users the ability to write these workflows themselves, but it’s become clear to me that most users are not doing that and as a result their needs are not being met by the plugin.

This is why it’s now possible to make a copy of the bindings module and use it in a seperate plugin. All that is required is that the user using your plugin must also have photobooth installed.

This means it’s now possible to write and share plugins that take advantage of photobooth’s bindings module.

Here’s an example of a very simple plugin that just captures a 512x512 image at the center of your screen on click.

DemoAddon.rbxmx (86.6 KB)

I will likely be releasing some of these on my own in the coming weeks, and I encourage everyone to share anything they’re made as well!

On a smaller less exciting note. I’ve also included a rect module in the bindings themselves. This makes it super easy to quickly define rects and make sure they’re properly rounded, etc.


That’s all for now! Happy capturing!

6 Likes

I have been taking greenscreen screenshots and making icons for long enough now that it has become an incredibly tedious process, so this plugin is literally a godsend for me.

I was one of those people that have requested this but understandably I agree with your approach that workflows are different for everyone. I was secretly hoping someone would sort of “build” these workflows for me on top of what you’ve already done but I couldn’t wait any longer, so I made them myself, lol.

One of the biggest pain points for me was the inability to easily frame subjects within a specified viewport precisely, by the pixel. You did provide some examples that frame and screenshot all selected objects but the framing was arbitrary and basically impossible to get maximum resolution to subject ratio quickly.
Ideally I wanted the process to be 100% entirely done within studio, without ever bringing it out onto a photo editing software, this includes adding outlines to the icons. I personally add outlines to my icons enough times that I created a second plugin just to do this. The plugin is very reminiscent to the Drop Shadow plugin that can be installed on paint .net.

And with this, most of my workflow now remains within studio and has sped up my icon making process substantially. What normally could have taken me multiple hours to make a handful of icons literally just takes minutes now.

I could keep these plugins to myself and make my own life x1000 easier but I am sure that someone else might be waiting for some sort of pre-determined workflow that does exactly what I needed it to do just like I was for a little too long now, lol.
So I will most likely be releasing these plugins very soon, but I just need to kink out a few edge cases, clean up some code, do some optimizations and add theming support first. The plugins will probably exist as a free extension (at least initially) to the Photobooth plugin since the original plugin already isn’t free (and I don’t think it should be, 100% worth every penny). But they do still work as standalone plugins. The auto frame plugin will still operate up until taking screenshots (Photobooth does this), and the drop shadow plugin can theoretically work for any image you want. So we’ll see.

But look forward to it, it’s nearly done and will be released soon!

3 Likes

This looks fantastic! If you don’t mind me asking what did you use for the UI? The properties components you have in particular are fantastic and I’ve been looking for something like it.


As an aside, it is worth noting I have included strong copy-left license in the photobooth bindings. To summarize the intent here - I didn’t want people making paid plugins on top of photobooth. It requires you to open source code that uses the bindings under the same license (unless of course you’re just using it for your own internal use).

If you want to keep it private for internal use - no problems.
If you want to publish it as a free plugin - no problems (as long as the source is accessible)
If you want to publish it as a paid plugin - yes problem!

I’m open to licensing under different terms if you have a good reason / suggestion as to why this would be limited. Ultimately I’d like to disuade the situtation where you have to buy several additional tools to achieve what you actually want - I don’t care as much about the source being inaccessible, it’s just a symptom of achieving that goal.

1 Like

This was entirely hand made haha, I am very particular when it comes to using tools that are very familiar with what people are already used to. ← I am not very good at making things super modular, but I might consider trying to make the property components as an open source tool that people can use, although not sure if I can deliver on usability expectations.

Yeah absolutely understand, I will keep it free and release it as a free plugin, I was on the fence on the double payment component anyway. The drop shadow plugin, however, isn’t actually linked to the Photobooth plugin technically so that’s something I can still take into consideration, I will keep the auto framing plugin free. Thanks for the heads up though!

I’m assuming you mean the bindings? Not exactly sure what this implies, but I explicitly ensure that anyone using this plugin in the future to turn on the bindings feature in your plugin, I do not keep a copy of it within the plugin itself. Not sure if this is what you mean by keeping the source accessible.

1 Like

Yes specifically the bindings. If your plugin continues operating as you have it (where the bindings module is not contained within your plugin) then you are not subject to the license. This is def a loophole, but the tradeoff is worse UX for the user b/c with a copy in your plugin source you don’t need to have the user enable the binding setting - it will just work (given photobooth is installed).

2 Likes

Ok yeah, that sounds good then. The idea was to ensure that users are aware that this plugin’s intended purpose is to be used in tandem with your Photobooth plugin, hiding the bindings behind my plugin itself would just be confusing for users that might have installed it without understanding the limitations.

1 Like

Seems like a Great plugin.. even the additional feature - so congrats to you both.

Being unemployed.. I tried to install the version from the GitHub repository - but after 6 hrs later - I gave up at around 5am this morning. lol
As needed… I have Rojo on (my now) Spare PC - but the New PC just doesn’t want my to install it - no matter what I tried (aftman/foreman etc). :man_facepalming:

I’d like to buy the plugin - but that will have to wait till later ($$) - esp for something I don’t need right now - as I’m still in game design & (Ai) scripting stages.

I will revert back to this topic/plugin at a later stage - and am sure I will see improvements as well :wink:

1 Like

Hello I’ve been experiencing this issue whenever trying to take a capture with the plugin. The capture, although the “capture animation” triggers, does not save in the plugin gallery nor does it save as an editableMesh object.

For reference I’ve tried:

  • Loading the plugin on a new baseplate
  • Deleting the atmosphere
  • Uninstalling and reinstalling the plugin
  • Uninstalling and reinstalling studio
  • Enabling all possible APIs related to the plugin
  • Switching back and forth from actual resolution to emulators
  • Trying all the recommended settings in setting
  • Os scale is at 1,1
  • I tried awitching back and forth between full viewport mode and cropped mode available to the plugin

Thank you in advance
! Screenshot_2026-04-17_142216-1|690x388

Hey! This is a rare error that I’ve had a few people report. I believe it’s an issue with Roblox and the capture service. I’ve been unable to get anyone to actually report it to them though.

You can try running the plugin linked in the quoted post to confirm. I believe this is caused by trying to convert a capture service capture into an editable image and for some reason it just fails to do so on certain people’s computers.

You will need to file a report with Roblox, but please link me to it. I would like to follow along with it because I’ve been really curious about what’s happening here and why it only occurs on some people’s computers.

Hi, in older versions of the plugin, I had a “G” shortcut that placed the selected object in the capture area. Since version 2.0.0, this shortcut no longer works, and I can’t find it anymore.

Yes I removed this plugin action as it was becoming difficult to maintain and very few people were using it or aware of its existence.

I was essentially using the approach described here (but I’ll post the exact code).

You’re welcome to write your own _G shortcut for this.

function Camera.focus(camera: Camera, selection: { Instance }, viewportSize: Vector2)
	local bounds = {}
	local centerSum = Vector3.zero
	for _, selected in selection do
		if selected:IsA("PVInstance") then
			local boundCF, boundSize
			if selected:IsA("BasePart") then
				boundCF = selected.CFrame
				boundSize = selected.Size
			elseif selected:IsA("Model") then
				boundCF, boundSize = selected:GetBoundingBox()
			end

			table.insert(bounds, {
				CFrame = boundCF,
				Size = boundSize,
			})

			centerSum = centerSum + boundCF.Position
		end
	end

	if #bounds > 0 then
		local center = centerSum / #bounds

		local maxRadius = 0
		for _, bound in bounds do
			local radius = (bound.Size / 2).Magnitude
			local distance = (bound.CFrame.Position - center).Magnitude
			maxRadius = math.max(maxRadius, distance + radius)
		end

		local aspect = viewportSize.X / viewportSize.Y
		local scaleY = viewportSize.Y / camera.ViewportSize.Y
		local scaledFov2 = math.atan(math.tan(math.rad(camera.FieldOfView / 2)) * scaleY)
		local sinFov2 = math.sin(scaledFov2 * math.min(1, aspect))

		local focusCF = camera.CFrame.Rotation + center

		camera.Focus = focusCF
		camera.CFrame = focusCF * CFrame.new(0, 0, maxRadius / sinFov2)
	end
end
1 Like