LINUX.ORG.RU
ФорумTalks

Возможно ли выжигать рисунки на CD


0

0

Приветсвую всех!
Вот, меня вопрос заинтересовал - возможно ли выжигать рисунки на CD, чтоб их было
видно визуально на поверхности диска. Т.е. должны ли отличаться нули и единицы
записанные на CD визуально?
Сам я попытался для определения этого написать нехитрую программку, которая
вроде как определяет "полосатый" образ:

#include <stdio.h>
#include <stdlib.h>

#define MB *1024*1024
main()
{
    for (long long i=0; i<100 MB; i++)
        printf ("%c",'\0');
    for (long long i=0; i<100 MB; i++)
        printf ("%c",255);
    for (long long i=0; i<100 MB; i++)
        printf ("%c",'\0');
    for (long long i=0; i<100 MB; i++)
        printf ("%c",255);
    for (long long i=0; i<100 MB; i++)
        printf ("%c",'\0');
    for (long long i=0; i<100 MB; i++)
        printf ("%c",255);
    for (long long i=0; i<100 MB; i++)
        printf ("%c",'\0');
}

К сожалению запись файла созданного такой программой на CD-RW (уже до этого
многократно раз перезаписанного) ничего увидеть не позволила :-(
CD-R портить не охота, совсем чистого CD-RW у меня к сожалению нет - поэтому
ещё проверить как-то нет у меня возможности..

В общем хотелось бы узнать возможно ли всё же это..
★★★★★

Есть вроде спецтехнология, t@too, поддерживкается не всеми приводами, но вроде как работает в cdrecord. может рисовать произвольные рисунки.

Shaman007 ★★★★★
()

> запись файла созданного такой программой на CD-RW (уже до этого многократно раз перезаписанного) ничего увидеть не позволила

У CD-RW другой принцип - на нём не выйдет.

> возможно ли всё же это..

По идее, да. Видно же записанную часть на CD-R визуально. Вопрос только в том, насколько будут отличаться области "0" от "1".

watashiwa_daredeska ★★★★
()

Заинтриговал, скотина :) Сейчас попробую, запортачу одну болванку. Уверен на 95% что не получится.

K48 ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

> У CD-RW другой принцип - на нём не выйдет.
> По идее, да. Видно же записанную часть на CD-R визуально. Вопрос только в том,
> насколько будут отличаться области "0" от "1".

По этой идее и на CD-RW должно получаться - на нём записанную часть тоже визуально видно!

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от Reset

Да, почитал.. сейчас посмотрим, что мы сможем..

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от K48

Ну, не получилось, разумеется. Ничего не видно. Может в -audio режиме надо было записывать. BTW, поищи в man cdrecord слово tattoo.

K48 ★★★★
()
Ответ на: комментарий от unDEFER

>По этой идее и на CD-RW должно получаться - на нём записанную часть тоже визуально видно!

Не-а. Только ту часть, которая еще ___ни разу___ не была записана.

K48 ★★★★
()
Ответ на: комментарий от K48

> http://forum.ixbt.com/0031/006889.html

А всё же в самом деле правильно там написано!
Различается, но только при режиме записи audio и только те последовательности в
которых биты 0 и 1 чередуются с разной частотой (т.е. 00 и FF в самом деле не
различимы). И видно даже на CD-RW! (Но CD-R-ку одну я тоже успел запортить)..
Итого программка теперь такая:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MB *512
main()
{
char buffer[2352];

for (int o=0; o<3; o++)
{
memset(buffer, 0, 2352);
for (long long i=0; i<100 MB; i++)
fwrite (buffer, 2352, 1, stdout);

memset(buffer, '\xAA', 2352);
for (long long i=0; i<100 MB; i++)
fwrite (buffer, 2352, 1, stdout);
}
}

Записывать надо cdrecord с опцией "-audio"
А чтобы увидеть надо удачно встать под искуственным источником света.

Всего получается 8 окружностей радиусами:
22.5 мм, 32 мм, 37.5 мм, 42 мм, 46.5 мм, 50.5 мм, 54.5 мм, 58.5 мм

Теперь надо бы рассчитать геометрию болванки.

Сейчас получается, что 115 MB ~ 400*pi mm^2

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от K48

кстати в моём man cdrecord ничего про это нет

unDEFER ★★★★★
() автор топика

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

dilmah ★★★★★
()
Ответ на: комментарий от unDEFER

>т.е. 00 и FF в самом деле не различимы

Я почему-то не фтыкнул, почему. 00 - восемь дырок подряд, FF - восемь непрожженных мест.
Почему так?

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

