Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];

Вниз

Си и Delphi   Найти похожие ветки 

 
DmitriyR   (2009-04-02 12:24) [0]

Есть код на Си:
{
int y,x;
unsigned char colors[3];
unsigned short encoded;
unsigned char data[1200];

for (y=0; y < 30; y++) {
 for (x=0; x < 20; x++) {
  encoded = ((unsigned short *)data)[((300-(y+1))*200)+x];
  colors[0] = (encoded << 3) & 0xF8;
  colors[1] = (encoded >> 3) & 0xFC;
  colors[2] = (encoded >> 8) & 0xF8;
 }
}
}
Пытаюсь перевести его на дельфи:
var
y,x: integer;
colors: array[0..2] of byte;
encoded: word;
data: array[0..1199] of byte;
begin
 for y := 0 to 30 do
  for x := 0 to 20 do
   begin
    encoded := Вот тут я несовсем понимаю что происходит :(
    colors[0] := (encoded Shl 3) And $F8;
    colors[1] := (encoded Shr 3) And $FC;
    colors[2] := (encoded Shl 8) And $F8;
   end;
end;
Знающие подскажите как доделать недостающее, и правильно ли я переделал имеющееся?


 
clickmaker ©   (2009-04-02 12:32) [1]

encoded := data[((300-(y+1))*200)+x]; ?
не понятно, правда, зачем там приведение к указателю... может, опечатка?


 
DmitriyR   (2009-04-02 12:44) [2]

Нет не опечатка работает ведь.
как я понял
encoded - word 2 byte
массив data - из 1 байтных
тоесть тут типо берет по 2 байта из дата  и передает в ворд виде в енкодед?


 
clickmaker ©   (2009-04-02 12:47) [3]

а, ну да, по 2 байта.
ну в принципе, чтобы не париться с указателями, можно так
encoded := data[((300-(y+1))*200)+x] or (data[((300-(y+1))*200)+x + 1] shl 8);


 
clickmaker ©   (2009-04-02 12:54) [4]

либо как-то так
encoded := PWordArray(@data[0])[((300-(y+1))*200)+x];


 
И. Павел   (2009-04-02 13:00) [5]

for y := 0 to 30 do - цикл от 0 до 30
for (y=0; y < 30; y++)  - цикл от 0 до 29


 
DmitriyR   (2009-04-02 13:12) [6]

И. Павел
Спасибо, но это понятно просто когда набирал поторопился.


 
DmitriyR   (2009-04-02 14:33) [7]

clickmaker
Неработает :( всмысле работает но не так как надо :(

Есть кто в Си разбирается?


 
Rouse_ ©   (2009-04-02 14:42) [8]

Сишный код полностью покажи, а то не понятно что есть data


 
clickmaker ©   (2009-04-02 14:42) [9]

> всмысле работает но не так как надо

а не потому что здесь
colors[2] := (encoded Shl 8) And $F8;
должно быть Shr ?


 
KSergey ©   (2009-04-02 15:15) [10]

> Rouse_ ©   (02.04.09 14:42) [8]
> Сишный код полностью покажи, а то не понятно что есть data

из стартового поста
unsigned char data[1200];


 
Игорь Шевченко ©   (2009-04-02 15:19) [11]


>   colors[0] = (encoded << 3) & 0xF8;


а это вообще бред


 
Игорь Шевченко ©   (2009-04-02 15:21) [12]


> begin
>  for y := 0 to 30 do
>   for x := 0 to 20 do
>    begin
>     encoded := Вот тут я несовсем понимаю что происходит
> :(
>     colors[0] := (encoded Shl 3) And $F8;
>     colors[1] := (encoded Shr 3) And $FC;
>     colors[2] := (encoded Shl 8) And $F8;
>    end;
> end;


to 30 - 1
to 20 - 1


 
DmitriyR   (2009-04-02 18:01) [13]


> а это вообще бред

несовсем, тоесть все там номано.
Код урезан но самое нужное тут.
В дате считаный файл, после прогона его енкодером Си-шным
получаю файл (картинка.bmp) черезстрочка


> всмысле работает но не так как надо

потому что если в оригинале получаю катинку (черезстрочную) но полную
а в переработаном варианте получаю только ее часть с искаженным цветом.
(правильно говоря один угод 1/4 картинки с шагом через 3 строчки.)

Черезстрочка: 1строка пиксели рисунка, 2 пустая, 3 пиксели, 4 пустая и т.д.

Через 3 строчки: строка пиксели, 3 строки пустых, и т.д.


> Сишный код полностью покажи, а то не понятно что есть data

в коде перед циклами стоит чтение файла (тоесть в дата считывается файл закодированый).
после colors[2] следующая строка стоит запись в новый файл содержимого colors. тоесть на выходе получаю файл.bmp

вот почти полный код:

input=fopen("test.dat","rb");
fread(data, 1, datalen, input);
output=fopen("test.bmp","wb");
fwrite(bmphead1, 1, sizeof(bmphead1), output);
fwrite(&biWidth, 1, sizeof(biWidth), output);
fwrite(&biHeight, 1, sizeof(biHeight), output);
biSize = biWidth*biHeight*3;
fwrite(&biSize, 1, sizeof(biSize), output);
fwrite(bmphead3, 1, sizeof(bmphead3), output);
for (y=0; y < biHeight; y++) {
for (x=0; x < biWidth; x++) {
  encoded = ((unsigned short *)data)[((biHeight-(y+1))*biWidth)+x];
  colors[0] = (encoded << 3) & 0xF8;
  colors[1] = (encoded >> 3) & 0xFC;
  colors[2] = (encoded >> 8) & 0xF8;
  fwrite(colors, 1, 3, output);
}
}
fclose(output);
fclose(input);


 
Игорь Шевченко ©   (2009-04-02 19:52) [14]


> тоесть все там номано.


ну парься тада



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
15-1237325403
Юрий
2009-03-18 00:30
2009.05.17
С днем рождения ! 18 марта 2009 среда


2-1238769749
Кошкин
2009-04-03 18:42
2009.05.17
Как сделать проекцию на экран.


2-1238935538
random(1024)
2009-04-05 16:45
2009.05.17
Как из компонента TWebBrowser распечатать страничку...


2-1238737468
Roman88
2009-04-03 09:44
2009.05.17
Функция FileSize


15-1236072640
Дукам
2009-03-03 12:30
2009.05.17
Менеджер ресурсов в Дельфи 7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский