Krita Photobash Plugin v2.0 released!

Hi there! Just wanted to announce a new major release for Krita’s Photobash Plugin!

If you don’t want to read the following text, or want a demonstration of how it works, check out a short video here!

Whenever I tried to photobash, I always disliked the process of needing to have a folder with the images nearby, drag and drop them to the canvas or open them as a new layer from inside the application. For this reason I created a plugin to assist you with this task!

Some of the major new features are:

  • Drag and drop images from the docker to the canvas;

  • Pin images as favourites, which are remembered across restarts, and still persist even when searching;

  • Redesigned UI for much better workflow and quality-of-life improvements;

  • Improved scrolling of pages, now supports mouse wheel button, as well as Alt + Dragging to the left and right to scroll through the pages;

  • Bug fixes galore!

If you want to install or read more in-depth about how it works, head on over to the repository here to learn more!

A big thanks to everyone that gave feedback and helped make this release possible, with special note to @EyeOdin, for coding support and feedback!

Now if you’ll excuse me, I have another plugin to update to Krita 5.0 :eyes:

21 Likes

Awesome! :star_struck: Having some work I need to do that benefit from photobashing this is going to be a great help :grin: Thank you for working on it

Also - extremely excited about that last line :eyes:

1 Like

it is nice to see it being released. GG.

3 Likes

This is a huge improvement compared to before. I like the preview of the picture and the use of the picture as a reference. The only problem is that I have too many pictures (about 60,000)… I have to use a separate software to classify them.

wow I am looking forward to the update of redesignUI. It and pigment.O are my favorite krita plugins

1 Like

i want try it now!!!

1 Like

I saw the video… its so awesome!!!

1 Like

Yeah, I actually wanted to improve that parte, it is rather sluggish with that many pictures. The biggest problem is that just the process of searching for the images takes too long.

I have some ideas for optimization, but the biggest one (parallelizing the fetch using threads) was quite tougher than I expected due to the way we generate images.

However, that is already in the list for v3!

2 Likes

12 posts were split to a new topic: Photobash plugin development

is this release working in 4.4.3 or later? or is only for Krita 5? i need time to watch and test the new release :slight_smile: . thanks a lot for your work

1 Like

I haven’t tested it with the previous versions, but I don’t see anything that could cause issues! And thank you for using it!

1 Like

Downloaded today for Kubuntu Krita 5 Beta 5
I think this option is interesting, because you avoid the need of shortcut Ctrl+t for transform. And in my case every time is pasted an image i adjust it.

look for the “Enable transform…”
About how it works:
If i use the Shift+drag there is no problem to drag images to the workspace. if i don’t have the keyboard …i can’t drag the images directly?.

For now i continue testing. The idea of scaling to image is awesome
And you have also thought about not just the mouse but the stylus with the Alt+drag browsing the images.

Good job. Much better than 1.0

1 Like

dragging is only with the modifier keys yes, but if you just click on it you will set the image on the canvas instantly (the Photobash action). it is faster without dragging. Drag and Drop allows compatibility.

1 Like

This plugin is awesome. Thanks for taking the time to create it and release it to the community!

I’m having a problem with it in 5.0.2, however. When I click an image, it throws up an error. It does load the image in, but it’s not scaled to the canvas (even if the fit to canvas button is selected) and the image comes in as a folder reference, meaning I can’t transform it without first adding a transform mask.

Any ideas what’s causing this?

Here’s the error message:

AttributeError
Python 3.8.1: C:\Program Files\Krita (x64)\bin\krita.exe
Wed Feb 2 18:19:07 2022

A problem occurred in a Python script. Here is the sequence of
function calls leading up to the error, in the order they occurred.

C:\Program Files\Krita (x64)\share\krita\pykrita\photobash_images\photobash.py in ()
85
86 self.imagesButtons[0].clicked.connect(lambda: self.buttonClick(0))
87 self.imagesButtons[1].clicked.connect(lambda: self.buttonClick(1))
88 self.imagesButtons[2].clicked.connect(lambda: self.buttonClick(2))
89 self.imagesButtons[3].clicked.connect(lambda: self.buttonClick(3))
self = <photobash_images.photobash.PhotobashDocker object>
self.imagesButtons = [<PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>]
].clicked undefined
self.buttonClick = <bound method PhotobashDocker.buttonClick of <photobash_images.photobash.PhotobashDocker object>>

C:\Program Files\Krita (x64)\share\krita\pykrita\photobash_images\photobash.py in buttonClick(self=<photobash_images.photobash.PhotobashDocker object>, position=1)
191 def buttonClick(self, position):
192 if position < len(self.foundImages) - len(self.imagesButtons) * self.currPage:
193 self.addImageLayer(self.foundImages[position + len(self.imagesButtons) * self.currPage])
194
195 def updateImages(self):
self = <photobash_images.photobash.PhotobashDocker object>
self.addImageLayer = <bound method PhotobashDocker.addImageLayer of <photobash_images.photobash.PhotobashDocker object>>
self.foundImages = [‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_278.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_546.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_547.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_548.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_549.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_550.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_551.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_552.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_553.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_554.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_555.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_556.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_557.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_558.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_559.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_560.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_561.png’, ‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_562.png’]
position = 1
builtinlen =
self.imagesButtons = [<PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>, <PyQt5.QtWidgets.QToolButton object>]
self.currPage = 1

C:\Program Files\Krita (x64)\share\krita\pykrita\photobash_images\photobash.py in addImageLayer(self=<photobash_images.photobash.PhotobashDocker object>, photoPath=‘D:/Assets/People/2D/vp_casual_2_01/vp_casual_v2_555.png’)
255
256 if self.fitCanvasChecked:
257 if activeNode.bounds().width() / activeNode.bounds().height() > doc.bounds().width() / doc.bounds().height():
258 scalingFactor = doc.bounds().width() / activeNode.bounds().width()
259 newWidth = doc.bounds().width() * self.currImageScale / 100
activeNode = None
activeNode.bounds undefined
doc = <PyKrita.krita.Document object>
doc.bounds =
).width undefined
).height undefined
AttributeError: ‘NoneType’ object has no attribute ‘bounds’
cause = None
class = <class ‘AttributeError’>
context = None
delattr = <method-wrapper ‘delattr’ of AttributeError object>
dict = {}
dir =
doc = ‘Attribute not found.’
eq = <method-wrapper ‘eq’ of AttributeError object>
format =
ge = <method-wrapper ‘ge’ of AttributeError object>
getattribute = <method-wrapper ‘getattribute’ of AttributeError object>
gt = <method-wrapper ‘gt’ of AttributeError object>
hash = <method-wrapper ‘hash’ of AttributeError object>
init = <method-wrapper ‘init’ of AttributeError object>
init_subclass =
le = <method-wrapper ‘le’ of AttributeError object>
lt = <method-wrapper ‘lt’ of AttributeError object>
ne = <method-wrapper ‘ne’ of AttributeError object>
new =
reduce =
reduce_ex =
repr = <method-wrapper ‘repr’ of AttributeError object>
setattr = <method-wrapper ‘setattr’ of AttributeError object>
setstate =
sizeof =
str = <method-wrapper ‘str’ of AttributeError object>
subclasshook =
suppress_context = False
traceback =
args = ("‘NoneType’ object has no attribute ‘bounds’",)
with_traceback =

The above is a description of an error in a Python program. Here is
the original traceback:

Traceback (most recent call last):
File “C:\Program Files\Krita (x64)\share\krita\pykrita\photobash_images\photobash.py”, line 87, in
self.imagesButtons[1].clicked.connect(lambda: self.buttonClick(1))
File “C:\Program Files\Krita (x64)\share\krita\pykrita\photobash_images\photobash.py”, line 193, in buttonClick
self.addImageLayer(self.foundImages[position + len(self.imagesButtons) * self.currPage])
File “C:\Program Files\Krita (x64)\share\krita\pykrita\photobash_images\photobash.py”, line 257, in addImageLayer
if activeNode.bounds().width() / activeNode.bounds().height() > doc.bounds().width() / doc.bounds().height():
AttributeError: ‘NoneType’ object has no attribute ‘bounds’

1 Like

Sorry, I’ve been out of the Krita development game for a bit, switched OSs and I’m having a bit of a rough time compiling Krita, so I just didn’t make the time for plugin development!

I don’t know when I’ll look into this, but thank you for the bug report and stack trace, this is great information!

Totally understand. Thanks for taking the time to reply. The plugin still works. Just requires a few extra steps to clear out the error and convert the layer from a File Layer to a Paint Layer so it can be scaled and painted on. Thanks again for the very helpful addon!

1 Like