Introduction: Burning Visible Images Onto CD-Rs With Data (beta)

Picture of Burning Visible Images Onto CD-Rs With Data (beta)

By carefully choosing the right 1s and 0s to burn to a CD, it is possible to burn visible images on normal CD-Rs. These images rely on the fact that the 1s and 0s created by pits in the CDs surface reflect light differently.

Step 1: Learn How CDs and CD-Rs Work

Data on a CD, or any optical media, is stored as a sequence of pits of varying lengths. To be precise, a 1 is represented by the change from pit to no-pit or the change from no-pit to pit, and a 0 is represented by no change in height (pit to pit or no-pit to no-pit). The pits and no-pits reflect different amounts of light; thus it is possible to draw images on CDs by appropriately arranging these 1s and 0s.

How do you arrange the 1s and 0s? It helps to know that the data is written along a spiral that starts from the center of the CD and spirals outward in a clockwise direction. The length of each bit is a fairly precise value (more on this later), and the pitch of the spiral, or the distance between successive spirals, is also a fairly precise value. Thus, using some math and some guesswork, it is possible to create a mapping from the nth bit in your data to an x,y coordinate.

Now we really have to look under the hood of CD data storage to figure out how to tell the CD writer to write a 0 or 1 for the nth bit. Data is organized as a sequence of sectors, each of which is 2352 bytes long. The data within each sector is organized in a particular way depending on what type of CD your are dealing with (data, audio, etc...). The most "raw" type of organization is known as "mode 2." Mode 2 does away with many of the nice things about CDs like error correction, but it gives us the most control over the bits. In a mode 2 sector, the first 12 bytes contain "syncing" data and the next 4 contain specific information about the sector. These bytes cannot be changed at the software level. (Maybe it is possible to write a driver that could change these?) The next 2336 bytes are free to be anything though. If this were all that happened to the data, our job would be easy. Unfortunately, there's a lot more data manipulation before the data actually gets written to the CD.

First, the data in each sector is "scrambled" by which we mean it is run through some math function which is supposed to "whiten" the data (i.e. keep the average height of the data on the CD half-way between pit and no-pit).

Second, the data is sent through a CIRC encoder, which applies some error correction codes.

Finally, the data is sent though an eight-to-fourteen modulator (EFM). This maps each 8-bit byte to a 14-bit sequence. This is to prevent long sequences of 0's (no change in height) which are hard for the CD drive to read.

The point is: drawing pictures on CDs is possible, so it should be done.

For a more complete (but still at some times cryptic) explanation of CDs, check out the freely available ECMA-130 specification.

Step 2: Convert a Picture to Data

Here are the MATLAB programs that I use to convert an image to a data file.

Use the freely available cdrecord program in "mode 2" to burn the data to a CD-R.

Step 3: Calibrate Your CD-Rs

Picture of Calibrate Your CD-Rs

Each brand (or maybe even set) of CD-Rs has slightly different properties such as track pitch or linear scanning velocity. Before successfully drawing a picture, it is necessary to determine what these values are. To do this, create a data file which represents a radial line. Draw this to the CD-R, and you may get a spiral. Now it's time for the guesswork. Try to change the values, to convert this spiral back into a radial line.

Step 4: Draw a Picture!

Picture of Draw a Picture!

Here I've shown a CD-R with a picture of two people kissing burned on it. It's a little hard to discern because I haven't completely calibrated this CD-R yet.


ttran19 (author)2015-06-07

This sounds like a very fascinating project.

If I could find out details about how DVD data is written, i could probably hack out something in Python that will convert an image to a data file that can be written to a DVD, since a DVD might give better resolution than a CD (my excuse is i got a bunch of blank DVDs on hand but no CDs). I would love to see this project pursued more.

animedubbedonline (author)2013-09-09

really nice

aidanjarosgrilli (author)2013-06-26

with this thingy, can you still burn normal files to the disk?

jhunt16 (author)2013-05-02

i'd love to see this project come out of beta, it's a genius idea

koduor (author)2011-06-05

nice idea.....

;) (author)2007-03-21

HIIIIIIIIIIIIIIII, I found something cool out i dont know how it works though or how you would use it. 1. in microsoft paint make an image you like 2. save it to desktop 3. go to note pad 4. go to open and click all files then find and open it 5. it should come out in a very long pattern with a lot of y's 6. figure out some way to write that to the cd I cant really do this so if someone could please post a "REPLY" to this comment!! thanks!! - ;)

koduor (author);)2011-06-05 as .dat....then burn as data cd with nero.interesting.

kainino (author);)2007-05-23
What you saw in MS Paint is just notepad trying to read what is really a series of hexadecimal numbers, for example:
if FF is white, 00 is black, and 01 means to go to the next line,
represents a small image of the letter A. This only indicates lines of black and white, so what you see here is already being used by the program.

P.S. That string of numbers works as follows:
which becomes this when splitting bytes apart with spaces:
FF 00 FF 01 00 FF 00 01 00 00 00 01 00 FF 00
then, converting 01 to a new line, 00 to #, and FF to a space:
 # # ##### #
and you should be able to read the letter in that.
temosis (author)2010-06-05


laernmoer (author)2007-05-06

if you ever got this algorithm down, you probably could make the whole disk an image - you would need to calculate the write pitch, the spacing, and the rough location of every bit on the disk, but it would be possible. I guess you'd have to look at how the FAT writes everything to the disk, each bit position on the disk could potentially be a pixel. Sounds like a lot of work, but it could be cool if you could get it to work.

qwertyzzz18 (author)laernmoer2010-01-20

CDs don't use FAT, the youse ISO 9660, more commonly known as CDFS

TATcreator (author)2009-05-06


Shellard (author)2008-10-13

ok i have all the codes i got matlab, and i have my monochrome image with the right dimensions, what do i do with the image? dont i have to put a link to it somewhere?? im so confused

spinach_dip (author)2006-07-30

How can I get this to work with octave? I don't and never will own Matlab, so I need to run it in octave, anyone know how? Or maybe it could be rewritten in C?

spinach_dip (author)spinach_dip2006-07-30

Figured it out, but it doesn't work:

octave:1> img2cd('logo.gif')
n128sec = 1
error: invalid row index = 83
error: invalid column index = 142
error: evaluating binary operator `<' near line 176, column 25
error: if: error evaluating conditional expression
error: evaluating if command near line 176, column 5
error: evaluating for command near line 174, column 3
error: evaluating for command near line 156, column 1
error: called from `img2cd' in file `/home/pabs/img2cd.m'

Any idea how to fix this?

bomholt (author)spinach_dip2006-11-11

In octave try:

octave:1> img = imread('sohv.jpg')
octave:2> img2cd(img)


dombeef (author)bomholt2008-09-30

does it work

tubbychick3n (author)2008-08-04

can someone help me? can this be done with a normal dvd burner? how do i run the software?

i just want to know if there is anywhere that i can download the software used to do this

sniper120 (author)2008-08-03

>> Important <<

Talking about a C/C++ ver, this code is easy to read and understand to a c++ programer(noob or pro!). It would be easy to convert it.(open in free SCITE to read it first!)

C++ Code simplified (I am a noob at C!)

< Start >

/* Simple C++ code convertion for matlab code */


This is the base of the C code you would need. You would have to xor the data. Note: Looked for C++ BITXOR/XOR function but could not find any!

"this sequence of bytes is xored with the bytes of sector to "scramble" the data" --matlab code

Then setup the calabration for the type or brand of CD used. Get the center radius and other things. The comments were not clear in the program!

There was picture adjustment code to make the picture as it was on the computer screen.

"i came up with these fudge factors to attempt to straighten my picture. they work OK for my CD-Rs.they probably won't work for yours" --matlab code

Then write the image to 1/0 bits as a file. The matlab code tried to write at 128 sectors( A second?)

>>>>> NOTE: Most of the code in the MATLAB is math! The C++ code would be much better to read and less lines! <<<<<


#include <stdio.h>

int main ()
FILE * CDfile;
/* First lines of the MATLAB code I can't get about the Xor :( */
char code[] = { The Code };
/* State the variable || (Below) open the file on the CD to be writen to. */
CDfile = fopen ( "f:/temp/" , "wb" );
/* Write the data (file) to the CD */
fwrite (code , 1 , sizeof(code) , CDfile );

