Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции из dll 
:(
    Опции темы
Kationchic
  Дата 8.4.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Есть функция перевода изображения в полутона:

Код

function img2gray(img:TBitmap):TBitmap;
var I: PRGB;
    coef: array[0..2] of extended;
    x,y: integer;
begin
    coef[0]:=0.2989; coef[1]:=0.5870; coef[2]:=0.1140;
    for y:= 0 to img.Height-1 do
    begin
      I := img.ScanLine[y];
      for x:= 0 to img.Width-1 do
      begin
        I[x].rgbtRed  :=check(round(I[x].rgbtRed*coef[0])+round(I[x].rgbtGreen*coef[1])+round(I[x].rgbtBlue*coef[2]));
        I[x].rgbtGreen:=I[x].rgbtRed;
        I[x].rgbtBlue :=I[x].rgbtRed;
      end;
    end;
    result:= img;
end;


Если я вызываю её просто из модуля она хорошо работает... но если вызываю её из dll, начинает громко ругаться матом. 
Что делать?
PM MAIL   Вверх
Wolfgan
Дата 8.4.2008, 10:59 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2008

Репутация: нет
Всего: нет



Ты почитай как правильно вызывать функцию из DLL. Точно не помню, но там нужно помоему с директивой stadartcall вызывать.

Это сообщение отредактировал(а) Wolfgan - 8.4.2008, 11:00
PM MAIL   Вверх
Kationchic
Дата 8.4.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Вызываю правильно - остальные функции пашут, но именно эта - нет
PM MAIL   Вверх
Mikh@il
Дата 8.4.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Твоя функция использует еще функцию check, которая ведет контроль выхода за пределы [0..255].  Про нее ты ничего не написал где она храниться, откуда вызывается. А ошибка твоя скорее всего в том, что вызываемая функция не может найти твою вторую check.
PM MAIL   Вверх
Kationchic
Дата 8.4.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



=( Закоментировала совсем вызов этой функции - все равно вылетает...
Я думаю, что летит на I := img.ScanLine[y]; потому что битмап как-то косо передается... но не знаю как это наверняка проверить или как обойти....
PM MAIL   Вверх
Mikh@il
Дата 8.4.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Кстати для корректной работы твоей функции изображение должно быть 24bit.
т.е.  Pixelformat:=pf24bit.

Есть такое в твоем коде?

PM MAIL   Вверх
Kationchic
Дата 8.4.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Нет, спасибо, что сказали - сейчас вставлю

Добавлено через 6 минут и 15 секунд
Вставила :
Код

if (img.PixelFormat<> pf24bit) then exit;

от ошибки не спасло
PM MAIL   Вверх
Alexeis
Дата 8.4.2008, 11:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



  Мдя... очередной раз не заметили граблей  smile . Объекты нельзя передавать из Dll или в Dll. Все это строго запрещено. Можно только COM/ActiveX получать интерфейс объекта либо использовать bpl.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Kationchic
Дата 8.4.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Но у меня есть функция в той же длл
procedure   doScaled(var img: TImage; sc: extended);
и она работает!


PM MAIL   Вверх
Mikh@il
Дата 8.4.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Сделай так:
Код


function img2gray(img:TBitmap):TBitmap;
var I:PByteArray;
    x,y: integer;
 function Set255(z:integer):integer;
  begin
   if z>255  then result:=255  else
     if z<0 then result:=0 else result:=z;

  end;
begin
     img.PixelFormat:=pf24bit;
    for y:= 0 to img.Height-1 do
    begin
      I := img.ScanLine[y];
      for x:=1 to 3*img.Width-1 do
      if (x mod 3=0) then
      begin
        I[x-3]:=Set255(round(0.11*I[x-3]+0.5870*I[x-2]+0.2989*I[x-1]));
        I[x-2]:=I[x-3];
        I[x-1]:=I[x-3];
       end;
    end;
end;




Вызов функции:

Код


img2gray(Image1.Picture.Bitmap);
 Image1.Refresh;


PM MAIL   Вверх
Kationchic
Дата 8.4.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Спасибо
PM MAIL   Вверх
Alexeis
Дата 8.4.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(Kationchic @  8.4.2008,  11:07 Найти цитируемый пост)
Но у меня есть функция в той же длл
procedure   doScaled(var img: TImage; sc: extended);
и она работает! 

  Это ровным счетом ничего не значит. Строго запрещено, как раз потому что последствия очень сложно предугадать. В одном месте сработало, а в другом сдохло. Так оно будет всегда, и без всякой причины. То там то тут AV. Приятного вам  smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 8.4.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Kationchic @  8.4.2008,  12:07 Найти цитируемый пост)
Но у меня есть функция в той же длл
procedure   doScaled(var img: TImage; sc: extended);
и она работает! 

просто повезло... если вдруг внутри метода создаются и/или уничтожаются объекты - то огребешь граблей


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Kationchic
Дата 8.4.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Ясно... спасибо за информацию.
PM MAIL   Вверх
pseud
Дата 9.4.2008, 11:44 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Kationchic @  8.4.2008,  12:44 Найти цитируемый пост)
Ясно... спасибо за информацию.


и все же и я выскажусь.

предлагаю передать картинку через строку.

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  strmString: TStringStream;
  s: string;
begin
  strmString := TStringStream.Create('');
  try
    Image1.Picture.Bitmap.SaveToStream(strmString);
    s := strmString.DataString;
    // посылаем эту строку в нашу функцию
    // там в обратную сторону получаем TStringStream
    // из него - TBitmap
    // обрабатываем и возвращаем из функции тоже строку
    // которою -> TStringStream -> TBitmap
    // отображаем в нашем Image
  finally
    strmString.Free;
  end;
end;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.