Merge pull request #15 from haganbmj/image_slice_fix_masks

fix: apply image scale after slice window to avoid mask issues
This commit is contained in:
Brendan Hagan
2022-07-09 15:29:14 -04:00
committed by GitHub
4 changed files with 16 additions and 14 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ private:
Rotation UnzoomedDataViewer::getRotation() const {
if (!stylesheet) stylesheet = set->stylesheet;
int export_zoom = settings.stylesheetSettingsFor(set->stylesheetFor(card)).export_zoom();
double export_zoom = settings.stylesheetSettingsFor(set->stylesheetFor(card)).export_zoom();
bool use_viewer_rotation = !settings.stylesheetSettingsFor(set->stylesheetFor(card)).card_normal_export();
if (use_viewer_rotation) {
+6 -5
View File
@@ -61,12 +61,13 @@ void ImageSlice::centerSelection() {
}
}
Image ImageSlice::getSlice() const {
if (selection.width == target_size.GetWidth() && selection.height == target_size.GetHeight() && selection.x == 0 && selection.y == 0) {
Image ImageSlice::getSlice(double scale) const {
wxSize scaled_target_size = target_size * scale;
if (selection.width == scaled_target_size.GetWidth() && selection.height == scaled_target_size.GetHeight() && selection.x == 0 && selection.y == 0) {
// exactly the right size
return source.GetSubImage(selection);
}
Image target(target_size.GetWidth(), target_size.GetHeight(), false);
Image target(scaled_target_size.GetWidth(), scaled_target_size.GetHeight(), false);
if (sharpen && sharpen_amount > 0 && sharpen_amount <= 100) {
sharp_resample_and_clip(source, target, selection, sharpen_amount);
} else {
@@ -195,8 +196,8 @@ void ImageSliceWindow::onOk(wxCommandEvent&) {
EndModal(wxID_OK);
}
Image ImageSliceWindow::getImage() const {
return slice.getSlice();
Image ImageSliceWindow::getImage(double scale) const {
return slice.getSlice(scale);
}
// ----------------------------------------------------------------------------- : ImageSliceWindow : Controls
+2 -2
View File
@@ -45,7 +45,7 @@ public:
/// Attempt to center the current constraints
void centerSelection();
/// Get the sliced image
Image getSlice() const;
Image getSlice(double scale = 1.0) const;
// Zoom factor
inline double zoomX() const { return target_size.GetWidth() / (double)selection.width; }
@@ -63,7 +63,7 @@ public:
ImageSliceWindow(Window* parent, const Image& source, const wxSize& target_size, const AlphaMask& target_mask);
/// Return the sliced image
Image getImage() const;
Image getImage(double scale) const;
// --------------------------------------------------- : Data
private:
+7 -6
View File
@@ -41,16 +41,17 @@ void ImageValueEditor::sliceImage(const Image& image) {
AlphaMask mask;
style().mask.getNoCache(options,mask);
// slice
// Specify a desired size based on the stylesheet and a scale multiplier defined within the user's settings.
// Storing at a greater than 100% resolution allows for better exports >100%, but may change how images look when filters (sharpen) are applied.
// Additionally, this bloats the set file size as even under-resolution images are upscaled to the new minimum size.
RealSize desired_slice_size = RealSize(style().getSize().width * settings.internal_scale, style().getSize().height * settings.internal_scale);
ImageSliceWindow s(wxGetTopLevelParent(&editor()), image, desired_slice_size, mask);
ImageSliceWindow s(wxGetTopLevelParent(&editor()), image, style().getSize(), mask);
// clicked ok?
if (s.ShowModal() == wxID_OK) {
// store the image into the set
LocalFileName new_image_file = getLocalPackage().newFileName(field().name, settings.internal_image_extension ? _(".png") : _("")); // a new unique name in the package
Image img = s.getImage();
// Specify a desired size based on the stylesheet and a scale multiplier defined within the user's settings.
// Storing at a greater than 100% resolution allows for better exports >100%, but may change how images look when filters (sharpen) are applied.
// It also disrupts some of the patterns in use for doing popout planeswalkers since you have to do the math at both scales.
// Additionally, this bloats the set file size as even under-resolution images are upscaled to the new minimum size.
Image img = s.getImage(settings.internal_scale);
img.SaveFile(getLocalPackage().nameOut(new_image_file), wxBITMAP_TYPE_PNG); // always use PNG images, see #69. Disk space is cheap anyway.
addAction(value_action(valueP(), new_image_file));
}