![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Си и Delphi [D7, XP]
DmitriyR © (2009-04-02 12:24:00)Есть код на Си:
{
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) & 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;
Знающие подскажите как доделать недостающее, и правильно ли я переделал имеющееся?
Игорь Шевченко (2009-04-02 19:52:00) [1]
> тоесть все там номано.
ну парься тада
DmitriyR (2009-04-02 18:01:00) [2]
> а это вообще бред
несовсем, тоесть все там номано.
Код урезан но самое нужное тут.
В дате считаный файл, после прогона его енкодером Си-шным
получаю файл (картинка.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) & 0xFC;
colors[2] = (encoded >> 8) & 0xF8;
fwrite(colors, 1, 3, output);
}
}
fclose(output);
fclose(input);
Игорь Шевченко (2009-04-02 15:21:00) [3]
> 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
Игорь Шевченко (2009-04-02 15:19:00) [4]
> colors[0] = (encoded
KSergey (2009-04-02 15:15:00) [5]> Rouse_ © (02.04.09 14:42) [8]
> Сишный код полностью покажи, а то не понятно что есть data
из стартового поста
unsigned char data[1200];
Rouse_ (2009-04-02 14:42:00) [6]Сишный код полностью покажи, а то не понятно что есть data
clickmaker (2009-04-02 14:42:00) [7]> всмысле работает но не так как надо
а не потому что здесь
colors[2] := (encoded Shl 8) And $F8;
должно быть Shr ?
DmitriyR (2009-04-02 14:33:00) [8]clickmaker
Неработает :( всмысле работает но не так как надо :(
Есть кто в Си разбирается?
DmitriyR (2009-04-02 13:12:00) [9]И. Павел
Спасибо, но это понятно просто когда набирал поторопился.
И. Павел (2009-04-02 13:00:00) [10]for y := 0 to 30 do - цикл от 0 до 30
for (y=0; y < 30; y++) - цикл от 0 до 29
clickmaker (2009-04-02 12:54:00) [11]либо как-то так
encoded := PWordArray(@data[0])[((300-(y+1))*200)+x];
clickmaker (2009-04-02 12:47:00) [12]а, ну да, по 2 байта.
ну в принципе, чтобы не париться с указателями, можно так
encoded := data[((300-(y+1))*200)+x] or (data[((300-(y+1))*200)+x + 1] shl 8);
DmitriyR (2009-04-02 12:44:00) [13]Нет не опечатка работает ведь.
как я понял
encoded - word 2 byte
массив data - из 1 байтных
тоесть тут типо берет по 2 байта из дата и передает в ворд виде в енкодед?
clickmaker (2009-04-02 12:32:00) [14]encoded := data[((300-(y+1))*200)+x]; ?
не понятно, правда, зачем там приведение к указателю... может, опечатка?