Sorry! I don't know how to write it to the CD (fwrite?). . Close the file (below code).

fclose (CDfile);
return 0;

/* This takes much more time to read, then to load (My website) ! */

< End >

I hope that C++ pro will take this on!

whopoder (author)2008-02-29

My God! Long time... This project is Abadonned! Was a good idea, not good instructions, but really good proj...*

A.C.E. (author)2008-02-23

i dont know where to get cdrecord from, can anyone give me a link?

denilsonsa (author)2007-12-13

I know that photographing a CD surface probably is tricky, but couldn't you try to take better photos? It is almost impossible to see anything on those. I haven't tried to download those files yet, but do we need both C compiler and MatLab/Octave to make this? Or just C would be enough? What tools are needed? (I guess most of these questions will be answered whenever this instructable leaves the beta stage)

Soksume (author)2007-11-25

umm noob question but how do i save these or what ever it just redirects me to som crazy html doc when i click

jonnxt (author)2007-08-16

you sould make a c++ version!!!

creedtv (author)2007-08-15
whopoder (author)2007-07-19

Well, I'm new on C language. Dev-cpp:

error: syntax error before '=' token
img2cd.c:7:1: warning: "RAND_MAX" redefined
In file included from img2cd.c:3:
stdlib.h:29:1: warning: this is the location of the previous definition
img2cd.c: In function `main':
img2cd.c:53: error: `PICTURE_X' undeclared (first use in this function)
error: `PICTURE_Y' undeclared (first use in this function)

error: `f1tof2Frame' undeclared (first use in this function)

