Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 7
1

ScanLine работает некорректно

22.08.2012, 16:59. Показов 3155. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравсвтуйте, вот такая функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
TColor *ptr; 
 double D,l1,l2;
try
  {
    pBitmap->Assign( Form1->Image1->Picture->Bitmap);
    double h = pBitmap->Height;
    double w =  pBitmap->Width ;
    for (int y1 = 0; y1 < 100; y1++)
    {
     for (int y = 0; y < pBitmap->Height; y++)
     { 
      ptr = (TColor *)pBitmap->ScanLine[y];
      for (int x = 0; x < pBitmap->Width; x++) 
      { 
         l1 = sqrt(((w/2)-x)*((w/2)-x)+((h/2)-y)*((h/2)-y))  ;
         l2 = sqrt(((w/2)-x)*((w/2)-x)+(((h/2)-5)-y)*(((h/2)-5)-y))  ;
         l1!=0 ? D = ((l2)  -  ( l1)) / (l1) : D = 0;
         ptr[x] = RGB(D*100*y1,0,0);
      }
     }    
    Form1->Image1->Picture->Bitmap->Assign(pBitmap) ;
    Application->ProcessMessages();
    }
  }
  catch (...)
  {
    ShowMessage("Could not load or alter bitmap");
  }
}
Этот код выдает вот это:
http://s10.postimage.org/3p2dg1n1h/scanline.png

А должно быть вот такое (вывод через пиксели):
http://s10.postimage.org/3nsfmml7p/pixels.png

Я так понимаю какая-то ошибка в типах, из-за чего происходит неправильный сдвиг. Но где?
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2012, 16:59
Ответы с готовыми решениями:

ScanLine - свойство класса TBitmap->scanline[]
уважаемое сообщество не могу составить себе чёткое представление о ScanLine нет нигде толкового...

Flood Fill Scanline Stack - не работает
Приветствую! Передо мной стоит задача заполнения цветом какой-либо области. Написать реализацию...

Scanline в делфи, я не понимаю как она работает
Есть такая функция skyline в делфи, я не понимаю как она работает и как ее использовать, объясните...

Быстрее scanline, или почему SetBitmapBits работает "ИНОГДА"
Всем привет, у меня есть массив, и мне нужно его нарисовать.. Все начинается когда я использую...

24
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
22.08.2012, 17:18 2
А что делает этот код? Картинку как-то модифицирует?

Добавлено через 4 минуты
понял, смутил эта строка:
Цитата Сообщение от ofx Посмотреть сообщение
pBitmap->Assign( Form1->Image1->Picture->Bitmap);
чисто для взятия размеров нужна.


ofx
Я попробовал, у меня норм. Может что-то с драйверами?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 17:50 3
У меня выглядит так
Миниатюры
ScanLine работает некорректно  
0
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 7
22.08.2012, 18:02  [ТС] 4
Цитата Сообщение от kzru_hunter Посмотреть сообщение
А что делает этот код? Картинку как-то модифицирует?

Добавлено через 4 минуты
понял, смутил эта строка:

чисто для взятия размеров нужна.


ofx
Я попробовал, у меня норм. Может что-то с драйверами?
Да вроде нормально все с драйверами, работают.
Я создал заново проект, так он работает только при загрузке картинки из файла. Если этого не сделать, то ничего не происходит.
Так после загрузки картинки, выдает некорректное изображение только по-другому.

Вы бы не могли выложить код, который работает у вас?

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
У меня выглядит так
Это с кодом RGB(x,0,0) ?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 18:03 5
Залейте канву перед работой
C++
1
2
3
4
5
6
7
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Canvas->Pen->Color= clWhite;
Image1->Canvas->FillRect(Image1->ClientRect);
}
//---------------------------------------------------------------------------
Это с кодом RGB(x,0,0) ?
С тем кодом который вы выложили.
1
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 7
22.08.2012, 18:17  [ТС] 6
Цитата Сообщение от Avazart Посмотреть сообщение
Залейте канву перед работой
C++
1
2
3
4
5
6
7
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Canvas->Pen->Color= clWhite;
Image1->Canvas->FillRect(Image1->ClientRect);
}
//---------------------------------------------------------------------------
С тем кодом который вы выложили.
Щас попробую залить, но синяя картинка не может получиться. У меня меняется только красная составляющая, а на вашей картинке - она синяя.

