Ignore:
Timestamp:
2021-11-24T10:57:13+13:00 (2 years ago)
Author:
cstephen
Message:

Rework for single image content.
Implement rotation and inversion editing.

Location:
main/trunk/model-interfaces-dev/atea/ocr
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/model-interfaces-dev/atea/ocr

    • Property svn:ignore
      •  

        old new  
        11dist
         2node_modules
  • main/trunk/model-interfaces-dev/atea/ocr/src/components/EditPage.vue

    r35734 r35743  
    11<template>
    2 <div class="root">
     2<div class="edit-page-root">
    33    <div class="image-panel">
    4         <table v-if="rotateMode" class="rotate-guide">
    5             <tr><hr /></tr>
    6             <tr><hr /></tr>
    7             <tr><hr /></tr>
    8             <tr><hr /></tr>
    9             <tr><hr /></tr>
    10             <tr><hr /></tr>
    11             <tr><hr /></tr>
    12             <tr><hr /></tr>
    13             <tr><hr /></tr>
    14             <tr><hr /></tr>
    15             <tr><hr /></tr>
    16             <tr><hr /></tr>
    17         </table>
    18 
    19         <!-- <img :src="imageUrl" class="image" :style="{ filter: filterString, transform: transformString }" /> -->
    20         <div class="image-container">
    21             <img v-if="rotateMode" src="images/rotate_arrow_64.png" class="rotate-handle rotate-tl" />
    22             <img v-if="rotateMode" src="images/rotate_arrow_64.png" class="rotate-handle rotate-tr" />
    23             <img v-if="rotateMode" src="images/rotate_arrow_64.png" class="rotate-handle rotate-bl" />
    24             <img v-if="rotateMode" src="images/rotate_arrow_64.png" class="rotate-handle rotate-br" />
    25 
    26             <img :src="imageUrl" class="image" :style="{ filter: filterString, transform: transformString }" />
     4        <div class="image-container" :style="{ transform: transformString }">
     5            <img v-if="rotateMode" src="images/rotate-arrow.svg" class="rotate-handle rotate-tl" @mousedown="allowRotation = true" draggable="false" />
     6            <img v-if="rotateMode" src="images/rotate-arrow.svg" class="rotate-handle rotate-tr" @mousedown="allowRotation = true" draggable="false" />
     7            <img v-if="rotateMode" src="images/rotate-arrow.svg" class="rotate-handle rotate-bl" @mousedown="allowRotation = true" draggable="false" />
     8            <img v-if="rotateMode" src="images/rotate-arrow.svg" class="rotate-handle rotate-br" @mousedown="allowRotation = true" draggable="false" />
     9
     10            <table v-if="rotateMode" class="rotate-guide" :style="{ transform: transformStringInverted }">
     11                <tr><td><hr /></td></tr>
     12                <tr><td><hr /></td></tr>
     13                <tr><td><hr /></td></tr>
     14                <tr><td><hr /></td></tr>
     15                <tr><td><hr /></td></tr>
     16                <tr><td><hr /></td></tr>
     17                <tr><td><hr /></td></tr>
     18                <tr><td><hr /></td></tr>
     19                <tr><td><hr /></td></tr>
     20                <tr><td><hr /></td></tr>
     21                <tr><td><hr /></td></tr>
     22                <tr><td><hr /></td></tr>
     23            </table>
     24
     25            <img ref="image" :src="imageUrl" class="image" :style="{ filter: filterString }" />
    2726        </div>
    2827    </div>
     
    4544
    4645<style lang="scss" scoped>
    47 .root {
     46.edit-page-root {
    4847    display: grid;
    4948    grid-template-columns: 1fr auto;
    50     grid-template-rows: 100%;
    5149    align-items: center;
    5250    justify-items: center;
     
    6563
    6664.image {
    67     max-width: 100%;
    68     height: auto;
     65    max-width: 70vw;
     66    max-height: 70vh;
    6967}
    7068
    7169.image-container {
    72     max-width: 70%;
    73     max-height: 70%;
    7470    position: relative;
    7571    margin: auto;
    76     padding: 1em;
     72    padding: 1.5em;
     73    user-select: none;
    7774
    7875    .rotate-handle {
    7976        height: 2em;
    8077        position: absolute;
     78        z-index: 5;
    8179
    8280        // Generated with https://codepen.io/sosuke/pen/Pjoqqp using var(--primary-bg-color)
    83         filter: invert(16%) sepia(100%) saturate(3091%) hue-rotate(347deg) brightness(75%) contrast(90%);
     81        // filter: invert(16%) sepia(100%) saturate(3091%) hue-rotate(347deg) brightness(75%) contrast(90%);
    8482    }
    8583
     
    116114    z-index: 3;
    117115
    118     tr hr {
    119         background-color: rgba(var(--bg-color-raw), 0.5);
     116    tr {
     117        td {
     118            vertical-align: center;
     119        }
     120
     121        hr {
     122            background-color: rgba(var(--bg-color-raw), 0.5);
     123            height: 2px;
     124        }
    120125    }
    121126}
     
    137142<script>
    138143import { mapState } from "vuex";
     144import Jimp from "jimp/es";
    139145import ToggleButton from "./ToggleButton.vue"
    140146
     
    151157            imageUrl: URL.createObjectURL(this.image),
    152158            invert: false,
    153             rotateMode: false
     159            rotation: 0,
     160            rotateMode: false,
     161            allowRotation: false
    154162        }
    155163    },
     
    167175            },
    168176            transformString() {
    169                 return `rotate(${this.rotation}deg)`
     177                return `rotate(${this.rotation}deg)`;
     178            },
     179            transformStringInverted() {
     180                return `rotate(-${this.rotation}deg)`;
    170181            }
    171182        })
    172183    },
    173184    methods: {
     185        async getImageBlobAsync() {
     186            const buffer = Buffer.from(this.image.arrayBuffer());
     187            const that = this;
     188
     189            const modifiedBuffer = await Jimp.read(buffer)
     190                .then(async image => {
     191                    if (that.invert) {
     192                        image.invert();
     193                    }
     194
     195                    // if (that.rotation !== 0) {
     196                    //     image.rotate(that.rotation);
     197                    // }
     198
     199                    return await image.getBufferAsync(Jimp.MIME_PNG);
     200                });
     201
     202            return new Blob([ modifiedBuffer ], { type: Jimp.MIME_PNG });
     203        },
     204
     205        onRotateHandleMouseDown(point) {
     206            console.log(point);
     207            this.rotatePoint = point;
     208        },
     209        /**
     210         * @param {MouseEvent} e The mouse movement event.
     211         */
     212        onDocumentMouseMove(e) {
     213            if (!this.allowRotation) {
     214                return;
     215            }
     216
     217            const imageRectangle = this.$refs.image.getBoundingClientRect();
     218            const imageCenterX = (imageRectangle.width / 2) + imageRectangle.left;
     219            const imageCenterY = (imageRectangle.height / 2) + imageRectangle.top;
     220
     221            if (e.clientX > imageCenterX) {
     222                this.rotation += e.movementY / 8;
     223            }
     224            else {
     225                this.rotation -= e.movementY / 8;
     226            }
     227
     228            if (e.clientY > imageCenterY) {
     229                this.rotation -= e.movementX / 8;
     230            }
     231            else {
     232                this.rotation += e.movementX / 8;
     233            }
     234
     235            if (this.rotation < 0) {
     236                this.rotation = 360 + this.rotation;
     237            }
     238            else if (this.rotation > 360) {
     239                this.rotation -= 360;
     240            }
     241        },
     242        onDocumentMouseUp() {
     243            this.allowRotation = false;
     244        }
     245    },
     246    beforeMount() {
     247        document.addEventListener("mousemove", this.onDocumentMouseMove);
     248        document.addEventListener("mouseup", this.onDocumentMouseUp);
     249    },
     250    beforeUnmount() {
     251        document.removeEventListener("mousemove", this.onDocumentMouseMove);
     252        document.removeEventListener("mouseup", this.onDocumentMouseUp);
    174253    }
    175254}
Note: See TracChangeset for help on using the changeset viewer.