Исходный файл(1688 × 630 пкс, размер файла: 518 КБ, MIME-тип: image/gif, закольцованный, 61 фрейм, 12 с)

Краткое описание

Описание
Deutsch: Multiplexing einer 7-Segment-Anzeige.
Anzeige von "1.234" in verschiedenen Frequenzen.
Дата
Источник Собственная работа
Автор Laserlicht

Python code

#Path to Cairo Lib
import os
os.environ["PATH"] = r"D:\Programme\msys64\mingw64\bin" + os.pathsep + os.environ["PATH"]

import numpy as np
import drawSvg as draw

############################

#load and ransform segments
#based on Coords from here: https://commons.wikimedia.org/wiki/File:7_Segment_Display_with_Labeled_Segments.svg
seg = [ # X, Y
        [[278.759,242.759,98.759,62.759,98.759,242.759,278.759,242.759], [520.74,556.74,556.74,520.74,484.74,484.74,520.74,556.74]], #A
        [[287.759,323.759,323.759,287.759,251.759,251.759,287.759,323.759], [295.928,331.928,475.928,511.928,475.928,331.928,295.928,331.928]], #B
        [[287.759,323.759,323.759,287.759,251.759,251.759,287.759,323.759], [64.427,100.427,244.427,280.427,244.427,100.427,64.427,100.427]], #C
        [[278.759,242.759,98.759,62.759,98.759,242.759,278.759,242.759], [55.26,91.26,91.26,55.26,19.26,19.26,55.26,91.26]], #D
        [[53.758,89.759,89.759,53.758,17.758,17.758,53.758,89.759], [64.427,100.427,244.427,280.427,244.427,100.427,64.427,100.427]], #E
        [[53.758,89.758,89.758,53.758,17.758,17.758,53.758,89.758], [295.928,331.928,475.928,511.928,475.928,331.928,295.928,331.928]], #F
        [[278.759,242.759,98.759,62.759,98.759,242.759,278.759,242.759], [287.927,323.928,323.928,287.927,251.927,251.927,287.927,323.928]] #G
      ]
seg = np.array(seg)
circle = np.array([373.241, 515.74])

offs = np.array([17.758, 19.26])

circle -= offs

offs = np.repeat(offs[:, np.newaxis], 8, axis=1)
offs = np.repeat(offs[np.newaxis, :, :], 7, axis=0)

seg -= offs

scale_f = 537.48
seg /= scale_f
circle /= scale_f
circle = np.absolute(circle + np.array([0, -1]))
circle_r = 41 / scale_f

############################

seg_decoder = {
    "0": [False, True, True, True, True, True, True],
    "1": [False, False, False, False, True, True, False],
    "2": [True, False, True, True, False, True, True],
    "3": [True, False, False, True, True, True, True],
    "4": [True, True, False, False, True, True, False],
    "5": [True, True, False, True, True, False, True],
    "6": [True, True, True, True, True, False, True],
    "7": [False, False, False, False, True, True, True],
    "8": [True, True, True, True, True, True, True],
    "9": [True, True, False, True, True, True, True],
    "A": [True, True, True, False, True, True, True],
    "B": [True, True, True, True, True, False, False],
    "C": [False, True, True, True, False, False, True],
    "D": [True, False, True, True, True, True, False],
    "E": [True, True, True, True, False, False, True],
    "F": [True, True, True, False, False, False, True],
    " ": [False, False, False, False, False, False, False],
    '█': [True, True, True, True, True, True, True]
}

############################

def render(text, point, column_switch, seg_switch_draw):
    d = draw.Drawing(402, 150, origin=(0, 0), displayInline=False)
    d.append(draw.Rectangle(0, 0, 585, 150, fill='#ffffff'))

    for i in range(len(text)):
        char = text[i]

        seg1 = seg * 100

        offs = np.array([90 * i + 4 + 50, 5])
        offs = np.repeat(offs[:, np.newaxis], 8, axis=1)
        offs = np.repeat(offs[np.newaxis, :, :], 7, axis=0)
        seg1 += offs

        color_enabled = 'green'
        color_disabled = '#eeeeee'
        color_wire_disabled = 'gray'
        color_wire_enabled_p = 'red'
        color_wire_enabled_m = 'blue'

        d.append(draw.Rectangle(90 * i + 50, 0, 82, 110-0.25, fill='#cccccc', stroke='black', stroke_width=0.5))
        d.append(draw.Lines(*np.ravel(seg1[0],'F'), close=False, fill=color_enabled if seg_decoder[char][6] else color_disabled, stroke='black'))
        d.append(draw.Lines(*np.ravel(seg1[1],'F'), close=False, fill=color_enabled if seg_decoder[char][5] else color_disabled, stroke='black'))
        d.append(draw.Lines(*np.ravel(seg1[2],'F'), close=False, fill=color_enabled if seg_decoder[char][4] else color_disabled, stroke='black'))
        d.append(draw.Lines(*np.ravel(seg1[3],'F'), close=False, fill=color_enabled if seg_decoder[char][3] else color_disabled, stroke='black'))
        d.append(draw.Lines(*np.ravel(seg1[4],'F'), close=False, fill=color_enabled if seg_decoder[char][2] else color_disabled, stroke='black'))
        d.append(draw.Lines(*np.ravel(seg1[5],'F'), close=False, fill=color_enabled if seg_decoder[char][1] else color_disabled, stroke='black'))
        d.append(draw.Lines(*np.ravel(seg1[6],'F'), close=False, fill=color_enabled if seg_decoder[char][0] else color_disabled, stroke='black'))
        d.append(draw.Circle(*(circle * 100 + np.array([90 * i + 4 + 50, 5])), circle_r * 100, fill=color_enabled if point[i] else color_disabled, stroke_width=1, stroke='black'))

        d.append(draw.Text(str(i + 1), 9, 90 * i + 50 + 41 - 2, 143, fill='magenta'))
        d.append(draw.Line(90 * i + 50 + 41, 110, 90 * i + 50 + 41, 120, stroke=color_wire_enabled_m if column_switch[i] else color_wire_disabled, stroke_width=2, fill='none'))
        d.append(draw.Line(90 * i + 50 + 41, 130, 90 * i + 50 + 41, 140, stroke=color_wire_enabled_m, stroke_width=2, fill='none'))
        a = 2 if not column_switch[i] else 0
        d.append(draw.Line(90 * i + 50 + 41 - 2 - a, 118, 90 * i + 50 + 41 - 2 - a, 132, stroke=color_wire_enabled_m if column_switch[i] else color_wire_disabled, stroke_width=2, fill='none'))

        for j in range(8):
            en = (seg_decoder[text[seg_switch_draw]] + [point[seg_switch_draw]])[j]
            d.append(draw.Line(90 * i + 50, 110 / 9 * (j + 1), 90 * i + 50 - 8, 110 / 9 * (j + 1), stroke=color_wire_enabled_p if en else color_wire_disabled, stroke_width=2, fill='none'))

            if i==seg_switch_draw:
                d.append(draw.Text(["DP", "A", "B", "C", "D", "E", "F", "G"][::-1][j], 9, 7, 110 / 9 * (j + 1) - 3, fill='magenta'))
                d.append(draw.Line(50 - 20, 110 / 9 * (j + 1), 50 - 10 - 20, 110 / 9 * (j + 1), stroke='red', stroke_width=2, fill='none'))
                b = 2 if not en else 0
                d.append(draw.Line(50 - 6, 110 / 9 * (j + 1) + 2 + b, 50 - 10 - 12, 110 / 9 * (j + 1) + 2 + b, stroke='red', stroke_width=2, fill='none'))
                
    d.setPixelScale(4.2)  # Set number of pixels per geometry unit
    #d.setRenderSize(400,200)  # Alternative to setPixelScale
    #d.saveSvg('example.svg')
    #d.savePng('example.png')

    #d.rasterize()  # Display as PNG
    #d  # Display as SVG
    return d

############################

from apng import APNG
import os, numpy, PIL
from PIL import Image

files = []
f = 0

text = "1234"
pointpos = 0