Добавлено через 2 минуты
Залил как у Avazart, тоже синяя получилась.
Ерунда какая-то.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 18:19 7
Там я немного эксперементировал должно быть
C++
1
2
Image1->Canvas->Brush->Color= clBlack;
Image1->Canvas->FillRect(Image1->ClientRect);
0
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 7
22.08.2012, 18:27  [ТС] 8
Цитата Сообщение от Avazart Посмотреть сообщение
Там я немного эксперементировал должно быть
C++
1
2
Image1->Canvas->Brush->Color= clWhite;
Image1->Canvas->FillRect(Image1->ClientRect);
Результат-то один и тот же.

Вот что я добавил у себя:

C++
1
pBitmap->PixelFormat = pf24bit;
От этого получилась картинка черно-белая как в моем первом сообщении.
Т.е. проблема в том, чтобы правильно установить формат пиксела в картинке.
Но почему Билдер ничего не сообщает о некорректом преобразовании - непонятно.

я еще добавил вот что:
C++
1
ptr[x] = (TColor)RGB(D*100*y1,0,0);
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 18:34 9
Ну а что такое D ? И вообще непрозрачная конструкция
C++
1
l1!=0 ? D = ((l2)  -  ( l1)) / (l1) : D = 0;
Добавлено через 4 минуты
Но проблема в том что ScanLine не возвращает TColor*

C++
1
__property void * ScanLine[int Row];
1
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 7
22.08.2012, 18:37  [ТС] 10
Цитата Сообщение от Avazart Посмотреть сообщение
Ну а чо такое D ?

И вообще непроозрачная конструкция
C++
1
l1!=0 ? D = ((l2)  -  ( l1)) / (l1) : D = 0;
Так D - это какая-нибудь величина. Вообщем-то не важно. Просто двумерное поле значений.
Плюс в "Конструкции" идет проверка на деление на ноль. Вот как-бы так.

Я поэксперементировал с форматами пикселов (enum TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom};
),
корректной (красной) картинки так и не получил.

Подозреваю что RGB как-то не так работает.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 18:38 11
проблема в том что ScanLine не возвращает TColor*

Загляниете в хелп по ScanLine в Builder-e
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
22.08.2012, 18:42 12
Интересно, почему именно виноват код, а не драйвера или видеокарта?
Я уже наблюдал подобную картинку раньше.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 18:44 13
По тому что на двух разных компах работает одинакого.
А код с ошибками
C++
1
ptr = (TColor *)pBitmap->ScanLine[y];/* Опасно! */
0
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 7
22.08.2012, 18:51  [ТС] 14
Цитата Сообщение от Avazart Посмотреть сообщение
Но проблема в том что ScanLine не возвращает TColor*
Я взял за основу пример из справки, там написано вот что:
C++
1
ptr = (Byte *)pBitmap->ScanLine[y];
Добавлено через 5 минут
Целиком пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall TForm1::Button1Click(TObject *Sender)
 
{
  Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
// This example shows drawing directly to the Bitmap
  Byte *ptr;
  try
  {
    pBitmap->LoadFromFile("C:\\Program Files\\Common Files\\Borland Shared\\Images\\Splash\\256color\\factory.bmp");
    for (int y = 0; y < pBitmap->Height; y++)
    {
      ptr = (Byte *)pBitmap->ScanLine[y];
 
      for (int x = 0; x < pBitmap->Width; x++)
        ptr[x] = (Byte)y;
    }
    Canvas->Draw(0,0,pBitmap);
  }
  catch (...)
  {
    ShowMessage("Could not load or alter bitmap");
  }
  delete pBitmap;
}
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 18:52 15
На скорую руку так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <memory>       //for STL auto_ptr class
#include <cmath>
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
using namespace std;
 