>кстати в моём man cdrecord ничего про это нет


              tattooinfo
                     Use  this  option  together  with  -checkdrive  to retrieve the image size information for the
                     Yamaha DiskT@2 feature. The images always have a line length of 3744  pixel.   Line  number  0
                     (radius  0)  is  mapped to the center of the disk.  If you know the inner and outer radius you
                     will be able to create a pre distorted image that later may appear undistorted on the disk.

              tattoofile=name
                     Use this option together with -checkdrive to write an image prepared for  the  Yamaha  DiskT@2
                     feature  to  the medium.  The file must be a file with raw image B&W data (one byte per pixel)
                     in a size as retrieved by a previous call to tattoofile=name .   If  the  size  of  the  image
                     equals  the  maximum possible size (3744 x 320 pixel), cdrecord will use the first part of the
                     file. This first part then will be written to the leftover space on the CD.

                     Note that the image must be mirrored to be readable from the pick up side of the CD.

K48 ★★★★
()
Ответ на: комментарий от unDEFER

Кстати, полоски увидел, прикольно :)

K48 ★★★★
()
Ответ на: комментарий от K48

> Я почему-то не фтыкнул, почему. 00 - восемь дырок подряд, FF - восемь 
> непрожженных мест.
> Почему так?

Оптика очевидно... Надо рассматривать этот вопрос со стороны оптики..

> Да, и насколько я понял, ничего осмысленного кроме колец ты выжечь не сможешь ведь
> физическое местоположение данного байта на болванке выяснить нельзя.

Ну почему же? Вот тело той же программы, но как видите теперь записываются 
круги так сказать шириной по 2 "Мб"..

       char buffer[2352]; 

        for (int o=0; o<152; o++) 
        { 
            memset(buffer, '\xAA', 2352); 
            for (long long i=0; i<2 MB; i++) 
                fwrite (buffer, 2352, 1, stdout); 

            memset(buffer, 0, 2352); 
            for (long long i=0; i<2 MB; i++) 
                fwrite (buffer, 2352, 1, stdout);
        }

Так, вот на радиусе ~54.5 мм отчётливо видно, что "зебра" кончается, а это значит, 
что именно там "дорожка" имеет как раз длину 2 "Мб".

Исходя из этих данных пишется примерно такая программа:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define MB *512

main ()
{
    int all=2352*600 MB;
    int c=0;

    int tr0=2352*460;
    float r0=24.5;
    float dr=0.075;

    int tr=tr0;
    float r=r0;

    while (c<(all-2352*512*3))
    {
        fprintf(stderr, "r=%g, tr=%g, count=%g\n",r,(float)tr/2352/512,(float)c/
        for (long long i=0; i<tr/2; i++)
            printf ("%c", '\xAA');

        for (long long i=0; i<tr/2; i++)
            printf ("%c", 0);
            //fwrite (buffer, 2352, 1, stdout);
        if (tr%2==1) printf ("%c", 0);

        c+=tr;

        tr=(float)tr*(r+dr)/r;
        r+=dr;
    }

    while (c<all)
    {
        printf ("%c", 0);
        c++;
    }
}


В идеале эта программка должна выжечь линию разделяющую болванку пополам..
Но к сожалению мои измерения и расчёты явно слишком грубы и..
Видно, что поверхность болванки не однородна - есть некоторый узор!
Так, что надо только подобрать или более точно измерить/вычислить параметры tr0, 
r0 и dr.. и тогда мы ещё пингвина на болванке выжгем :-)
Буду рад если, кто-нибудь тоже попробует.. Может есть какие-нить дома точные 
измерительные приборы..

> >кстати в моём man cdrecord ничего про это нет
>              tattooinfo

Да, правда нету (ASPLinux 10, Cdrecord-Clone 2.01-dvd)

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

> Оптика очевидно... Надо рассматривать этот вопрос со стороны оптики..

Скорее всего нет :) Видимо, кодируются переходы 0-1, 1-0. У меня под рукой нет описалова, так что не скажу точно.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

>Скорее всего нет :) Видимо, кодируются переходы 0-1, 1-0. У меня под рукой нет описалова, так что не скажу точно.

Там каждый байт кодируется кодом с добавлением избыточной информации. Вроде из одного байта получается 14 бит, причём таким образом, что более 3-4 одинаковых битов подряд отсутсвует, отсюда и неразличимость 0х00 от 0xFF.

Zak ★★
()
Ответ на: комментарий от unDEFER

Так, забудьте про мой предыдущий пост - ошибка там слишком сильна...
Благодаря статьям:
http://en.wikipedia.org/wiki/CD
http://www.cdrinfo.com/Sections/Articles/Specific.asp?ArticleHeadline=Writing+Qu
ality&index=1
http://en.wikipedia.org/wiki/Eight-to-Fourteen_Modulation
http://www.physics.udel.edu/wwwusers/watson/scen103/efm.html