for j in range(6):
  delay = 1000/2**j

  for _ in range(j):
    for i in range(len(text)):
      fn = "R:/Temp/" + str(f).zfill(5) + ".png"

      seg_switch_draw = i
      column_switch = [i==x for x in range(len(text))]
      point = [i==pointpos==x for x in range(len(text))]
      text_masked = "".join([x if i==index else " " for index, x in enumerate(text)])

      render(text_masked, point, column_switch, seg_switch_draw).savePng(fn)
      
       #remove colors
      arr = numpy.array(Image.open(fn),dtype=numpy.float)
      arr = numpy.array(numpy.round(arr),dtype=numpy.uint8)
      arr = numpy.bitwise_and(arr >> 4, 0x0f)
      arr = numpy.bitwise_and(arr << 4, 0xff)
      out = Image.fromarray(arr,mode="RGB")
      out.save(fn)

      files.append((fn, delay))

      f += 1

#mean
file, delay = files[0]
w,h = Image.open(file).size
N = len(text)
arr = numpy.zeros((h,w,3),numpy.float)
for i in range(len(text)):
  file, delay = files[-i]
  imarr = numpy.array(Image.open(file),dtype=numpy.float)
  arr = arr+imarr/N
arr = numpy.array(numpy.round(arr),dtype=numpy.uint8)

arr = numpy.bitwise_and(arr >> 4, 0x0f) #remove colors
arr = numpy.bitwise_and(arr << 4, 0xff)

out = Image.fromarray(arr,mode="RGB")
out.save(r"R:\Temp\avg.png")
files.append((r"R:\Temp\avg.png", 5000))

im = APNG()
for file, delay in files:
  im.append_file(file, delay=int(delay))
im.save(r"R:\Temp\result.png")

from IPython.display import Image
Image(filename=r"R:\Temp\result.png")

#apng2gif result.png result.gif



Лицензирование

Image:

w:ru:Creative Commons
атрибуция распространение на тех же условиях
Этот файл доступен по лицензии Creative Commons Attribution-Share Alike 4.0 International
Атрибуция: Laserlicht
Вы можете свободно:
  • делиться произведением – копировать, распространять и передавать данное произведение
  • создавать производные – переделывать данное произведение
При соблюдении следующих условий:
  • атрибуция – Вы должны указать авторство, предоставить ссылку на лицензию и указать, внёс ли автор какие-либо изменения. Это можно сделать любым разумным способом, но не создавая впечатление, что лицензиат поддерживает вас или использование вами данного произведения.
  • распространение на тех же условиях – Если вы изменяете, преобразуете или создаёте иное произведение на основе данного, то обязаны использовать лицензию исходного произведения или лицензию, совместимую с исходной.

Source:

Этот файл доступен на условиях лицензии Expat License, иногда называемой Лицензией MIT:

Copyright © Laserlicht

Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:

Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явно выраженных или подразумеваемых, включая, но не ограничиваясь гарантиями товарной пригодности, соответствия по его конкретному назначению и отсутствия нарушений прав. Ни в каком случае авторы или правообладатели не несут ответственности по искам о возмещении ущерба, убытков или других требований по действующим контрактам, деликтам или иному, возникшим из, имеющим причиной или связанным с программным обеспечением или использованием программного обеспечения или иными действиями с программным обеспечением.


Загружающему: Лицензия MIT имеет различные версии, возможно вы хотите указать лицензию более точно. Кликните на {{MIT}} для более подробной информации.

Краткие подписи

Добавьте однострочное описание того, что собой представляет этот файл

Элементы, изображённые на этом файле

изображённый объект

У этого свойства есть некоторое значение без элемента в

image/gif

530 074 байт

630 пиксель

1688 пиксель

История файла

Нажмите на дату/время, чтобы посмотреть файл, который был загружен в тот момент.

Дата/времяМиниатюраРазмерыУчастникПримечание
текущий21:58, 25 февраля 2022Миниатюра для версии от 21:58, 25 февраля 20221688 × 630 (518 КБ)Laserlichthighest speed not possible in browser...
21:54, 25 февраля 2022Миниатюра для версии от 21:54, 25 февраля 20221688 × 630 (708 КБ)LaserlichtThumb->Animation
21:40, 25 февраля 2022Миниатюра для версии от 21:40, 25 февраля 20222010 × 750 (850 КБ)LaserlichtUploaded own work with UploadWizard

Следующая страница использует этот файл:

Глобальное использование файла

Данный файл используется в следующих вики: