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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2016, 00:24   #11
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от vlad1389 Посмотреть сообщение
Если ты так уверен, что ошибок ни где нет, то как ты объяснишь ошибку, из за которой создал этот топик? Сама по себе появилась? Ошибка в твоём коде. В том, что ты предоставил, я ошибок не вижу. Значит ошибка в том коде, который ты не предоставил.
В том то и дело, что я не понимаю, что я делаю не так. Все компоненты очищаю. В debug никаких ошибок в помине нет. Даже try-except ни в одной функции нету. Просто появляется ошибка EOutOfResources - Error creating window device context. Грешу в сторону ReleaseDc. Приложение многопоточное. Представьте себе 100 потоков, которые 5 раз за каждый цикл работают со StretchBlt.

Последний раз редактировалось darkwellroad; 23.03.2016 в 00:27.
darkwellroad вне форума Ответить с цитированием
Старый 23.03.2016, 00:27   #12
vlad1389
Форумчанин
 
Регистрация: 02.02.2016
Сообщений: 290
По умолчанию

Цитата:
Даже try-except ни в одной функции нету
Плохо. Отличный способ выловить ошибку
vlad1389 вне форума Ответить с цитированием
Старый 23.03.2016, 00:28   #13
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от vlad1389 Посмотреть сообщение
Плохо. Отличный способ выловить ошибку
В каждом потоке ловлю.
Код:
procedure Thread.DecChThread(Sender: TObject);
var
  E: Exception;
begin
  Dec(ChThCount);
  if WorkC = True then
    begin
      E := ((Sender as TThread).FatalException as Exception);
      if E <> nil then
        ThreadError(E.ClassName + ' сообщает об ошибке ' + E.Message);
      Inc(ThreadErrCount);
      Thread.Create.FreeOnTerminate := True
    end;
  if ChThCount = 0 then
    CheckFormObject;
  Synchronize(SyncCount);
end;
darkwellroad вне форума Ответить с цитированием
Старый 23.03.2016, 01:17   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну вы можете использовать DIBitmap, и работать с пикселями напрямую и самостоятельно написать Resize.

вообще любопытно, какая ОС?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.03.2016, 01:25   #15
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну вы можете использовать DIBitmap, и работать с пикселями напрямую и самостоятельно написать Resize.

вообще любопытно, какая ОС?
10-ка
darkwellroad вне форума Ответить с цитированием
Старый 23.03.2016, 08:25   #16
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Если юзаешь VCL, почему бы не пользоваться TCanvas.StretchDraw()?
Попробуй, а вдруг?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.03.2016, 18:56   #17
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Написал свою мини-функцию. Работает отлично. Все только то, что мне нужно. Без всяких там. Пользуйтесь, кому нужно. Также хочу услышать вашу критику:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  I, X, Y, Black, White: Integer;
  AttitudeX, AttitudeY: Real;
begin
  AttitudeX := Image1.Width / Image2.Width;
  AttitudeY := Image1.Height / Image2.Height;
  for I := 0 to Image2.Height * Image2.Width - 1 do
    begin
      Black := 0;
      White := 0;
      for X:= round(I div Image2.Height * AttitudeY) to round((I div Image2.Height) * AttitudeY + AttitudeY) do
        for Y:= round(I mod Image2.Width * AttitudeX) to round((I mod Image2.Width) * AttitudeX + AttitudeX) do
          if Image1.Canvas.Pixels[X, Y] = clBlack then
            Inc(Black)
          else
            Inc(White);
      if White <= Black then
        Image2.Canvas.Pixels[I mod Image2.Width, I div Image2.Height] := clBlack
      else
        Image2.Canvas.Pixels[I mod Image2.Width, I div Image2.Height] := clWhite;
    end;
end;
Можно конечно еще поиграться с некоторыми параметрами, типо сглаживание и так далее. Пока не отлаживал на картинках разного размера, только проверил уменьшение и увеличение. Для более сильного сглаживания использую trunc вместо round и прибавляю к циклам по 1:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  I, X, Y, Black, White: Integer;
  AttitudeX, AttitudeY: Real;
begin
  AttitudeX := Image1.Width / Image2.Width;
  AttitudeY := Image1.Height / Image2.Height;
  for I := 0 to Image2.Height * Image2.Width - 1 do
    begin
      Black := 0;
      White := 0;
      for Y := trunc(I div Image2.Height * AttitudeY) to trunc((I div Image2.Height) * AttitudeY + AttitudeY) + 1 do
        for X := trunc(I mod Image2.Width * AttitudeX) to trunc((I mod Image2.Width) * AttitudeX + AttitudeX) + 1 do
          if Image1.Canvas.Pixels[X, Y] = clBlack then
            Inc(Black)
          else
            Inc(White);
      if White <= Black then
        Image2.Canvas.Pixels[I mod Image2.Width, I div Image2.Height] := clBlack
      else
        Image2.Canvas.Pixels[I mod Image2.Width, I div Image2.Height] := clWhite;
    end;
end;

Последний раз редактировалось darkwellroad; 27.03.2016 в 19:09.
darkwellroad вне форума Ответить с цитированием
Старый 27.03.2016, 19:15   #18
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Canvas.Pixels[...]
гениально!

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.03.2016, 19:18   #19
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
гениально!

Дай порадоваться) Давно с этой фигней маюсь.
darkwellroad вне форума Ответить с цитированием
Старый 27.03.2016, 22:13   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

доступ к пискелям по одному это узкое место вашего кода.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание скриншотов StretchBlt Andreyy Общие вопросы Delphi 1 19.07.2011 17:44
Аналог 1С alexvav Свободное общение 13 29.03.2011 14:11
Проблема со StretchBlt в C++ Builder Master07 C++ Builder 3 11.02.2010 11:32
AlphaBlend, StretchBlt - отказывается отрисовавывать HDC BOBAH13 Win Api 0 17.01.2010 18:42
Аналог try. beemoto Общие вопросы Delphi 16 16.12.2009 18:33