Удалось выяснить значит, что
расстояние между дорожками - 1.6 микрометров
длина pit'ов - от 0.83 мкм (2 нуля) до 3.56 мкм (16 нулей)
значит один 0 имеет длину на дорожке около 0.42 мкм.
Учитывая также что первая дорожка имеет радиус около 24.5 мм и один байт 
кодируется 14-ю битами, получаем, что первая дорожка вмещает:
24.5мм * 2pi / 0.42 мкм / 14 ~ 26000 байт ~ 11 секторов аудио данных (1 сектор=2352 байт)

Для проверки и может быть уточнения данных был создан образ с перемежающимися 
областями \x00 и \xAA по 8 секторов:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define MB *512

main()
{
       char buffer[2352]; 

        for (int o=0; o<38 MB; o++) 
        { 
            memset(buffer, '\xAA', 2352); 
            for (long long i=0; i<8; i++) 
                fwrite (buffer, 2352, 1, stdout); 

            memset(buffer, 0, 2352); 
            for (long long i=0; i<8; i++) 
                fwrite (buffer, 2352, 1, stdout);
        }
}

И на диске где-то на 40.5 мм от центра чётка видна некоторая область явно
отличающаяся от того что идёт до и после неё. Именно в этой области происходит 
поворот спирали (именно там объём данных вмещаемых дорожкой равен 16 
секторам).
Более того, по характеру этого перехода я смог определить что лазер движется по 
диску по часовой стрелке (позвонил брату - он подтвердил, что в CD-плеере диск 
вращается по часовой стрелке).

В общем осталось дело совсем за малым :-)

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

2unDEFER Respect!
Если удастся выжигать осмысленные картинки на cd, не используя специально заточенные под это приводы, будет очень здорово

anonymous
()
Ответ на: комментарий от anonymous

Спасибо большое, респекты прибавляют вдохновения :-)

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define MB *512

main ()
{
    int all=2352* 612;
    int c=0;

    int tr0=23000;
    double r0=24.75;
    double dr=0.0016;

    int tr=tr0;
    double r=r0;

    while (c<(all-tr))
    {
        fprintf(stderr, "r=%g, tr=%g, count=%g\n",r,(double)tr/2352/512,(double)c/1024/1024);

        int asize=tr/4;
        for (long long i=0; i<asize; i++)
            printf ("%c", '\xAA');

        for (long long i=0; i<(tr-asize); i++)
            printf ("%c", 0);

        c+=tr;

        r+=dr;
        tr=(double)tr0*r/r0;
    }

    while (c<all)
    {
        printf ("%c", 0);
        c++;
    }
}

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

Следующий код "нарезает" спираль ориентированную против часовой стрелки и 
хорошо различимую уже на всей поверхности диска:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

char buffer[2352];
int c=0;

void bw (char b)
{
    buffer[c++]=b;
    if (c>=2352)
    {
        fwrite (buffer, 2352, 1, stdout);
        c=0;
    }
}

#define MB *512

main ()
{
    int all=2352* 612 MB;
    int c=0;

    int tr0=23070;
    double r0=25.00;
    double dr=0.00152;

    int tr=tr0;
    double r=r0;

    while (c<(all-tr))
    {
        fprintf(stderr, "r=%g, tr=%g, count=%g\n",r,(double)tr/2352,(double)c/1024/1024);

        int asize=tr/4;
        for (long long i=0; i<asize; i++)
            bw ('\xAA');

        for (long long i=0; i<(tr-asize); i++)
            bw (0);

        c+=tr;

        r+=dr;
        tr=(double)tr0*r/r0;
    }

    fwrite (buffer, 2352, 1, stdout);

}

Сейчас я могу совершенно определенно сказать, что параметр dr должен лежать в 
пределах 0.00152-0.00153 :-)
Что ж.. будем выпрямлять далее..

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

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

anonymous
()

А нафига? :)

Мы как-то, от нечего делать, на Ямахе Нерой рисовали, да вот толку - что от прозрачных менюшек... :)

fagot ★★★★★
()
Ответ на: комментарий от fagot

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

Не, к сожалению у меня нет возможности сфотографировать..

> да вот толку - что от прозрачных менюшек... :)
Ну, вот видите - сами всё понимаете ;-)

Да, к сожалению с нижней гранью dr я ошибся из-за чего записал кучу лишних образов и потратил более 2 часов времени напрасно :-(
Ну, ничего сейчас граница dr у меня предполагается в районе 0.001519-0.00151920, и вторая граница уже очень близка..
Буду мучать дальше.. лишь бы привод не сдох..

Жалко, конечно, что никак нельзя избежать этого шифрования 8-к-14.. Из-за этого мы максимум можем поддерживать всего 5 градаций яркости..

unDEFER ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.