-
-
Notifications
You must be signed in to change notification settings - Fork 425
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Create a resized copy of an image #1577
Comments
In theory this could be possible for methods of ImageMagick that return a new image. It's an interesting idea but I will need to think about an API for this. And that will probably happen after I have added a new source code generator to call the native api. |
Sounds good, I look forward to it. |
Do you have any ideas how I could/should integrate this in the API? I think this behavior would only be required for methods that change the dimensions of an image. Otherwise you could just use using var image = new MagickImage("input.png");
using var thumbnail = image.NewMethod().Resize(100, 100);
using var thumbnail = image.NewProperty.Resize(100, 100); The using var image = new MagickImage("input.png");
using var thumbnail = image.ResizeWithSuffix(100, 100); As you can see besides deciding which option to use the naming is also something that I have to think about. Do you have any suggestions? |
Not sure how feasible this is, and I realize this is adding to the original requirement, but the ideal for me would be something like this: IMagickImage<QuantumType> CloneCropAndResize(IMagickGeometry? crop, IMagickGeometry? resize) Where:
ie: it would be the equivalent of the following but internally would combine all this into a single resize operation without the overhead of the full clone at the start. image.Clone().Crop(crop).Resize(resize); The nice thing about this is it would let you grab any region at any resolution. ie: you could grab tiled sections of a source image at display resolutions for rendering. The name |
Those are not the only two methods this option will become available to. Creating a new method for each possible combination is not feasible. |
Ah ok, I see what you mean. Perhaps var newImage = image.CloneThen().Resize(100, 100); I guess the downside to this is it might be tempting to chain these together fluent style, but the result of the Crop call wouldn't be disposed. var newImage = image
.CloneThen().Crop(10, 10, 1000, 1000)
.CloneThen().Resize(100, 100) Thinking out loud (again no idea if this is feasible) but what if you could put together a chain of operations which you terminated with a function to actually do the work. ie: each intermediate operation just returned an interface (not an image instance) upon which you could perform additional operations. The eg: var newImage = image
.CloneThen()
.Crop(10, 10, 1000, 1000)
.Resize(100, 100)
.Whatever()
.SomethingElse()
.Process(); You're obviously thinking about this from a broader perspective than my narrow view... I'm sure whatever you come up with will be fine. |
Good question. But I don’t think that new methods are needed, because it's already supported quite simply:
|
The flowchart TD
A[Create image] --> B[10 mb used]
B --> C[Clone]
C --> D[20 mb used]
D --> E[Resize to 50%]
B --> F[Resize without clone]
E --> G[15 mb used]
F --> G
This means that with the new method the maximum amount of memory that is used is 15mb. |
I now have a working prototype that uses the following syntax: using var image = new MagickImage(Files.Builtin.Logo);
using var clone = image.CloneAndMutate(static mutator => mutator.Resize(100, 100)); // The static keyword is optional What are your thoughts on this @toptensoftware? |
Hi @dlemstra, That's pretty nice... I like it. I assume there will be other mutator operations besides just resize or is that it for now? Brad |
Other operations will be added but you cannot chain them because there are no memory benefits when doing that so you will need to do this: using var croppedImage = image.CloneAndMutate(static mutator => mutator.Crop(10, 10, 1000, 1000));
using var resizedImage = croppedImage.CloneAndMutate(static mutator => mutator.Resize(100, 100)); |
@dlemstra hi, does your mutator support a sequence of multiple operations or just one? |
In my current proof of concept the mutator will throw an exception when you execute multiple operations. I have done this to avoid complexity in the mutator. There is no memory benefit if I would allow chaining multiple operations. The |
Hey @toptensoftware, I will be going to publish a new release tomorrow or on Monday but I won't be able to include all the operations in the new The methods that will be moved are the ones that have |
Hi @dlemstra No urgency at all on this for me. I've got a working solution for the moment, and probably won't get a chance to improve it with these new changes imminently. Brad |
Closing this because the resize operation has been added in the latest release. More operations will be added in the future. |
Is your feature request related to a problem? Please describe
I have a project that works with very large tif images. I need to keep the large image in memory for later processing, but I also need smaller versions for on-screen rendering. Currently to do this I need to duplicate the large image (doubling the memory usage) and then resize it to the smaller size.
Describe the solution you'd like
Would like the ability to directly create a resized copy of a source image (or part thereof)
Describe alternatives you've considered
As mentioned above, the current solution is to create copy of full image and then downsize it - but this requires more memory than directly resizing to a smaller image.
(Perhaps there's already a way to do this but if so, I couldn't figure out how)
Additional context
No response
The text was updated successfully, but these errors were encountered: