Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#31: 2008-01-11 18:26:43 ЛС | профиль | цитата
Galkov, вообще-то я рассчитывал на рисование не только в контекстах, но и получение отдельной картинки изображения и копии наложения.

------------ Дoбавленo:


Вот скажи, что здесь лишнее


#pas
procedure MyCallback(pCtx:pointer; pUserData:pointer); stdcall;
var pCls:THiImageLoader; stat:DWORD; sz:TSize; bmp:PBitmap; Rect:TRect;
hdcMem: HDC;
hdcBmp: HBITMAP;
begin
pCls := THiImageLoader(pUserData);
pCls.FImgCtx.GetStateInfo(stat, sz, 0);
bmp := NewDIBBitmap(sz.cx, sz.cy, pf32bit);
Rect := MakeRect(0, 0, sz.cx, sz.cy);

// вывод чистого полученного изображения
pCls.FImgCtx.Draw(bmp.Canvas.Handle, Rect);
_hi_OnEvent(pCls._event_onLoad, bmp);

if pCls.valid then begin
bmp.Free;
hdcMem:= CreateCompatibleDC(0);
hdcBmp:= CreateCompatibleBitmap(pCls.DC, pCls.wsz, pCls.hsz);
SelectObject(hdcMem, hdcBmp);
// получение копии изображения контекста
BitBlt(hdcMem, 0, 0, pCls.wsz, pCls.hsz, pCls.DC, 0, 0, SRCCOPY);

// наложение полученного изображения на копию со вписыванием в клиентский прямоугольник
if (sz.cx * 100) div sz.cy > (pCls.wsz * 100) div pCls.hsz then begin
pCls.FImgCtx.StretchBlt(hdcMem, 0, (pCls.hsz - (pCls.wsz * sz.cy) div sz.cx) div 2, pCls.wsz, (pCls.wsz * sz.cy) div sz.cx, 0, 0, sz.cx, sz.cy, SRCCOPY);
end else begin
pCls.FImgCtx.StretchBlt(hdcMem, (pCls.wsz - (pCls.hsz * sz.cx) div sz.cy) div 2, 0, (pCls.hsz * sz.cx) div sz.cy, pCls.hsz, 0, 0, sz.cx, sz.cy, SRCCOPY);
end;

bmp := NewDIBBitmap(pCls.wsz, pCls.hsz, pf32bit);

// возврат полученного наложения на контекст
BitBlt(pCls.DC, 0, 0, pCls.wsz, pCls.hsz, hdcMem, 0, 0, SRCCOPY);
// копия наложения для вывода
BitBlt(bmp.Canvas.Handle, 0, 0, pCls.wsz, pCls.hsz, hdcMem, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
DeleteObject(hdcBmp);
end;

_hi_OnEvent(pCls._event_onCopyLoad, bmp);
bmp.Free;
SetEvent(pCls.hOK);
end;
карма: 22

0
Ответов: 9906
Рейтинг: 351
#32: 2008-01-11 20:26:59 ЛС | профиль | цитата
nesco писал(а):
Исправлено

Молодцы, чего уж сказать

Это называется "технология откатов". Которая не имеет ограничений во времени, т.е., может продолжаться бесконечно
Правильная логика такая:
1) у произошедшего есть причины (за исключением полного дурдома)
2) причины узнаются, устанавливаются правильные (возможно - те же, что и у автора, возможно - другие)
3) только после этого делается "откат", если к этому времени его необходимость сохранила очевидность.

То же самое на более абстрактном уровне: действия совершаются исходя из знания, а не наоборот
В данном случае: что-то сделано, с большой вероятностью неправильно, почему - фиг его знает
Так вот, пока "фиг его знает", действия противопоказаны. За исключением случая, когда восстановление причин невозможно

Извините, но в противном случае это не называется совместной работой.
Хотите верьте, хотите - нет
Надо же хоть как-то уважать друг-друга

карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#33: 2008-01-11 21:32:04 ЛС | профиль | цитата
Galkov, я бы не стал исправлять, если бы не

Dilma писал(а):
это определенно не верно, следует исправить

Т.е. подтверждение на исправление.

Galkov писал(а):
Надо же хоть как-то уважать друг-друга
И это верно, обязательно надо.

Давай сделаем так. Откатили, подождем результата ответов от Автора исправления, приведшего к установленным артефактам. Если поддтверждения не будет, оставим откат, если убедит в обратном, будем думать дальше.

------------ Дoбавленo:


Nic, насколько понял, это -- твое творчество с уменьшением размера копирования в ScreenShort'e. Убедительна просьба объяснить для чего?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#34: 2008-01-11 21:32:17 ЛС | профиль | цитата
Ну хорошо
Я задам вопрос (и отвечу на него сам), на который нужен Логический ответ - да или нет:
Имеет ли право человек, правки которого подверглись "откату" без комментариев, считать, что его держат за недоумка, способного вносить эти правки без серьезных причин, лишь потому-что правой ноге так захотелось

Я считаю, что имеет.
Безо всяких если бы.
А ты: ДА, или НЕТ
И если я где-то так поступил (бог его знает - все не упомнишь), ну значит и я был не прав, только и всего
Никаких эмоций
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#35: 2008-01-11 22:15:33 ЛС | профиль | цитата
Galkov, извини, конечно, но почему у тебя не исправленный компонент, а старый? Так нельзя ставить вопрос, если исправления приводят к артефактам в других местах, то исправления должны быть, или отткачены назад, или исправлены дальше. Разве плодить баги поверх других багов, это -- хорошо
И,
Galkov писал(а):
Никаких эмоций

А на это,
Galkov писал(а):
Я считаю, что имеет.
Безо всяких если бы.
А ты: ДА, или НЕТ

Я затруднюсь ответить, наверное, все же -- имеет.

Давай оставим этот вопрос, пока, открытым. Бага обнаружена и убрана откатом, и обратного -- не доказано. Надо ждать ответа от Автора исправлений, что бы в дальнейшем от других не было лишних вопросов, как у меня возникли -- а почему это черные линии появились, которых не должно быть, в принципе.

Вернемся к нашим баранам

Вот исправленный метод, количество шаманских плясок вокруг контекста уменьшено до трех (меньше, ну никак, не получается)


#pas
procedure MyCallback(pCtx:pointer; pUserData:pointer); stdcall;
var pCls:THiImageLoader; stat:DWORD; sz:TSize; bmp:PBitmap; Rect:TRect;
begin
pCls := THiImageLoader(pUserData);
pCls.FImgCtx.GetStateInfo(stat, sz, 0);
bmp := NewDIBBitmap(sz.cx, sz.cy, pf32bit);
Rect := MakeRect(0, 0, sz.cx, sz.cy);
pCls.FImgCtx.Draw(bmp.Canvas.Handle, Rect);
_hi_OnEvent(pCls._event_onLoad, bmp);
if pCls.valid then begin
if (sz.cx * 100) div sz.cy > (pCls.wsz * 100) div pCls.hsz then begin
pCls.FImgCtx.StretchBlt(pCls.DC, 0, (pCls.hsz - (pCls.wsz * sz.cy) div sz.cx) div 2, pCls.wsz, (pCls.wsz * sz.cy) div sz.cx, 0, 0, sz.cx, sz.cy, SRCCOPY);
end else begin
pCls.FImgCtx.StretchBlt(pCls.DC, (pCls.wsz - (pCls.hsz * sz.cx) div sz.cy) div 2, 0, (pCls.hsz * sz.cx) div sz.cy, pCls.hsz, 0, 0, sz.cx, sz.cy, SRCCOPY);
end;
bmp.Free;
bmp := NewDIBBitmap(pCls.wsz, pCls.hsz, pf32bit);
BitBlt(bmp.Canvas.Handle, 0, 0, pCls.wsz, pCls.hsz, pCls.DC, 0, 0, SRCCOPY);
end;
_hi_OnEvent(pCls._event_onCopyLoad, bmp);
bmp.Free;
SetEvent(pCls.hOK);
end;

И еще, я жду дальнейших рекомендаций по добавлению свойств массштабировани и копирования
карма: 22

0
Ответов: 9906
Рейтинг: 351
#36: 2008-01-11 22:21:42 ЛС | профиль | цитата
nesco писал(а):
Вот скажи, что здесь лишнее

Вообще-то я сказал: лишние 4 рисования из пяти
А правильный и абсолютно точный ответ на этот вопрос зависит от постановки задачи
Я ее понимаю так (по крайней мере, любая должна удовлетворять этому требованию), что рисование, как самая напряжная операция - должно быть одно, и ни в коем случае не "на всякий случай"
Боцман за такое, вообще, сразу бил канделябрами по голове...

Твоя постановка не известна, но появляются все более серьезные подозрения, что она пристекает из неправильного понимания работы винды...
Вот как ты думаешь, почему я не стал отвечать на этот идиотский вопрос (точнее сказал, что он не понятен)
nesco писал(а):
Почему рисунок не закрепляется на контексте

Потому-что прямой ответ на него, не менее идиотский: а никто и не обещал что что-то где-то будет закрепляться.
Винда ничего сама не рисует вообще, она посылает сообщения из серии WM_PAINT, а рисуют приложения (или контролы, которые входят в это приложение)
Обрабатывай onPaint - и все "закрепится"
И вместо "рисования на хэндле" подключай рисование к обработчику onPaint, и делай Invalidate при необходимости (при изменении состояния "рисователя")

А закрепить на "чужом" - и не пытайся, только вирусная техника, видимо (внедрение своего кода в чужой процесс, того самого обработчика WM_PAINT)

А теперь посмотри внимательно на коды использования этого ActiveX
РТМ я конечно не читал (не я же элемент делаю), но подозреваю, что LoadFile отделен от SelectChanges не просто так, а со смыслом...
Одним подключить файл, а другим - рисовать по некому событию (это фантазии, конечно)
Спроси наконец tsdima где прочитать про него...
------------ Дoбавленo:

nesco писал(а):
но почему у тебя не исправленный компонент, а старый?

Я сто лет не обновлялся уже
Занят попросту
На работе перманентный аврал, по нашей теме: куча букварей еще не изучена - в свободное время изучаю...
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#37: 2008-01-11 22:27:32 ЛС | профиль | цитата
Galkov писал(а):
Твоя постановка не известна
Постановка задачи такова:

1. Получить изображение из файла.
2. Отдать изображение без изменения размера в поток как картинку, для дальнейшей обработки.
3. Отрисовать на окне предпросмотра (если оно доступно).
4. Снять копию окна (или сторонней картинки), если оно доступно.
5. Отрисовать на копии с масштабированием полученное изображение (это нужно для получения прозрачности на любом фоне)
6. Отдать копию с отрисовкой как картинку в поток для дальнейшей обработки.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#38: 2008-01-11 22:27:47 ЛС | профиль | цитата
nesco писал(а):
Вернемся к нашим баранам

Только сверху, а не снизу
Отвечая на вопрос ЧТО хочу, а не КАК я хочу это (непонятно что) сделать
Вот и ответь СЛОВАМИ: этот метод в сочетании с таким набором св-в для такого применения, этот для такого
Многое станет понятнее: что есть умно, а что глупо, и сколько и чего для умного надо...

Хотя я считал, что "наши бараны" в этом топике - различного типа конверторы, и нужна ли им кодовая страница, как аргумент...
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#39: 2008-01-11 22:29:57 ЛС | профиль | цитата
Galkov, если не трудно, раздели тему, а то она плавно переросла в ImageLoader
карма: 22

0
Ответов: 9906
Рейтинг: 351
#40: 2008-01-11 22:30:28 ЛС | профиль | цитата
1 - не вызывает вопросов
2 - зачем (а вдруг пригодится - не устраивает)
3 - зачем (а вдруг пригодится - не устраивает)
4 - зачем (а вдруг пригодится - не устраивает)
5 - зачем (а вдруг пригодится - не устраивает)
6 - зачем (а вдруг пригодится - не устраивает)

карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#41: 2008-01-11 22:41:23 ЛС | профиль | цитата
Galkov, просьба из 2...6 выбрать что-то одно. А то возникает вопрос, а куда считанное изображение девать. В реализации IC мы его выводили уменьшенным и масштабируемым в поток для получения эскизов изображений с множества файлов, вот тут контекст чужого окна и нафиг не нужен был. Это была реальная задача, которую и решили. Значит, 2-е нужно обязательно.
Насчет отрисовки на стороннем окне -- про полную прозрачность давно просили на форуме, так что вопрос тоже нельзя снимать с повестки дня.
Сразу возникает вопрос, а можно ли отрисовать просто на картинке без оформления окна, вот тут и нужна копия сторонней картинки для отрисовки (у меня эти методы объединены в один). А теперь возникает следующий вопрос -- у меня нет окна, как получить наложение. только выводом копии с отрисовкой в поток. Вот тут как раз и осталось у меня три метода отрисовки. Можно дальше оптимизировать код и свести все к одной отрисовке в сессии (максимум -- к двум)
карма: 22

0
Ответов: 9906
Рейтинг: 351
#42: 2008-01-11 23:27:52 ЛС | профиль | цитата
nesco писал(а):
Значит, 2-е нужно обязательно

Да не факт. В этой задаче у тебя все 6 контекстов заранее существуют - нарисуй на них, и всего делов.
Это гораздо проще чем создать bitmap, совместимый с ним контекст, отрисовать на нем, потом уже этот bitmap отрисовать на том самом, заранее уже существующем контексте, и наконец изничтожить и контекст и bitmap
Я правильно перечислил то, чего делается сегодня
Неужели не видно разницы...

nesco писал(а):
Насчет отрисовки на стороннем окне -- про полную прозрачность давно просили на форуме, так что вопрос тоже нельзя снимать с повестки дня

Что ты называешь сторонним окном
Если чужого процесса, то просьбы не есть аргументы...
Я вон летать хочу, а на работу езжу на электричке
Аргументы - это хотя бы идеи о принципиальной осуществимости.
Если своего процесса - подключай рисование (а не загрузку файла) к onPaint, сказал уже
Это опять то же самое одно рисование, что и в первом случае, и никакого зверинца из объектов создавать с последующим уничтожением -- не надо.
Как мне кажется

nesco писал(а):
а можно ли отрисовать просто на картинке без оформления окна, вот тут и нужна копия сторонней картинки для отрисовки

Может я тупой, но мне всегда казалось, что рисуют не на картинке, а на контексте
И чем отличается рисование на картинке (хоть с окном, хоть без - назначения сей качественной характеристики мне тоже не ведомо) от рисования на Bitmap.Canvas.Handle - пока не догадываюсь....

nesco писал(а):
А теперь возникает следующий вопрос -- у меня нет окна, как получить наложение. только выводом копии с отрисовкой в поток

Ну не понимаю я этих словосочетаний
Ты говорить как нормальный человек попробуй все-таки...
Ну и, естественно - не возникает у меня таких вопросов


------------ Дoбавленo:

В общем, никак не пойму проблемы....

  • В любом мыслимом варианте ты имеешь контекст: либо окна, либо совместимый с картинкой
  • Рисуешь на нем ОДИН раз способом, определяемым св-вами элемента
  • Точка
    Вопрос: в чем я заблуждаюсь
  • карма: 9

    0
    Разработчик
    Ответов: 26163
    Рейтинг: 2127
    #43: 2008-01-12 14:41:54 ЛС | профиль | цитата
    Galkov писал(а):
    Может я тупой, но мне всегда казалось, что рисуют не на картинке, а на контексте
    И чем отличается рисование на картинке (хоть с окном, хоть без - назначения сей качественной характеристики мне тоже не ведомо) от рисования на Bitmap.Canvas.Handle - пока не догадываюсь....


    Ну да, так и сделано. Я чего-то заговорился, по-моему

    Galkov, а что, дельные мысли кинул. Сечас попробую упростить.

    ------------ Дoбавленo:


    Ну вот создал -- ver 1.50.

    Не более одной отрисовки в сессии. Если нет Handle окна или Bitmap'a, то в поток выдается полученная картинка.
    Изображение можно вписывать как во все окно, так и в клиентский прямоугольник, координаты которого определены точками сверху, в любой части окна или Bitmap'a. На окнах и Bitmap'ах поддерживается прозрачность отрисовки форматов PNG и GIF.

    В архиве два примера -- с простой отрисовкой на окне и с мультизагрузкой файлов изображений. В качестве фиксатора изображения на контексте применен ScreenShort, ну это -- кому как нравится.

    Поддерживает оба компилятора.
    Требуется протестировать, если все будет нормально, будем добавлять в пакет.

    Не обращайте внмания на размер, это столько весит не компонент, а примеры.

    ------------ Дoбавленo:


    Galkov, и чего скажешь
    карма: 22

    0
    файлы: 1imageloader_1_50.zip [83.5KB] [227]
    Ответов: 63
    Рейтинг: -5
    #44: 2008-03-15 15:29:43 ЛС | профиль | цитата
    Спасибо автору за компонент imageloader.

    Заметил, что на названиях с неправильной кодировкой вылетает run time, к примеру: FuЯball.jpg
    hmьller.jpg
    А в целом, работает отлично.
    карма: 1

    -1
    Голосовали:iarspider
    Ответов: 9906
    Рейтинг: 351
    #45: 2008-03-15 15:56:50 ЛС | профиль | цитата
    Артем писал(а):
    Заметил, что на названиях с неправильной кодировкой

    Ну и что, что заметил
    Ровно до тех пор, пока это "заметил" не будет изложено по правилам отсюда:
    Почему-то не отвечают
    - твое "заметил", будет называться ФЛУД-ом
    карма: 9

    1
    Голосовали:iarspider
    45
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)