Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2009, 18:45   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Считываю цвета и получаю $FFFFFFFF..

Считываю цвета изображения обычным перебором:
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var
 X,Y:SmallInt;
 I:Byte;
 N:Array[0..15] of Integer;
begin
 For I:=0 to 15 do N[I] := 0;
 For Y:=0 to Image1.Height - 1 do
  For X:=0 to Image1.Width -1 Do
   Begin
   I:=0;
   While N[I]<> Image1.Canvas.Pixels[X,Y] do
    If N[I] = 0 Then N[I] := Image1.Canvas.Pixels[X,Y] Else
     Inc(I);
   End;
For I := 0 to 15 do If I>9 Then Memo1.Lines.Add(IntToStr(I)+' '+IntToHex(N[I],8)) Else
 Memo1.Lines.Add(' '+IntToStr(I)+' '+IntToHex(N[I],8));
end;
Нажал на батон и получил:
Код:
 1 00686868
 2 00707070
 3 00797979
 4 FFFFFFFF
 5 00474747
 6 00404040
 7 005A5A5A
 8 00393939
 9 003D3D3D
10 00747474
11 006D6D6D
12 00656565
13 00343434
14 00252525
15 00545454
Просто в шоке, откуда у имаджа такой цвет. Решил узнать координаты и посмотреть в пеинте:
Код:
procedure TForm1.Button2Click(Sender: TObject);
Var
X,Y:SmallInt;
begin
 For Y:=0 to Image1.Height -1 do For X:=0 to Image1.Width - 1 do
  If Image1.Canvas.Pixels[X,Y] = $FFFFFFFF Then ShowMessage(IntToStr(X)+' '+intToStr(Y));
end;
Нажал на батон... И тишина... Может кто-то может сказать, откуда такой "необыкновенный", несуществующий цвет?.

P.S. Посмотрел в отладчике. цвет в десятичном представлении = -1.
P.P.S. И элемент с индексом 0 почему то во второй функе не выводит.
P.P.P.S> Еще раз проехал отладкой, узнал координаты - 24,0. Посмотрел в пеинте - цвет определяется как RGB(112,112,112)
Вложения
Тип файла: rar Непонятки.rar (171.9 Кб, 12 просмотров)
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 18.11.2009 в 19:02.
Alex Cones вне форума Ответить с цитированием
Старый 18.11.2009, 19:03   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
"необыкновенный", несуществующий цвет
А вы уверены ? Как по Вашему, выглядит непрозрачный белый цвет в 32х битах ?

Еще, может над этим подумаите больше
Код:
I:=0;
   While N[i]<> Image1.Canvas.Pixels[X,Y] do
    If N[i] = 0 Then N[i] := Image1.Canvas.Pixels[X,Y] Else
     Inc(I);
А вдруг I станет больше 15 ?

Последний раз редактировалось BOBAH13; 18.11.2009 в 19:07.
BOBAH13 вне форума Ответить с цитированием
Старый 18.11.2009, 19:06   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

1) Это бмп (во вложении лежит)
2) У неё 256 цветный режим.
3) У этой картинки НЕТ БЕЛЫХ ПИКСЕЛЕЙ.
4) См. пункт P.P.P.S в посте 1.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.11.2009, 19:17   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну было просто открыть эту картинку в WinHex, и глянуть что там подавно нет 0xff а вот не послушали про I. Проверьте все тщательно. Возможно не правильное обращение по адресу, и начинается мусор появлятся.
BOBAH13 вне форума Ответить с цитированием
Старый 18.11.2009, 19:25   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
А вдруг I станет больше 15 ?
Не станет по одной простой причине - цветов там ровно 16. Тем более эта причина могла проканать, если б массив записывал этот элемент по второму кругу, но отладчик показывает, что он заполняется 5-м.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.11.2009, 19:35   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

У вас Image1.Height = 4 и Image1.Width = 4 ?

Еще вопрос, ну вот смотрю, и не могу понять... ну вот какой смысл того внутреннего цикла с while ? это, чтобы ваш код заберал больше квантов процессора ? Такая видимо была идея. Иначе можно еще один в самом начале for добавить, где переберали бы i от 0 до 15, и убрать то обнуление в начале. Действительно не вижу смысла в 50% кода

Что-то типа такого
Код:
For I:=0 to 15 do
 For Y:=0 to Image1.Height - 1 do
  For X:=0 to Image1.Width -1 Do
   Begin
    N[i] := Image1.Canvas.Pixels[X,Y]
   End;
Причем вывод, так же можно поставить сразу после N[i] :=

Последний раз редактировалось BOBAH13; 18.11.2009 в 19:38.
BOBAH13 вне форума Ответить с цитированием
Старый 18.11.2009, 19:36   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Нет. Но количество допустимых цветов было задано шопом.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.11.2009, 19:40   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
Нет. Но количество допустимых цветов было задано шопом.
Вы в курсе если высота или ширина больше 4, тогда произведение их будет больше 16, что привышает размерность вашего массива, и из чего следует, что когда дойдет 16и, ваш массив будет заполнен полностю, и тогда, как я понимаю, i вовремя while, достигнет 16 и выше... и тогда будет не красиво когда i = 16, и вы выполняите доступ к n[i]

ps. "шопом" - что за слово такое ?
BOBAH13 вне форума Ответить с цитированием
Старый 18.11.2009, 19:45   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Вы в курсе если высота или ширина больше 4, тогда произведение их будет больше 16, что привышает размерность вашего массива, и из чего следует, что когда дойдет 16и, ваш массив будет заполнен полностю, и тогда, как я понимаю, i вовремя while, достигнет 16 и выше... и тогда будет не красиво когда i = 16, и вы выполняите доступ к n[i]
Я в курсе, но я считаю не количество пикселей, а количество цветов, а их меньше. Посмотрите внимательно на цикл - он продуман и не переполнится, если количество цветов <= 16.

Шоп = Жаба = фотожаба = PhotoShop
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.11.2009, 19:59   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Я тут кое-что написал, прокомментируйте пожалуйста, так же с вниманием
Код:
for yx = 0 to 5 * 5 - 1 do // к примеру, битмап в 5х5 пикселей, что дает 25 пикселей размерность
// соотвественно уже не понятно, если смысл перегонки цветов в массив, то как массив из 15 элементов сохранит 25 ?

  i = 0 // ставим и начинаем с первого элемента, максимальное i = 15

  while n[i] <> cyx do // пусть текущий цвет cyx

    if(n[i] = 0) // логично, если n[i] еще пуст, то заполним, дальше выходит, что
// ну вот заполнили весь массив, а тут уже по счету (cyx) дает 17 пиксель, и что сейчас будет ?
   
      n[i] = cyx

// т.е. нам говорит, что 16й элемент не ноль, увеличиваем i, которое становится равным 16,
// что уже привышает размерность, и тут в цикл получается
// while n[16] <> cyx do, это нормально ?

    else
   
      i = i + 1; // т.е. если уже заполнили, идем дальше по массиву
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смена цвета. Stranger333 Общие вопросы Delphi 6 07.10.2009 21:14
Получаю сообщение "This file is used by the project manager only and should be treated like the project f fs444 C++ Builder 1 22.09.2009 11:05
Получаю хендл окна виндовского калькулятора Lich Win Api 8 01.07.2008 10:43
Формат цвета xTANATOSx Общие вопросы Delphi 14 02.11.2007 20:22
цвета Toxa Общие вопросы Delphi 3 20.04.2007 12:03