At last... Have I to put something after {(at the end)?

static unsigned char picture[PIC_HEIGHT][PIC_WIDTH] = {

Don't kill me XD

winkman (author)2006-08-24

And I haven't got a copy of MATLAB... And won't... Is there another way i can do it? It looks SUPER-DUPER cool, and i'd LOVE to be able to do it... :) If someone has a suggested way that i could do it without having to buy software, that'd be GREAT! Mitch

If the Matlab code is pretty generic, it might work in Octave, which is the open source project to handle much of what Matlab does. IIRC, you can get octave for Win32, Linux, and Mac.

lyallp (author)2007-05-15

It's called Lightscribe.
A lot of CD/DVD burners nowadays have the ability.

Erik Andersen (author)lyallp2007-06-22

Light scribe burns the other side of the CD. You are writing the data side when you use this method. When you use lightscribe, you use the label side :)

rgbphil (author)2006-09-08

Hope this helps with the hologram on a disk dream....but heres a link to a synthetic hologram maker program in Java....don't know if it works, but apparently you can get some basic results using 600dpi transparencies....surely a CD can give higher resolution.

VIRON (author)rgbphil2007-06-04

There is a method for making holograms either by hand or
mechanically, at or google "hand-drawn holograms",
and also some instructables on it. If you can do the math AND
burn the curves with this instructable's way, you can Make all the
holograms you want.

Suggestions: Holographic and/or digital sundial CD!
or, CD clock with 3D numbers and hands, using a quartz movement.

WIth c being enough points between 0 and 2 x pi, and radius r
x= r cos(c) ; y=r sin(c) makes circular fresnel curves,
and r determines the depth or projection distance of the image.
This then has to be remapped onto the CD using similar math,
converting voxel coordinates to pits bit and byte addresses.

A second conversion is needed to try to find the tracks and bytes
of every hologram pit burnt on the surface of the disc relative
to the center, using polar coordinates instead of x,y.

"for" all x and y that x2+y2=r2 is the pythagorean theorem way
to do the same thing... both maths are useful for triangles and
circles also. I hope you know a good geometry teacher if you
need help.

Don't fear the math, it just does what you can easily do by hand
with a coaster and a double pointed circle making compass,
when you make "hand drawn holograms". And if you can doodle
a video game on graph paper, that's related too, to where your
pixels are when you're laser burning your own hologram coaster.

reubensammut (author)2006-08-28

Hey, Nice instructable mate. I'm having problems about the raw file system. Do I have to use a cd burning program like nero and burn the file as data or do i have to do otherwise? Thanks Reuben

argon (author)reubensammut2006-08-29

I used cdrecord, which is freely available and open source.

ahf2009 (author)argon2007-05-27

Hi Argon, I'm working in a electronic experiment that needs to make a very accurate pits pattern on a cd, i run your matlab code, works fine! I will be very pleased if you post your new version code. Are you doing exactly that ECMA130 says? How did you made EFM code turn binary images? Thanks!

argon (author)ahf20092007-05-30

Hi, I'll post the updated code... but I haven't worked on this project in a while, so I don't remember what the c code's status is. I believe I'm doing exactly what ECMA130 says, but it's not the clearest standard in the world....

choppahead (author)2006-01-31

Any idea how to correct his error? I've never used MATLAB and I'm new to programming, so I'm a little lost. I figured out how to run the code and parse the input in, but I have no idea how to get around this error. I'm using a black and white, 142x83 JPG...

??? Attempted to access img(83,142); index out of bounds because size(img)=(1,9).

Error in ==> img2cd at 176
if img(ny(k), nx(k))<128

kainino (author)choppahead2007-05-23

Try, in this order, these two things: 1. Convert your image to a monochrome bitmap (BMP). You should be able to do this by opening the old image with MS Paint and "save as"-ing. It is unlikely that JPEG compression is built into the program. 2. The error message seems to indicate that the image may be too big, so try reducing the size of the image.

no it's the beegee's!

a_d777 (author)2007-04-24

hey argon!!! well, i am not able to understand... can you please send me the images that you created??? if not, please give a little more details to me... regards, Avik

emgee (author)2007-04-19

How many tries has it taken people to get the images aligned properly?

BFeely (author)2007-04-18

"The most "raw" type of organization is known as "mode 2." Mode 2 does away with many of the nice things about CDs like error correction, but it gives us the most control over the bits. In a mode 2 sector, the first 12 bytes contain "syncing" data and the next 4 contain specific information about the sector. These bytes cannot be changed at the software level. (Maybe it is possible to write a driver that could change these?) The next 2336 bytes are free to be anything though. If this were all that happened to the data, our job would be easy. Unfortunately, there's a lot more data manipulation before the data actually gets written to the CD." If I am not mistaken, most newer CD-R burners have a "RAW" mode that allows full control over the whole 2352 byte sector, and in some cases even the 96 byte subchannel code.

ooger (author)2007-03-25

Hello I'm using Matlab 7.1.

when i try to run img2cd i get:

EDU>> img2cd

n128sec =


??? Input argument "img" is undefined.

Error in ==> img2cd at 176
if img(ny(k), nx(k))<128

;) (author)2007-03-21

i dont know if it works eather so be willing to waste a cd... for the greater good...

!Andrew_Modder! (author)2007-02-16

Man!! Sweet!! this is very cool. But is there a way i could do it ""in the easy"" (i have basic programming skills :-( )

PeterTheUnGreat (author)2006-03-23

Is this how Sony get the logos on the data side of thier PS2 game discs? Pete

No they buy the cds with serial numbers, and bladebla on them. :-)

I don't think so, since it is in the middle part where there is no data.

dirtysanchez (author)2007-01-15

To get the script (the programming you downloaded) to run, you must enter it into the right filepath that your working in (the subfolders which matlab accesses). (Type filepath in help for a better explanation) Also, you didnt say which matlab version you're working on...matlab 6 has trouble loading stuff written on matlab 7 (its backwards compatiable but you need to specify in the script - I dont know if he did since I havent read the script). If he didnt specify, and you have matlab 6 ... there are some workarounds but you need to know matlab.. Also, im assuming that the function's name is the same as the m-files name. If you dont have matlab 7, download it torrent it or go into any college/university's bookstore (they sell it for $100 - way, way cheaper than a commerical version) - check for more info about the workarounds, filepath, etc. Hope it works for ya!

About This Instructable




More by argon:Installing a new water pump on a '95 Ford TaurusBurning visible images onto CD-Rs with data (beta)Two-speed bike without a gear shifter
Add instructable to: