Форум: "Начинающим";
Текущий архив: 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.004 c