Merge pull request #1778 from xexyl/kurdyukov22020
This commit is contained in:
4 files changed
+75
-20
No files matched your search
+20
-18
@@ -19,29 +19,27 @@ make
|
|||||||
./prog 1000 selfie.jpg output.jpg
|
./prog 1000 selfie.jpg output.jpg
|
||||||
# Admire your portrait in cubist style
|
# Admire your portrait in cubist style
|
||||||
|
|
||||||
(echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm
|
./try.sh
|
||||||
# Look at random.ppm. Do you see any patterns?
|
```
|
||||||
./prog_ppm 1000 random.ppm output.ppm
|
|
||||||
# See which patterns the program has found
|
|
||||||
|
|
||||||
for i in 0001 0002 0004 0008 0016 0032 0064 0128 0256 0512 1024 2048 4096 8192 ; do ./prog $i sample.jpg out$i.jpg; done
|
|
||||||
# Then flip through the out*.jpg pictures and see when you start recognizing the image.
|
|
||||||
``
|
|
||||||
|
|
||||||
|
|
||||||
## Judges' remarks:
|
## Judges' remarks:
|
||||||
|
|
||||||
This entry has reminded us of a winning entry back in the early 90s. Can you guess which one?
|
This entry has reminded us of a winning entry back in the early 90s. Can you
|
||||||
|
guess which one?
|
||||||
|
|
||||||
For a given image, try graphing the execution time relative to the number of rectangles.
|
For a given image, try graphing the execution time relative to the number of
|
||||||
What is the complexity? Is it obvious from the source code?
|
rectangles. What is the complexity? Is it obvious from the source code?
|
||||||
|
|
||||||
|
|
||||||
## Author's remarks:
|
## Author's remarks:
|
||||||
|
|
||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
This program divides the image into a specified number of rectangles. This process is content aware, so algorithm tries to match most of the information. However, it doesn't find the best theoretically possible layout.
|
This program divides the image into a specified number of rectangles. This
|
||||||
|
process is content aware, so the algorithm tries to match most of the information.
|
||||||
|
However, it doesn't find the best theoretically possible layout.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./prog 1000 input.jpg output.jpg
|
./prog 1000 input.jpg output.jpg
|
||||||
@@ -54,7 +52,7 @@ You can build three versions, depending on the image format.
|
|||||||
Default is JPEG version; if you have the `libjpeg` development package installed
|
Default is JPEG version; if you have the `libjpeg` development package installed
|
||||||
in your system, then `make` without arguments should do the right thing.
|
in your system, then `make` without arguments should do the right thing.
|
||||||
|
|
||||||
If you want to use `libjpeg` compiled from sources, then use `LIBS` define to
|
If you want to use `libjpeg` compiled from sources, then use the `LIBJPEG` define to
|
||||||
specify the path to includes and the library. For example using
|
specify the path to includes and the library. For example using
|
||||||
[libjpeg source](https://mac-dev-env.patrickbougie.com/libjpeg/) version 9c:
|
[libjpeg source](https://mac-dev-env.patrickbougie.com/libjpeg/) version 9c:
|
||||||
|
|
||||||
@@ -68,7 +66,8 @@ Use this command to build a PNG version (you need `libpng`):
|
|||||||
make prog_png LIBPNG="-lpng"
|
make prog_png LIBPNG="-lpng"
|
||||||
```
|
```
|
||||||
|
|
||||||
And the PPM version (no additional dependencies, can read raw/ASCII PPM, writes raw PPM):
|
And the PPM version (no additional dependencies, can read raw/ASCII PPM, writes
|
||||||
|
raw PPM):
|
||||||
|
|
||||||
```
|
```
|
||||||
make prog_ppm
|
make prog_ppm
|
||||||
@@ -76,7 +75,8 @@ make prog_ppm
|
|||||||
|
|
||||||
### Building on macOS with MacPorts:
|
### Building on macOS with MacPorts:
|
||||||
|
|
||||||
- Thanks to [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) for this information!
|
Thanks to [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) for this
|
||||||
|
information!
|
||||||
|
|
||||||
First, make sure you have the compiler tools installed e.g. by:
|
First, make sure you have the compiler tools installed e.g. by:
|
||||||
|
|
||||||
@@ -90,12 +90,13 @@ Make sure you install [MacPorts](https://www.macports.org/install.php). Then do:
|
|||||||
sudo port install jpeg libpng ImageMagick
|
sudo port install jpeg libpng ImageMagick
|
||||||
```
|
```
|
||||||
|
|
||||||
The program itself doesn't need ImageMagick, install it only if you plan to make GIFs from the results using `makegif.sh`.
|
The program itself doesn't need ImageMagick, install it only if you plan to make
|
||||||
|
GIFs from the results using `makegif.sh`.
|
||||||
|
|
||||||
After that’s installed you need to run make with these options:
|
After that’s installed you need to run make with these options:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make LIBS="-I/opt/local/include -L/opt/local/lib"
|
make LDFLAGS="-I/opt/local/include -L/opt/local/lib"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Building on macOS with HomeBrew
|
### Building on macOS with HomeBrew
|
||||||
@@ -121,11 +122,12 @@ You are now ready to compile this entry:
|
|||||||
make clobber all
|
make clobber all
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Notes
|
### Notes
|
||||||
|
|
||||||
Made this thing while experimenting with the idea of representing an image with
|
Made this thing while experimenting with the idea of representing an image with
|
||||||
rectangles (lossy compression). It's not very good in that sense, but the
|
rectangles (lossy compression). It's not very good in that sense, but the
|
||||||
results look funny, like a kind of cubism pixelart.
|
results look funny, like a kind of cubism pixel art.
|
||||||
|
|
||||||
Do not use values above 50000, it'll be slow.
|
Do not use values above 50000, it'll be slow.
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ ext="${image##*.}"
|
|||||||
dir="gif"
|
dir="gif"
|
||||||
[ $# -lt 3 ] && [ "$ext" = "png" -o "$ext" = "ppm" ] && prog="./prog_$ext"
|
[ $# -lt 3 ] && [ "$ext" = "png" -o "$ext" = "ppm" ] && prog="./prog_$ext"
|
||||||
[ -f "$image" ] || {
|
[ -f "$image" ] || {
|
||||||
echo "Usage: makegif.sh image.jpg output.gif ./prog"
|
echo "Usage: $0 image.jpg output.gif ./prog"
|
||||||
echo "Dependencies: ImageMagick, bc (basic calculator)"
|
echo "Dependencies: ImageMagick, bc (basic calculator)"
|
||||||
echo "Note: don't use large images (dimensions above 1000), ImageMagick may fail."
|
echo "Note: don't use large images (dimensions above 1000), ImageMagick may fail."
|
||||||
echo "Uses \"gif\" directory for temporary files."
|
echo "Uses \"gif\" directory for temporary files."
|
||||||
|
|||||||
Executable
+51
@@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# try.sh - demonstrate IOCCC winner 2020/kurdyukov2
|
||||||
|
#
|
||||||
|
|
||||||
|
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
|
||||||
|
# this way allows us to have the user specify a different compiler in an easy
|
||||||
|
# way.
|
||||||
|
if [[ -z "$CC" ]]; then
|
||||||
|
CC="cc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
make CC="$CC" all >/dev/null || exit 1
|
||||||
|
|
||||||
|
# clear screen after compilation so that only the entry is shown
|
||||||
|
clear
|
||||||
|
|
||||||
|
# try finding convert(1) from ImageMagick
|
||||||
|
CONVERT="$(type -P convert)"
|
||||||
|
|
||||||
|
|
||||||
|
echo "$ (echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm" 1>&2
|
||||||
|
(echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm
|
||||||
|
echo "Look at random.ppm. Do you see any patterns?" 1>&2
|
||||||
|
read -r -n 1 -p "Press any key to continue: "
|
||||||
|
echo 1>&2
|
||||||
|
# Look at random.ppm. Do you see any patterns?
|
||||||
|
echo "$ ./prog_ppm 1000 random.ppm output.ppm" 1>&2
|
||||||
|
./prog_ppm 1000 random.ppm output.ppm
|
||||||
|
echo 1>&2
|
||||||
|
# See which patterns the program has found
|
||||||
|
echo "Now open output.ppm. What patterns has the program found?" 1>&2
|
||||||
|
echo 1>&2
|
||||||
|
read -r -n 1 -p "Press any key to continue: "
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
echo "$ for i in 0001 0002 0004 0008 0016 0032 0064 0128
|
||||||
|
0256 0512 1024 2048 4096 8192 ; do ./prog $i sample.jpg out$i.jpg; done" 1>&2
|
||||||
|
for i in 0001 0002 0004 0008 0016 0032 0064 0128 0256 0512 1024 2048 4096 8192 ; do ./prog "$i" sample.jpg "out$i".jpg; done
|
||||||
|
echo "Now flip through out*.jpg and see when you start to recognise the image." 1>&2
|
||||||
|
|
||||||
|
if [[ -n "$CONVERT" ]]; then
|
||||||
|
echo 1>&2
|
||||||
|
read -r -n 1 -p "Press any key to create GIF: "
|
||||||
|
echo 1>&2
|
||||||
|
echo "$ $CONVERT -delay 10 -dither none -loop 0 $(ls out*.jpg | sort -V) $(ls out*.jpg | sort -rV) +map out.gif" 1>&2
|
||||||
|
"$CONVERT" -delay 10 -dither none -loop 0 $(ls out*.jpg | sort -V) $(ls out*.jpg | sort -rV) +map out.gif
|
||||||
|
echo 1>&2
|
||||||
|
echo "Now look at out.gif with a viewer that can show animation." 1>&2
|
||||||
|
echo "Warning: includes flashing colours." 1>&2
|
||||||
|
fi
|
||||||
+3
-1
@@ -4411,7 +4411,9 @@ use the program to play the WAV files (and in one case `stdout`).
|
|||||||
|
|
||||||
## <a name="2020_kurdyukov2"></a>[2020/kurdyukov2](/2020/kurdyukov2/prog.c) ([README.md](/2020/kurdyukov2/README.md))
|
## <a name="2020_kurdyukov2"></a>[2020/kurdyukov2](/2020/kurdyukov2/prog.c) ([README.md](/2020/kurdyukov2/README.md))
|
||||||
|
|
||||||
[Cody](#cody) added `-L`/`-I` paths to the Makefile to let this compile more easily if
|
[Cody](#cody) added the [try.sh](/2020/kurdyukov2/try.sh) script.
|
||||||
|
|
||||||
|
Cody also added `-L`/`-I` paths to the Makefile to let this compile more easily if
|
||||||
the user has installed the appropriate library with
|
the user has installed the appropriate library with
|
||||||
[MacPorts](https://www.macports.org) (with the default MacPorts prefix
|
[MacPorts](https://www.macports.org) (with the default MacPorts prefix
|
||||||
`/opt/local`).
|
`/opt/local`).
|
||||||
|
|||||||
Reference in new issue
Block a user