Converting bitmap images to plain HTML

July 14, 2012 Leave a comment

(note: this is a long story of why I created the tool to covert bitmaps to HTML and how it works. If you just want the tool, go to http://img2html.odednoam.com)

I just got engaged in writing a web application, that in one of its use-cases, sends an e-mail notification to its users. It’s been a while since I last wrote such app, and I was glad to know that the 2012 technology is so advanced that setting up the system that would actually send the e-mail takes 5 minutes (10 years ago it would have taken months, requiring you to re-learn the cryptic configuration files of “sendmail” and other delights).

Now, if there’s something I love about modern software development, is that handling the plumbing  is so easy, that you actually have time left to do what you enjoy: make a product that works beautifully. And in this case, beauty is in being able to send a nicely-formatted HTML e-mail to the users of my app.

Of course, to have a really nice e-mail I wanted to have the app’s logo embedded in the text. That’s a bit of a problem: images are commonly blocked of HTML e-mails. Before mail apps blocked them, they were a common source of annoyances, allowing spammers to track active e-mail addresses (by referencing an image hosted on the spammer’s server) and viruses to abuse bugs in the image display code for infecting PCs and spreading themselves. But for a small logo, representing its bitmap as a table with colored cells should be quite easy.

A quick web search brought up several tools to do that. A site called patternmedia.com has a nice tool that does just that; it creates a table in which each cell represents a pixel of the original. Neil Fraser has took one step further and implemented RLE compression to make the resulting HTML a bit smaller. Fraser had the right idea: the size of the HTML is a big issue (pun intended). converting to plain HTML, you not only give up the compression techniques used in image file formats, but you in fact represent the image in a very inefficient format made for text representation. A 1kb image file could easily become a 100-200kb HTML table. And e-mail messages are expected to be very small in size. For example, mobile mail clients commonly do not download a message if it is over 30kb or so. Even GMail, by default, does not display an e-mail message larger than 128kb.

Without compression, each table cell represents one pixel. The code example draws only 8 pixels.

RLE compression, as Fraser noticed, works very well for tables and is really easy to implement. Simply put, if we have a series of pixels all the same color, we can write the color just once and tell the browser that we have a table cell spreading over multiple columns (using the colspan=”…” attribute). This works extremely well for images that have small variance in color, and in which pixels of certain color tend to stick together. Black text on white background is the perfect example (and in fact, first generation fax machines used a variant of this compression).

With RLE compression, each table cell represents a series of consecutive pixels in the same color. The code example draws a complete line of the original bitmap.

In some images you could get better results by using RLE to merge adjacent pixels below a certain pixel (rather than on its side). The HTML would be a bit less readable, as HTML tables are drawn row-by-row, but in code it’s just as easy to create.

With this compression, images are much smaller, but still too large to fit in an e-mail message. Especially if they have colors, and if they are larger (the dimensions of the logo I wanted to use are 79×139, which is more than 10,000 pixels). So I wrote a better compression in the form of “2d RLE”: find large squares of pixels of the same color, and use both “colspan” and “rowspan” to color them. Ideally, I’d like to find the minimum number of rectangles required to cover the entire image. I couldn’t find an algorithm that does that in reasonable complexity, but a simple heuristic lookup for large rectangles works pretty well.

The tool that does this conversion is available at http://img2html.odednoam.com. It supports:

  • Reading an image file and converting it to HTML
  • A choice of compression: Horizontal RLE, Vertical RLE and 2D RLE
  • Supports image transparency for GIF and PNG images
  • Some further compression techniques, such as using the most common color as the table background to avoid repeating it
  • Choice whether to use CSS styles (better compression but lacks support from some mail clients, including GMail)
  • Choice of whether to use strict HTML, or loose HTML which takes even less space

Known issues (if any of the readers can suggest fixes, please let me know):

  • The algorithm used to find squares in 2D RLE is not optimal, and possibly images could be compressed better.
  • Since compression doesn’t work well for images with too many different pixel colors, I added support for color reduction (quantization) taken from https://gist.github.com/1104622. Many desktop tools have better color reduction, so you might get better quality if you reduce colors on your PC using an image editing program rather than the internal tool.

Complete source code is available under the GPL at https://github.com/odednoam/image2html

In the zone (hacking the Denon AVR1905 to become multi-zone)

May 12, 2012 Leave a comment

Previously, on home improvement: I bought a Denon 1905 7.1 amplifier, to serve surround sound in the living room and stereo music to the kitchen.

To my horror, when I came home and turned it on, it didn’t have “Zone 2”.

WTF?! The product brochures I found on the internet said it has it. The product manual specified clearly how it should be operated. (well,

The remote didn’t have a “Zone 2” option on its mode selector, and the on-screen menu ended at option 24 (the manual I found on the internet says option 25 is “Power Amp Assignment” – that’s the one you use to switch between 7-channels and 5+2 channels). Argh!

The downside of buying an 8-year-old amp is, it lacks internet resources. It took an afternoon of internet searching before I found someone commenting,

“Sorry for flogging a dead horse, but doesn’t the 1905 Singapore version not have the Zone 2 capability? That’s what irritated me because I couldn’t really rely on reviews written by US reviewers. “

Which could either mean Denon models differ between territories, or that some local distributors are re-numbering the models. So I downloaded its service manual and opened it up to compare the board models, and they match: it really is a 1905. That’s frustrating, but also provides a glimmer of hope: Denon already issue 5-10 amplifier models each year, which is a lot. I bet they wouldn’t want to issue 3-4 times that number in models.

So I started reading the service manual thoroughly, and indeed, it has several (territorial) sub-models:

"Note: The symbols in the column "Remarks" indicate the following destinations. E3 : U.S.A. & Canada model; EU : U.S.A. model (AVR-785); E2 : Europe model; EK : U.K. model; E2A : Asia model; E1C : China model; EUT : Taiwan R.O.C. model"

Of course, the CPU and main boards are similar on all sub-models. One of the differences is the analog input board (INPUT-VOL), which seems – in the E3 model – to have additional relay switching the output going towards “surround back”, and twice the volume controlling components:

Comparison between the all-regions/E3 model of the INPUT-VOL board in Denon AVR-1905

So the use of the non-US sub-model of the amplifier would not allow me to control volume for Zone2, or the switching of the regular inputs (CD, DVD, AUX) to it. In my application, I want zone2 to be connected to computer audio, so I can have the surround-back bus permanently wired to the PC (by hooking the PC to the pre-amp output jacks which can also be used for input), and control the pre-amplified volume through the PC rather than through the amplifier. I just need to make the amplifier “think” that it is the US model.

As the CPU board is similar between all models, I was looking for a jumper or DIP switch that controls what sub-model it “thinks” it is. I took the amplifier apart and didn’t find such jumper, but did find a caption on the printed circuit board that specifies how the sub-model is determined:

Sub-model confiugration table printed on the Denon 1905 PCB AREA (57P) R216 R218
E3/BKEU 100K OPEN
E2/EK 100K 180K
GUT/G1C/G1K 100K 180K
N 150K 100K
Well, as they say in the treasure hunting biz, “X marks the spot”… All I need is to find and remove resistor R218. This requires some patience as it requires taking apart all of the boards in the amp (R218 hides on the lower side of the CPU board, which is hardest to reach). But once found, it can easily be taken off with a slight touch of a soldering iron.
AVR 1905 CPU board before modification AVR1905 CPU board after removing resistor R218
Before After
Putting it all back together and turning the amplifier on, and zone 2 works.
As mentioned before, input and volume selection from the amplifier controls does not have any effect on Zone 2 (while the amplifier lets you select input to be routed to Zone 2, it has no effect; volume control turns off the zone when turned all the way down to zero, and turns on to maximum volume when volume is raised above zero.
The AVR1905 now thinks it has zone 2 support

איפה לקנות רמקולים בארץ

(This post discusses Israeli consumerism, and is only available in Hebrew)

ההורים של אשתי רכשו דירה חדשה וביקשו את עזרתי בהכנת מערכת אודיו מרכזית שתנגן מוסיקה בחדרים. כמה פוסטים אחרים (זהירות, אנגלית) בבלוג זה מתארים את המערכת והפתרונות שאני עוזר להם ליישם. אבל נושא אחד שבו הגעתי לגילויים מרעישים ומרגיזים הוא נושא רכישת הרמקולים.

רמקולים, ומערכות היי-פיי בכלל, הם תחום צרכני רגיש. הנושא מורכב: עבור טכנופובים, יש יותר מדי התעסקות במערכות טכניות מורכבות; עבור מהנדסים יש יותר מדי התעסקות בפסיכופיסיולוגיה ותפיסה. ואחרי המורכבות, צריך להתמודד עם ים של אינפורמציה ודיסאינפורמציה שמפיצים אודיופילים, ועכשיו לך תבין אם לכבל מסוים יש צליל “חם” יותר או שמדובר בשטויות. ואם זה לא מספיק, הרבה אנשים מתקינים מערכות כאלה יחד עם שיפוץ הבית או קניית בית חדש, ורבים שמחים למכור באותה הזדמנות ציוד אודיו במחירים מתאימים (כלומר זולים יחסית לקניית בית, אבל יקרים יחסית לקניית ציוד אודיו) – זו תופעה שבולטת במיוחד ברמקולים “ארכיטקטוניים”, כלומר רמקולים שקועים בקירות, שאותם אנשים כמעט תמיד קונים בזמן שהם עושים שיפוץ או קונים בית. נראה לי שיש גם הטיות פסיכולוגיות נוספות שבאות לידי ביטוי, כמו התקווה של אנשים שהם ישמעו יותר מוסיקה עם המערכת החדשה (ומעטים אכן משנים את ההרגלים), וכתוצאה מכן נכונות להוציא על היי-פיי  סכומים שלא באמת תואמים את כמות השימוש שבאמת יעשו במערכות.

בקיצור, רמקולים זה לא גבינת קוטג’. ובכל זאת, כשההורים של אשתי קיבלו הצעת מחיר של 25,000 ש”ח לרמקולים ארכיטקטוניים (כחלק ממערכת אודיו ביתית שתעלה בסה”כ יותר מ-100,000 ש”ח), זה נראה לי ממש מגוחך. אז חיפשתי ב”זאפ” וגיליתי שעבור הרמקולים עצמם, הצעת המחיר הזאת לא יוצאת דופן לעומת מחירם של רמקולים כאלה בארץ. הייתכן שזה המחיר ה”הוגן” עבור רמקולים כאלה?

מסתבר שלא. בארה”ב, רמקולים זהים עולים הרבה פחות. לדוגמה:

  • רמקולים שקועים PolkAudio RC85i עולים בארה”ב, נכון ליום כתיבת הפוסט הזה, $140 (לפי google product search), שהם כ-520 ש”ח. בארץ לא פחוץ מ-2500 ש”ח (לפי זאפ). כמעט פי 5 מהמחיר בחו”ל.
  • רמקולים לגינה PolkAudio Atrium45 עולים בארה”ב $106, כ-400 ש”ח. בארץ לא פחות מ-2,450 שזה יותר מפי 6.

הדוגמאות האלה חלקיות, כי השוויתי פה רמקולים מדגם זהה שנמכר גם בארץ וגם בארה”ב. במקרים רבים, אי אפשר להשוות, כי בארץ מוכרים דגמים ישנים יותר מאלה שנמכרים עכשיו בחו”ל, ובכלל – מבחר הדגמים בארץ מצומצם למדי. הרמקולים שרכשתי עבור הסראונד זהים בתכונותיהם לרמקולים שהוצעו לי תמורת 3,500 ש”ח לרמקול, אך כלל אינם נמכרים בארץ (מסתבר שלא מביאים לארץ את הרמקולים השקועים של Pioneer). הם עלו לי $120 לרמקול – אם הייתי קונה בארץ הייתי משלם יותר מפי 7.

לייבוא רמקולים מארה”ב יש כמה השלכות. רמקולים זה גדול, אז זה לא בדיוק פריט שאפשר לבקש מהחברים שנוסעים לארה”ב שישימו במזוודה, בטח לא אם קונים 10 רמקולים. מצד שני, קל מאוד לייבא אותם במשלוח: הם שוקלים מעט, הם אינם דורשים אישור של מכון התקנים, ואם קונים אותם בשביל בית חדש או שיפוץ אז יש מספיק סבלנות לחכות כמה שבועות עד שיגיעו. את הרמקולים שקניתי להורים של אשתי, 10 במספר (5 רמקולים שקועים לסלון, 3 רמקולים תקרתיים ושני רמקולים לגינה) קניתי באמזון, ושלחתי לארץ דרך Ushops. השירות המצוין של ushops מאפשר לשלוח בדואר ים, שמגיע תוך חודש וחצי אבל עולה הרבה פחות. מכיוון שהרמקולים עולים יותר מ-$75 ליחידה, צריך לשלם עליהם גם מכס של 33% (הורדת המכסים המפורסמת של ביבי בעקבות ועדת טרכטנברג לא כללה רמקולים).

בסופו של דבר,  רכשתי 10 רמקולים מעולים, שהוצעו לי בארץ ב-25,000 ש”ח. שילמתי עליהם ל-Amazon.com סכום של 4159.45 ש”ח (כולל עמלת ההמרה של ויזה). משלוח ומכס עלו לי בסה”כ 2,625 ש”ח נוספים. הרמקולים הגיעו לפתח ביתי חודש וחצי אחרי שהזמנתי אותם, ובסה”כ שילמתי 6,785 ש”ח – כרבע מהצעת המחיר שההורים של אשתי קיבלו.

הערות

  1. אמזון לא תמיד הכי זולים. העדפתי לקנות אצלם כי אני סומך עליהם, כי הם לא עושים בעיות עם כרטיס אשראי ישראלי, וכי יש להם את המבחר הכי גדול כך שיכולתי לקנות את כל הרמקולים במקום אחד.
  2. את המשלוח לארץ עשיתי דרך ushops כי יש להם אופציה של משלוח בדואר ים, שלא היתה אצל המתחרים שלהם (בדקתי אצל mustop, אמריקן אקספרס ו-TNT). המחיר שלהם, בזכות המשלוח בים, היה נמוך מאוד. אני מתכוון להישאר לקוח שלהם – האתר שלהם מצוין, מאפשר עדכון און-ליין למצב החבילה, ולכל שאלה שהיתה לי קיבלתי תשובה בצ’אט. (זה נראה כמו פרסומת, אבל זה לא – אני לא קשור אליהם והם לא משלמים לי לכתוב את זה)

עוד הערות

  1. בעקבות החוויה המאוד-חיובית הזאת, קניתי עוד ציוד אודיו בשיטה הזאת. עשיתי משלוח של כל הכבלים האופטיים, הדיגיטליים (קואקס), האנלוגיים (patch cables) וכבלי הרשת שנחוצים למערכת מ-monoprice. הכבלים מאיכות מעולה ועלו יחד פחות מ-$50 כך שהמשלוח פטור ממכס ומע”מ. המשלוח עלה $26. גם על זה אני ממליץ.
  2. כדי לחווט את הרמקולים ברחבי הבית, קניתי גליל של 150 מטר כבל רמקולים מאיכות מעולה (14AWG). כבלים זה דבר כבד ולכן המשלוח כבר היה יקר יחסית, כ-$90 על כבל שעלה $140. בסה”כ שילמתי קצת פחות מ-900 ש”ח על הכבל והמשלוח שלו. כבל דומה היה עולה בארץ 1200-1500 ש”ח. אבל בדיעבד, אני מצטער שהתפתיתי לקנות כבל מאיכות כל-כך גבוהה; כנראה שההבדל באיכות בין כבל כזה לכבל שעולה רבע הוא בלתי מורגש לבני תמותה.

Cheap alternative to multi-zone audio amplifiers

In the home audio project I’m working on, I need to support 5 stereo audio zones (I guess earthlings would call it “rooms”). One of them is the living room, so I want to re-use the same speakers and amplifier I’m installing for the home theater system.

I wrote here a little bit about how I chose the home theater amp.

After spending some time on ebay, here’s what I found:

  • Multi-zone amplifiers (10, 12 channels etc) are very expensive. Not an option.
  • 5 stereo amplifiers is also not an option. Too wasteful in energy and space.
  • Surround amplifiers come in 3 flavors: 5 channels, 6 channels and 7 channels (“what about the dot-one” you ask? well, a “5.1” amplifier is almost always a 5-channel, and the 6th channel – LFE – is amplified by a dedicated subwoofer amp). There’s also 8 channel amps, but these are relatively new, so I couldn’t find any second-hand.
  • Two of the living room speakers double as speakers for the audio system, the other three are used only for home theater.

It’s easy to see, as my combinatorics TA would say, that the optimal solution is to use a 6-channel surround amp for 3 audio zones, and a 7-channel surround amp for another audio channel + the living room (switching between surround and stereo audio). Should be easy, and since I’m perfectly good with 10-year-old used amps (as I wrote here), should not be expensive.

So I bought a wonderful 2002 Marantz SR5200 6-channel amp for the first 3 zones. I hope the  cabinet will be strong enough to hold it, as it weighs a tonne, but it’s an excellent amp for my needs, which I bought for a mere 500ILS (about $130).

As for the 7-channel amp, after some reading I figured out a Denon 7.1 receiver will be a good choice: they all seem to have equal power to all channels (mostly 7x80w), they have analog fail-over when they don’t receive digital signal (which I intend to repurpose for automatic switching between TV and audio), and they support “Zone 2” – the ability to have it act as if it were a 5-channel amp and a separate 2-channel amp. And, used Denon amps are abundant, so it should be easy to find a good one in Tel Aviv.

And I did find a guy, here in Tel Aviv, who sells a Denon AVR1709. 500ILS ($130). Or, he thought he was. He was actually selling an AVR1905. No biggie, all I cared was it’ll have 7x80W and “Zone 2”. I didn’t care about the HDMI support of the 1709, and I hope I can manage without its automatic calibration.

Total expense: 1000ILS ($260).

HT amps are just wrong

I hate home theater amps.

Nothing personal, I just think they’re the paramount of bad UX. It feels they were designed for early adopters – audioholics, audiophiles and other types of geeks. People who want the super-huge 50-button remote control. People who wouldn’t be frustrated when their popcorn gets cold while they figure which preset they wanted to use for their movie (if they ever find the remote, anyway, because it’s hiding so deep inside the sofa cushions).

Huge amplifier remote from Yamaha Huge amplifier remote from Pioneer Huge amplifier remote from Onkyo Huge amplifier remote from Marantz Huge amplifier remote from Harman/Kardon

Anyway, my in-laws, who’s home is the victim of my multi-zone audio/home theater project, are not early adopters. They definitely don’t want a 50-button amplifier remote in their living room. I definitely don’t want them to have a 50-button remote, because 49 of those are the wrong key, and if any of them is pressed – they’d call me to fix it.

You don’t need to be a usability expert to figure out, that 90% of these buttons are redundant – the features people actually want to use on their HT systems are on/off, volume control and input switching. And maybe they can even do without the power control.

Now, you have your TV remote anyway, and it’s supposed to do input switching and volume control. Why can’t you use it?

I think this is an archaic leftover from the early days of home theater, when amps supported surround sound and TVs didn’t. So amps were in charge of input switching, and were wired between the sources and the TV. Of course, this meant the amps also needed to support video switching (and then HD video switching, and then HDMI… so people also needed to upgrade their amps every few years).

But today many TVs have “Variable digital surround output”, that goes through the TV’s input selection and volume control. So you can connect your TV directly to its sources, and connect its output to the amplifier. Now, the TV remote control does the input selection and the volume control, and 0% of the amplifier remote is actually used (just put it away!). How’s that for usability?

This opens up an interesting opportunity. Because, if you’re not using your amp’s video switching capabilities, you don’t care about HDMI 1.3 and 1080p video support. Hack, you can buy a top-quality 2002 amplifier instead of a mid-range 2012 model, and it will cost you much less.

The main disadvantage of this setup is if you want to use your amp for music, when the TV is off. If you’re dependent on the TV for input selection, you’d need to turn it on for selecting the audio source.

However, if you have only one audio source that you’d want to listen to when the TV is off, there is a solution. Most (maybe all) amps have automatic detection of digital inputs, and switch to analog inputs if they detect no digital signal. So if the TV is hooked to the digital input, and the audio system (CD? multi-zone audio server?) connected to the analog input, you can set up your amp to automatically switch between them when the TV is turned off and on.