auto_ptr<Graphics::TBitmap> Bitmap(new Graphics::TBitmap);
 
TRGBTriple *ptr;
 
Bitmap->PixelFormat = pf24bit;
Image1->Picture->Bitmap->PixelFormat = pf24bit;
 
double D=100,l1,l2;
 
try
  {
    Bitmap->Assign( Image1->Picture->Bitmap);
    double h =  Bitmap->Height;
    double w =  Bitmap->Width ;
 
    for (int y1 = 0; y1 < 100; y1++)
    {
     for (int y = 0; y < h; y++)
     {
      ptr = reinterpret_cast<TRGBTriple *>(Bitmap->ScanLine[y]);
 
      for (int x = 0; x < w; x++)
      {
         l1 = sqrt(((w/2)-x)*((w/2)-x)+((h/2)-y)*((h/2)-y))  ;
         l2 = sqrt(((w/2)-x)*((w/2)-x)+(((h/2)-5)-y)*(((h/2)-5)-y))  ;
 
         l1!=0 ? D = ((l2)  -  ( l1)) / (l1) : D = 0;
 
         ptr[x].rgbtRed= D*100*y1;
         ptr[x].rgbtGreen= 0;
         ptr[x].rgbtBlue= 0;
      }
     }
    Image1->Picture->Bitmap->Assign(Bitmap.get()) ;
    Application->ProcessMessages();
    }
  }
  catch (...)
  {
    ShowMessage("Could not load or alter bitmap");
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Image1->Canvas->Brush->Color= clBlack;
  Image1->Canvas->FillRect(Image1->ClientRect);
}
//---------------------------------------------------------------------------
Миниатюры
ScanLine работает некорректно  
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
22.08.2012, 19:11 16
Цитата Сообщение от Avazart Посмотреть сообщение
По тому что на двух разных компах работает одинакого.
вроде бы только у ofx некорректно выводится изображение.
у Вас тоже?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 19:59 17
вроде бы только у ofx некорректно выводится изображение.
у Вас тоже?
У меня синим выводит... у ТС тоже...

А у вас?
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
22.08.2012, 20:03 18
Цитата Сообщение от Avazart Посмотреть сообщение
у ТС тоже...
дану, он же говорил, что по-прежнему черное изображение
Цитата Сообщение от Avazart Посмотреть сообщение
А у вас?
у меня всегда синее было
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 20:05 19
Ну так...
Цитата Сообщение от ofx Посмотреть сообщение
Щас попробую залить, но синяя картинка не может получиться. У меня меняется только красная составляющая, а на вашей картинке - она синяя.

Добавлено через 2 минуты

Залил как у Avazart, тоже синяя получилась.
Ерунда какая-то.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
22.08.2012, 20:08 20
понятно, плохо читал,
а как ту получить, которая первая?
0
22.08.2012, 20:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2012, 20:08
Помогаю со студенческими работами здесь

Scanline
Здравствуйте, пытаясь понять принципы работы великого и ужасного Scanline,возникла проблема с...

ScanLine
всем доброго времени суток уменя такая проблема уже второй день жыву в гугле ищу информацыю отом...

Некорректно работает
Здравствуйте помогите пож-та с задачкой: Сформировать вещественный массив X1(N), N≤20,...

Do while работает некорректно
Не могу понять почему после умножения 2ух переменных я не могу ввести хочу ли я продолжить или нет....

Некорректно работает if
Здравствуйте. У меня проблема. Если я указываю такое условие: if ( (i != k) &amp;&amp; (j != l) ) то if...

Работа со scanline
Так и не смог разобраться как работать со scanline. Его посоветовали, т. к. GetPixel очень сильно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru