Shallow Thoughts : : Oct
Akkana's Musings on Open Source Computing and Technology, Science, and Nature.
Fri, 30 Oct 2015
In
Part
I of HDMI Presentation Setup on Linux, I covered the basics of getting
video and audio working over HDMI. Now I want to cover some finer-grained
details: some problems I had, and ways to make it easier to enable
HDMI when you need it.
Testing follies, delays, and screen blinking/flashing woes
While I was initially trying to get this working, I was using my own
short sound clip (one of the alerts I use for IRC) and it wasn't
working. Then I tried the test I showed in part I,
$ aplay -D plughw:0,3 /usr/share/sounds/alsa/Front_Center.wav
and that worked fine.
Tried my sound clip again -- nothing. I noticed that my clip was mono
and 8-bit while the ALSA sample was stereo and 16-bit, and I wasted a
lot of time in web searches on why HDMI would play one and not the other.
Eventually I figured out that the reason my short
clip wasn't playing was that there's a delay when switching on HDMI sound,
and the first second two two of any audio may be skipped.
I found lots of complaints about people missing the first few seconds
of sound over HDMI, so this problem is quite common, and I haven't
found a solution.
So if you're giving a talk where you need to play short clips -- for
instance, a talk on bird calls -- be aware of this. I'm probably
going to make a clip of a few seconds of silence, so I can play silence
before every short clip to make sure I'm fully switched over to HDMI
before the clip starts:
aplay -D plughw:0,3 silence.wav osprey.wav
Another problem, probably related, when first starting an audio file:
the screen blinks brieftly off then on again, then blinks again a
little while after the clip ends. ("Flicker" turns out to be a better
term to use when web searching, though I just see a single blink, not
continued flickering). It's possible this is something about my home
TV, and I will have to try it with another monitor somewhere to see if
it's universal. It sounds like
kernel
bug 51421: Enabling HDMI sound makes HDMI video flicker,
but that bug was marked resolved in 2012 and I'm seeing this in 2015
on Debian Jessie.
Making HDMI the sound default
What a pain, to have to remember to add -D plughw:0,3 every time you
play a sound. And what do you do for other programs that don't have
that argument?
Fortunately, you can make HDMI your default sound output.
Create a file in your home directory called .asoundrc with
this in it (you may be able to edit this down -- I didn't try)
and then all audio will go to HDMI:
pcm.dmixer {
type dmix
ipc_key 1024
ipc_key_add_uid false
ipc_perm 0660
slave {
pcm "hw:0,3"
rate 48000
channels 2
period_time 0
period_size 1024
buffer_time 0
buffer_size 4096
}
}
pcm. !default {
type plug
slave.pcm "dmixer"
}
Great! But what about after you disconnect? Audio will still be going
to HDMI ... in other words, nowhere. So rename that file:
$ mv .asoundrc asoundrc-hdmi
Then when you connect to HDMI, you can copy it back:
$ cp asoundrc-hdmi .asoundrc
What a pain, you say again! This should happen automatically!
That's possible, but tricky: you have to set up udev rules and scripts.
See this
Arch
Linux discussion on HDMI audio output switching automatically
for the gory details. I haven't bothered, since this is something I'll
do only rarely, when I want to give one of those multimedia presentations
I sometimes contemplate but never actually give.
So for me, it's not worth fighting with udev when, by the time I
actually need HDMI audio, the udev syntax probably will have changed again.
Aliases to make switching easy
But when I finally do break down and design a multimedia presentation,
I'm not going to be wanting to do all this fiddling in the presentation
room right before the talk. I want to set up aliases to make it easy.
There are two things that need to be done in that case:
make HDMI output the default, and make sure it's unmuted.
Muting can be done automatically with amixer. First run amixer
with no arguments to find out the channel name (it gives a lot of output,
but look through the "Simple mixer control" lines, or speed that up
with amixer | grep control
.
Once you know the channel name (IEC958 on my laptop), you can run:
amixer sset IEC958 unmute
The rest of the alias is just shell hackery to create a file called
.asoundrc with the right stuff in it, and saving .asoundrc before
overwriting it. My alias in .zshrc is set up so that I can
say hdmisound on or hdmisound off (with no arguments, it
assumes on), and it looks like this:
# Send all audio output to HDMI.
# Usage: hdmisound [on|off], default is on.
hdmisound() {
if [[ $1 == 'off' ]]; then
if [[ -f ~/.asoundrc ]]; then
mv ~/.asoundrc ~/.asoundrc.hdmi
fi
amixer sset IEC958 mmute
else
if [[ -f ~/.asoundrc ]]; then
mv ~/.asoundrc ~/.asoundrc.nohdmi
fi
cat >> ~/.asoundrc <<EOF
pcm.dmixer {
type dmix
ipc_key 1024
ipc_key_add_uid false
ipc_perm 0660
slave {
pcm "hw:0,3"
rate 48000
channels 2
period_time 0
period_size 1024
buffer_time 0
buffer_size 4096
}
}
pcm. !default {
type plug
slave.pcm "dmixer"
}
EOF
amixer sset IEC958 unmute
fi
}
Of course, I could put all that .asoundrc content into a file and just
copy/rename it each time. But then I have another file I need to make
sure is in place on every laptop; I decided I'd rather make the alias
self-contained in my .zshrc.
Tags: linux, audio, speaking
[
11:57 Oct 30, 2015
More linux/laptop |
permalink to this entry |
]
Tue, 27 Oct 2015
For about a decade now I've been happily connecting to projectors to
give talks. xrandr --output VGA1 --mode 1024x768
switches
on the laptop's external VGA port, and xrandr --auto
turns it off again after I'm disconnected. No fuss.
But increasingly, local venues are eschewing video projectors and
instead using big-screen TVs, some of which offer only an HDMI port,
no VGA. I thought I'd better figure out how to present a talk over HDMI
now, so I'll be ready when I need to know.
Fortunately, my newest laptop does have an HDMI port. But in case it
ever goes on the fritz and I have to use an older laptop, I discovered
you can buy VGA to HDMI adaptors rather cheaply (about $10) on ebay.
I bought one of those, tested it on my TV at home and it at least
worked there. Be careful when shopping: you want to make sure you're
getting something that takes VGA in and outputs HDMI, rather than the
reverse. Ebay descriptions aren't always 100% clear on that, but if you
check the gender of the connector in the photo and make sure it's right
to plug into the socket on your laptop, you should be all right.
Once you're plugged in (whether via an adaptor, or native HDMI built
into your laptop), connecting is easy, just like connecting with VGA:
xrandr --output HDMI1 --mode 1024x768
Of course, you can modify the resolution as you see fit.
I plan to continue to design my presentations for a 1024x768
resolution for the forseeable future. Since my laptop is 1366x1024,
I can use the remaining 342-pixel-wide swath for my speaker notes
and leave them invisible to the audience.
But for GIMP presentations, I'll probably want to use the full width
of my laptop screen. --mode 1366x768
didn't work -- that
resolution wasn't available -- but running xrandr
with
no arguments got me a list of available resolutions, which included
1360x768. That worked fine and is what I'll use for GIMP talks and
other live demos where I want more screen space.
Sound over HDMI
My Toastmasters club had a tech session where a few of us tried out
the new monitor in our meeting room to make sure we could use it.
One person was playing a video with sound. I've never used sound in
a talk, but I've always wanted to find an excuse to try it.
Alas, it didn't "just work" -- xrandr's video settings have nothing
to do with ALSA's audio settings. So I had to wait until I got home so
I could do web searches and piece together the answer.
First, run
aplay -l
, which should show something like this:
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
Find the device number for the HDMI device, which I've highlighted here:
in this case, it's 3 (which seems to be common on Intel chipsets).
Now you can run a test:
$ aplay -D plughw:0,3 /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
If you don't hear anything, don't worry: the HDMI channel is probably muted
if you've never used it before. Run either
alsamixer
or
alsamixergui
.
Now find the channel representing your HDMI connection.
(HDMI must be plugged in for this to work.) In alsamixer, it's called
S/PDIF; in alsamixergui, it's called IEC958.
If you look up either of those terms,
Wikipedia S/PDIF
will tell you that S/PDIF is the Sony/Philips Digital Interconnect Format,
a data protocol and a set of physical specifications.
Those physical specifications appear to have nothing to do with video,
and use connectors that are nothing like HDMI. So it doesn't make much
sense. Just remember that if you see IEC958 or S/PDIF in ALSA, that's
probably your HDMI channel.
In the alsamixergui screenshot, IEC958 is muted: you can tell because
the little speaker icon at the top of the column is bright white.
If it were unmuted, the speaker icon would be grey like most of the others.
Yes, this seems backward. It's Linux audio: get used to obscure user interfaces.
In the alsamixer screenshot, the mutes are at the bottom of each column,
and MM indicates a channel is muted (like the Beep channel in the screenshot).
S/PDIF is not muted here, though it appears to be at zero volume.
(The 00 doesn't tell you it's at zero volume; 00 means it's
not muted. What did I say about Linux audio?)
ALSA apparently doesn't let you adjust the volume of HDMI output:
presumably they expect that your HDMI monitor will have its own volume
control. If your S/PDIF is muted, you can use your right-arrow key to
arrow over to the S/PDIF channel, then type m to toggle muting.
You can exit alsamixer with Ctrl-C (Q and Ctrl-Q don't work).
Now try that aplay -D command again and see if it works.
With any luck, it will (loudly).
A couple of other tests you might want to try:
speaker-test -t sine -f 440 -c 2 -s 1 -D hw:0,3
plays a sine wave.
speaker-test -c 2 -r 48000 -D hw:0,3
runs a general speaker test sequence.
In
Part
II of Linux HDMI Presentations,
I'll cover some problems I had, and how to write an alias
to make it easy to turn HDMI audio on and off.
Tags: linux, audio, speaking
[
14:36 Oct 27, 2015
More linux/laptop |
permalink to this entry |
]
Thu, 22 Oct 2015
I went to a night sky photography talk on Tuesday. The presenter
talked a bit about tips on camera lenses, exposures; then showed
a raw image and prepared to demonstrate how to process it to bring
out the details.
His slides disappeared, the screen went blank, and then ... nothing.
He wrestled with his laptop for a while. Finally he said "Looks like
I'm going to need a network connection", left the podium and headed
out the door to find someone to help him with that.
I'm not sure what the networking issue was:
the nature center has open wi-fi, but you know how it is during talks:
if anything can possibly go wrong with networking, it will, which is
why a good speaker tries not to rely on it. And I'm not blaming this
speaker, who had clearly done plenty of preparation and thought
he had everything lined up.
Eventually they got the network connection, and he connected to Adobe.
It turns out the problem was that Adobe Photoshop is now cloud-based.
Even if you have a local copy of the software, it insists on checking
in with Adobe at least every 30 days. At least, that's the theory.
But he had used the software on that laptop earlier that same day,
and thought he was safe. But that wasn't good enough, and Photoshop
picked the worst possible time -- a talk in front of a large audience
-- to decide it needed to check in before letting him do anything.
Someone sitting near me muttered "I'd been thinking about buying that,
but now I don't think I will." Someone else told me afterward that
all Photoshop is now cloud-based; older versions still work,
but if you buy Photoshop now, your only option is this cloud version
that may decide ... at the least opportune moment ... that you can't
use your software any more.
I'm so glad I use Free software like GIMP. Not that things can't go
wrong giving a GIMP talk, of course. Unexpected problems or bugs can
arise with any software, and you take that risk any time you give a
live demo.
But at least with Free, open source software like GIMP, you know you
own the software and it's not suddenly going to refuse to run without
a license check. That sort of freedom is what makes the difference
between free as in beer, and Free as in speech.
You can practice your demo carefully before the talk
to guard against most bugs and glitches; but all the practice in the
world won't guard against software that won't start.
I talked to the club president afterward and offered to give a GIMP
talk to the club some time soon, when their schedule allows.
Tags: linux, gimp, open source, photoshop
[
10:24 Oct 22, 2015
More gimp |
permalink to this entry |
]
Thu, 15 Oct 2015
Update, December 2022:
viewmailattachments has been integrated with another mutt helper, viewhtmlmail.py, which can show HTML messages complete with embedded images. It's described
in the article View Mail Attachments from Mutt
and the script is at
viewmailattachments.py. It no longer uses the "please wait" screen described in this article, but the rest of the discussion still applies.
I seem to have fallen into a nest of Mac users whose idea of
email is a text part, an HTML part, plus two or three or seven attachments
(no exaggeration!) in an unholy combination of .DOC, .DOCX, .PPT and other
Microsoft Office formats, plus .PDF.
Converting to text in mutt
As a mutt user who generally reads all email as plaintext,
normally my reaction to a mess like that would be "Thanks, but
no thanks". But this is an organization that does a lot of good work
despite their file format habits, and I want to help.
In mutt, HTML mail attachments are easy.
This pair of entries in ~/.mailcap takes care of them:
text/html; firefox 'file://%s'; nametemplate=%s.html
text/html; lynx -dump %s; nametemplate=%s.html; copiousoutput
Then in .muttrc, I have
auto_view text/html
alternative_order text/plain text
If a message has a text/plain part, mutt shows that. If it has text/html
but no text/plain, it looks for the "copiousoutput" mailcap entry,
runs the HTML part through lynx (or I could use links or w3m) and
displays that automatically.
If, reading the message in lynx, it looks to me like the message has
complex formatting that really needs a browser, I can go to
mutt's attachments screen and display the attachment in firefox
using the other mailcap entry.
Word attachments are not quite so easy, especially when there are a
lot of them. The straightforward way is to save each one to a file,
then run LibreOffice on each file, but that's slow and tedious
and leaves a lot of temporary files behind.
For simple documents, converting to plaintext is usually good
enough to get the gist of the attachments.
These .mailcap entries can do that:
application/msword; catdoc %s; copiousoutput
application/vnd.openxmlformats-officedocument.wordprocessingml.document; docx2txt %s -; copiousoutput
Alternatives to catdoc include wvText and antiword.
But none of them work so well when you're cross-referencing five
different attachments, or for documents where color and formatting
make a difference, like mail from someone who doesn't know how to get
their mailer to include quoted text, and instead distinguishes their
comments from the text they're replying to by making their new
comments green (ugh!)
For those, you really do need a graphical window.
I decided what I really wanted (aside from people not sending me these
crazy emails in the first place!) was to view all the attachments as
tabs in a new window. And the obvious way to do that is to convert
them to formats Firefox can read.
Converting to HTML
I'd used wvHtml to convert .doc files to HTML, and it does a decent
job and is fairly fast, but it can't handle .docx. (People who send
Office formats seem to distribute their files fairly evenly between
DOC and DOCX. You'd think they'd use the same format for everything
they wrote, but apparently not.) It turns out LibreOffice has a
command-line conversion program, unoconv, that can handle any format
LibreOffice can handle. It's a lot slower than wvHtml but it does a
pretty good job, and it can handle .ppt (PowerPoint) files too.
For PDF files, I tried using pdftohtml, but it doesn't always do so well,
and it's hard to get it to produce a single HTML file rather than a
directory of separate page files. And about three quarters of PDF files
sent through email turn out to be PDF in name only: they're actually
collections of images of single pages, wrapped together as a PDF file.
(Mostly, when I see a PDF like that I just skip it and try to get the
information elsewhere. But I wanted my program at least to be able to
show what's in the document, and let the user choose whether to skip it.)
In the end, I decided to open a firefox tab and let Firefox's built-in
PDF reader show the file, though popping up separate mupdf windows is
also an option.
I wanted to show the HTML part of the email, too. Sometimes there's
formatting there (like the aforementioned people whose idea of quoting
messages is to type their replies in a different color), but there can
also be embedded images. Extracting the images and showing them in a
browser window is a bit tricky, but it's a problem I'd already solved
a couple of years ago:
Viewing HTML mail messages from Mutt (or other command-line mailers).
Showing it all in a new Firefox window
So that accounted for all the formats I needed to handle.
The final trick was the firefox window. Since some of these conversions,
especially unoconv, are quite slow, I wanted to pop up a window right
away with a "converting, please wait..." message.
Initially, I used a javascript: URL, running the command:
firefox -new-window "javascript:document.writeln('<br><h1>Translating documents, please wait ...</h1>');"
I didn't want to rely on Javascript, though. A data: URL, which I
hadn't used before, can do the same thing without javascript:
firefox -new-window "data:text/html,<br><br><h1>Translating documents, please wait ...</h1>"
But I wanted the first attachment to replace the contents of that same
window as soon as it was ready, and then subsequent attachments open a
new tab in that window.
But it turned out that firefox is inconsistent about what -new-window
and -new-tab do; there's no guarantee that -new-tab will show up in
the same window you recently popped up with -new-window, and
running just firefox URL
might open in either the new
window or the old, in a new tab or not, or might not open at all.
And things got even more complicated after I decided that I should use
-private-window to open these attachments in private browsing mode.
In the end, the only way firefox would behave in a repeatable,
predictable way was to use -private-window for everything.
The first call pops up the private window, and each new call opens
a new tab in the private window. If you want two separate windows
for two different mail messages, you're out of luck: you can't have
two different private windows. I decided I could live with that;
if it eventually starts to bother me, I can always give up on Firefox
and write a little python-webkit wrapper to do what I need.
Using a file redirect instead
But that still left me with no way to replace the contents of the
"Please wait..." window with useful content. Someone on #firefox
came up with a clever idea: write the content to a page with a
meta redirect.
So initially, I create a file pleasewait.html that includes the header:
<meta http-equiv="refresh" content="2;URL=pleasewait.html">
(other HTML, charset information, etc. as needed).
The meta refresh means Firefox will reload the file every two seconds.
When the first converted file is ready, I just change the header
to redirect to
URL=first_converted_file.html.
Meanwhile, I can be opening the other documents in additional tabs.
Finally, I added the command to my .muttrc. When I'm viewing a message
either in the index or pager screens, F10 will call the script and
decode all the attachments.
macro index <F10> "<pipe-message>~/bin/viewmailattachments\n" "View all attachments in browser"
macro pager <F10> "<pipe-message>~/bin/viewmailattachments\n" "View all attachments in browser"
Whew! It was trickier than I thought it would be.
But I find I'm using it quite a bit, and it takes a lot of the pain
out of those attachment-full emails.
The script is available at:
viewmailattachments.py
on GitHub.
Tags: email, mutt, programming, python, firefox, linux
[
15:18 Oct 15, 2015
More linux |
permalink to this entry |
]
Sun, 11 Oct 2015
X stopped working after my last Debian update.
Rather than run a login manager, I typically log in on the console.
Then in my .zlogin file, I have:
if [[ $(tty) == /dev/tty1 ]]; then
# do various things first, then:
startx -- -dumbSched >& $HOME/.xsession-errors
fi
Ignore
-dumbSched
for now; it's a fix for a timing problem
openbox has when bringing up initial windows. The relevant part here
is that I redirect both standard output and standard error to a
file named .xsession-errors. That means that if I run GIMP or firefox
or any other program from a menu, and later decide I need to see
their output to look for error messages, all I have to do is check
that file.
But as of my last update, that no longer works.
Plain startx
, without the output redirection, works fine.
But with the redirect, X pauses for five or ten seconds, then exits,
giving me my prompt back but with messed-up terminal settings, so I
have to type reset
before I do anything else.
Of course, I checked that .xsession file for errors, and also the
~/.local/share/xorg/Xorg.0.log file it referred me to (which is where
X stores its log now that it's no longer running as root).
It seems the problem is this:
Fatal server error:
(EE) xf86OpenConsole: VT_ACTIVATE failed: Operation not permitted
Which wasn't illuminating but at least gave me a useful search keyword.
I found a fair number of people on the web having the same problem.
It's related to the recent Xorg change that makes it possible to run
Xorg as a regular user, not root. Not that running as a user should
have anything to do with capturing standard output and error. But
apparently Xorg running as a user is dependent on what sort of virtual
terminal it was run from; and the way it determines the controlling
terminal, apparently, is by checking stderr (and maybe also stdout).
Here's a slightly longer description of what it's doing,
from the ever useful
Arch
Linux forums.
I'm fairly sure there are better ways of determining a process's
controlling terminal than using stderr. For instance, a casual web
search turned up ctermid;
or you could do checks on /dev/tty
. There are probably
other ways.
The Arch Linux thread linked above, and quite a few others, suggest
adding the server option -keeptty
when starting X. The
Xorg manual isn't encouraging about this as a solution:
- -keeptty
- Prevent the server from detaching its initial controlling
terminal. This option is only useful when debugging the server.
Not all platforms support (or can use) this option.
But it does work.
I found several bugs filed already on the redirection problem.
Freedesktop has a bug report on it, but it's more than a year old
and has no comments or activity:
Freedesktop
bug 82732: rootless X doesn't start if stderr redirected.
Redhat has a bug report:
Xorg
without root rights breaks by streams redirection,
and supposedly added a fix way back in January
in their package version xorg-x11-xinit-1.3.4-3.fc21 ...
though it looks like
their
fix is simply to enable -keeptty
automatically,
which is better than nothing but doesn't seem ideal.
Still, it does suggest that it's probably not harmful to use that
workaround and ignore what the Xorg man page says.
Debian didn't seem to have a bug filed on the problem yet (not
terribly surprising, since they only enabled it in unstable a
few days ago), so I used reportbug
to attempt to file one.
I would link to it here if Debian had an actual bug system that
allowed searching for bugs (they do have a page entitled "BTS Search"
but it gives "Internal Server Error", and the alternate google groups
bug search doesn't find my bug), or if their bug reporting system
acknowledged new bugs by emailing the submitter the bug number.
In truth I strongly suspect that reportbug
is actually a
no-op and doesn't actually do anything with the emailed report.
But I'm not sure the Debian bug matters since the real bug is Xorg's,
and it doesn't look like they're very interested in the problem.
So anyone who wants to be able to access output of programs running
under X probably needs to use -keeptty
for the forseeable
future.
Update: the bug acknowledgement came in six hours later.
It's bug
801529.
Tags: X11, Xorg, linux
[
12:31 Oct 11, 2015
More linux |
permalink to this entry |
]
Sun, 04 Oct 2015
For the animations
I made from the lunar eclipse last week, the hard part was aligning
all the images so the moon (or, in the case of the moonrise image, the
hillside) was in the same position in every time.
This is a problem that comes up a lot with astrophotography, where
multiple images are stacked for a variety of reasons: to increase
contrast, to increase detail, or to take an average of a series of images,
as well as animations like I was making this time.
And of course animations can be fun in any context, not just astrophotography.
In the tutorial that follows, clicking on the images will show a full
sized screenshot with more detail.
Load all the images as layers in a single GIMP image
The first thing I did was load up all the images as layers in a single image:
File->Open as Layers..., then navigate to where the images are
and use shift-click to select all the filenames I wanted.
Work on two layers at once
By clicking on the "eyeball" icon in the Layers dialog, I could
adjust which layers were visible. For each pair of layers, I made
the top layer about 50% opaque by dragging the opacity slider (it's
not important that it be exactly at 50%, as long as you can see both
images).
Then use the Move tool to drag the top image on top of the bottom image.
But it's hard to tell when they're exactly aligned
"Drag the top image on top of the bottom image":
easy to say, hard to do. When the images are dim and red like that,
and half of the image is nearly invisible, it's very hard to tell when
they're exactly aligned.
Use a Contrast display filter
What helped was a Contrast filter.
View->Display Filters... and in the dialog that pops up,
click on
Contrast, and click on the right arrow to move it to
Active Filters.
The Contrast filter changes the colors so that dim red moon is fully
visible, and it's much easier to tell when the layers are
approximately on top of each other.
Use Difference mode for the final fine-tuning
Even with the Contrast filter, though, it's hard to see when the
images are exactly on top of each other. When you have them within a few
pixels, get rid of the contrast filter (you can keep the dialog up but
disable the filter by un-checking its checkbox in
Active Filters).
Then, in the Layers dialog, slide the top layer's Opacity back to 100%,
go to the
Mode selector and set the layer's mode to
Difference.
In Difference mode, you only see differences between the two layers.
So if your alignment is off by a few pixels, it'll be much easier to see.
Even in a case like an eclipse where the moon's appearance is changing
from frame to frame as the earth's shadow moves across it, you can still
get the best alignment by making the Difference between the two layers
as small as you can.
Use the Move tool and the keyboard: left, right, up and down arrows move
your layer by one pixel at a time. Pick a direction, hit the arrow key
a couple of times and see how the difference changes. If it got bigger,
use the opposite arrow key to go back the other way.
When you get to where there's almost no difference between the two layers,
you're done. Change Mode back to Normal, make sure Opacity is at 100%,
then move on to the next layer in the stack.
It's still a lot of work. I'd love to find a program that looks for
circular or partially-circular shapes in successive images and does
the alignment automatically. Someone on GIMP suggested I might be
able to write something using OpenCV, which has circle-finding
primitives (I've written briefly before about
SimpleCV,
a wrapper that makes OpenCV easy to use from Python).
But doing the alignment by hand in GIMP, while somewhat tedious,
didn't take as long as I expected once I got the hang of using the
Contrast display filter along with Opacity and Difference mode.
Creating the animation
Once you have your layers, how do you turn them into an animation?
The obvious solution, which I originally intended to use, is to save
as GIF and check the "animated" box. I tried that -- and discovered
that the color errors you get when converting an image to indexed make
a beautiful red lunar eclipse look absolutely awful.
So I threw together a Javascript script to animate images by loading
a series of JPEGs. That meant that I needed to export all the layers
from my GIMP image to separate JPG files.
GIMP doesn't have a built-in way to export all of an image's layers to
separate new images. But that's an easy plug-in to write, and a web
search found lots of plug-ins already written to do that job.
The one I ended up using was Lie Ryan's Python script in
How
to save different layers of a design in separate files;
though a couple of others looked promising (I didn't try them), such as
gimp-plugin-export-layers
and
save_all_layers.scm.
You can see the final animation here:
Lunar eclipse of
September 27, 2015: Animations.
Tags: gimp, photography, astronomy
[
09:44 Oct 04, 2015
More gimp |
permalink to this entry |
]
Thu, 01 Oct 2015
The lunar eclipse on Sunday was gorgeous. The moon rose already in
eclipse, and was high in the sky by the time totality turned the
moon a nice satisfying deep red.
I took my usual slipshod approach to astrophotography. I had my 90mm
f/5.6 Maksutov lens set up on the patio with the camera attached,
and I made a shot whenever it seemed like things had changed
significantly, adjusting the exposure if the review image looked
like it might be under- or overexposed, occasionally attempting
to refocus. The rest of the time I spent socializing with friends,
trading views through other telescopes and binoculars, and enjoying an
apple tart a la mode.
So the images I ended up with aren't all they could be --
not as sharply focused as I'd like (I never have figured out a
good way of focusing the Rebel on astronomy images) and rather
grainy.
Still, I took enough images to be able to put together a couple of
animations: one of the lovely moonrise over the mountains, and one
of the sequence of the eclipse through totality.
Since the 90mm Mak was on a fixed tripod, the moon drifted through the
field and I had to adjust it periodically as it drifted out.
So the main trick to making animations was aligning all the moon
images. I haven't found an automated way of doing that, alas,
but I did come up with some useful GIMP techniques, which I'm in
the process of writing up as a tutorial.
Once I got the images all aligned as layers in a GIMP image,
I saved them as an animated GIF -- and immediately discovered that
the color error you get when converting to an indexed GIF image
loses all the beauty of those red colors. Ick!
So instead, I wrote a little Javascript animation function that
loads images one by one at fixed intervals. That worked a lot better
than the GIF animation, plus it lets me add a Start/Stop button.
You can view the animations (or the source for the javascript
animation function) here:
Lunar eclipse animations
Tags: astronomy, eclipse, moon, gimp
[
12:55 Oct 01, 2015
More science/astro |
permalink to this entry |
]