powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
21 сообщений из 21, страница 1 из 1
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37203882
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще конечно с "достойным" примером (прилагается).
Есть произвольная графика (in.tif в примере 2386х1620, ориентация -альбом).
Вписываем ее в вертик. лист 1728х2340 и располагаем по центру.
Наконец получилось (пока без вращения).

Проблему пока не могу решить такую: подложка (поля) получается черная, а нужна белая.
Полагаю проблема где-то здесь, но вчера за несколько часов ничего не родил:
Код: plaintext
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.
Public Sub SaveMultiFrameAs1bppTIFFfax( _
   ByVal FileName As String, _
   Optional ByVal startFrame As Long =  0 , Optional ByVal endFrame As Long =  0 , _
   Optional ByVal DpiX As Single =  0 , Optional ByVal DpiY As Single =  0 , _
   Optional ByVal eTifCompression As TifCompressionType = TiffCompressionNone)

    With bmiDst.bmiHeader
        .biSize = LenB(bmiDst.bmiHeader)
        If DpiX =  204  And DpiY =  196  Then
            .biWidth =  1728  'nSrcWidth
            .biHeight =  2340  'nSrcHeight * dHeightScale
        ElseIf DpiX =  204  And DpiY =  98  Then
...
        End If
        .biPlanes =  1 
        .biBitCount =  1 
        .biCompression = BI_RGB
    End With
    With bmiDst.bmiColors( 1 )
        .rgbBlue =  255 
        .rgbGreen =  255 
        .rgbRed =  255 
    End With
    hbmDst = CreateDIBSection( 0 , bmiDst, DIB_RGB_COLORS, pBits,  0 ,  0 )
 
    hdcDst = CreateCompatibleDC( 0 )
    hbmOldDst = SelectObject(hdcDst, hbmDst)

Чтобы из in.tif (или любой другой bmp/jpg/tiff итп ) получить out.tif,
надо мышкой кинуть исх. картинку на exe и нажать Save (можно выбрать диапазон страниц, если исх. уже многостраничный tiff)

Первый вопрос:
как сделать "фон" белым?

Доп. вопросы (сразу):
1) как развернуть "альбомную" картинку в "портрет" (А4 вертикально)
2) там используется "черно-белый" при сохранении. Если конвертировать цветную картинку, то будет "сильно намазано черным", нормальные "принтеры" делают "в градациях серого" (при этом результирующий tiff будет того же формата что и у меня, но картинка будет смотреться совершенно по-другому). Позже могу скинуть примеры таких конвертаций. Т.е. как это облагородить?
3) как сделать tiff с параметром Reversed Bit Order (желательно), если конечно винды через из фильтры это вообще умеют.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37204784
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так что, неужели никто не знает
как это
hdcDst
в белый цвет закрасить?
если уж оно изначально черным создается?
Или мне в ресурсы белый лист запихивать и делать ему render по желаемому размеру? чет не то..
вроде уж целиком проект выложил

Ну, вообще-то по всем признакам это белый:
Код: plaintext
1.
2.
3.
4.
    With bmiDst.bmiColors( 1 )
        .rgbBlue =  255 
        .rgbGreen =  255 
        .rgbRed =  255 
    End With
В google ничего не нашел, уж больно слово white распространенное
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37204870
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> Ну, вообще-то по всем признакам это белый:
> With bmiDst.bmiColors( >> 1 << )

Белый, то белый. Но это второй элемент массива. А первый элемент не пробовал устанавливать?



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205014
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
если сделать еще и так
Код: plaintext
1.
2.
3.
4.
    With bmiDst.bmiColors( 0 )
        .rgbBlue =  255 
        .rgbGreen =  255 
        .rgbRed =  255 
    End With
то будет черный квадрат, но уже вообще без возможности наложения рисунка

Или знаешь ответ?
Я не думал, что это так сложно. Эту ф-цию изначально Бенедикт подогнал, но изначально речь шла лишь о растяжении картинки по вертикали в 2 раза и сохранении в BMP напр.(это все есть в проекте), а не о проекции любой картинки на A4.

По идее если взять другой
picSrc2 As IPictureDisp
чисто белый, то перед наложением основной картинки
можно сделать
picSrc2.Render CLng(hdcDst), <этот белый кусок размазать в размер листа>
и это будет workaround

...счас думаю как родить эту "белую ворону", по идее подойдут
CreateGradientBackground (белый, белый, белый.....) опять же от Бенедикта
этой (по)пыткой счас и занимаюсь...

Но это уже двойное извращение, там скорее всего надо правильно задать структуру..знать бы как.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205111
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 по идее подойдут
CreateGradientBackground (белый, белый, белый.....) опять же от Бенедикта
picSrc2.Render CLng(hdcDst), <этот белый кусок размазать в размер листа>
Ну, так то конечно получилось, хотя и фигня полная
Set g_picBackground = CreateGradientBackground(Form1.hWnd, 1, 2000, vbWhite, vbWhite, vbWhite)
потому что Form1.hWnd -бред сивой кобылы
А если делать 10,10 вместо 1,2000 то полоска снизу остается

За отсутствием понимания как сделать сразу нормально, бухаем в ведро все че есть под рукой.
Хотелось бы нормально.

Короче чего намешал, во вложении.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205130
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> Или знаешь ответ?


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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205135
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> With bmiDst.bmiColors(0)
> .rgbBlue = 255
> .rgbGreen = 255
> .rgbRed = 255
> End With
> то будет черный квадрат, но уже вообще без возможности наложения рисунка

А кстати! а если поменять цвета местами. Белый по нулевому индексу, а черный по первому. Что получится?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205207
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносА кстати! а если поменять цвета местами. Белый по нулевому индексу, а черный по первому. Что получится?
Ага,Творческий подход...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    With bmiDst.bmiColors( 0 )
        .rgbBlue =  255 
        .rgbGreen =  255 
        .rgbRed =  255 
    End With
    With bmiDst.bmiColors( 1 )
        .rgbBlue =  0 
        .rgbGreen =  0 
        .rgbRed =  0 
    End With
Будет
1) черный фон как и раньше
2) наложение рисунка в негативе

Игорь, можешь сам поиграться, че гадать. Первый проект.

>для изменения фона нужно было
>перекрашивать. Или кистью с нужным цветом
Делать это по пикселям наверно глупо

>или копированием откуда-то кусочка нужного цвета
по сути я это и сделал во втором примере
Тогда так:

Как сделать программно белоснежный As IPictureDisp ?
Без извращений с "градиентами"?
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205289
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> Игорь, можешь сам поиграться, че гадать. Первый проект.


Нету у меня VB а подключать к VBA нет времени

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205426
шёл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Declare Function PatBlt Lib "gdi32" ( _
    ByVal hDC As Long, _
    ByVal x As Long, ByVal y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, _
    ByVal dwRop As Long) As Long
Public Const WHITENESS = &HFF0062

Public Sub Test1()
Dim cDib As New cDIBSection
Dim cDibPic As New cDIBSection
Dim dblVal As Double

cDibPic.CreateFromPicture LoadPicture("файл-исходник.JPG")
cDib.Create  1728 ,  2340 
dblVal = cDib.Width / cDibPic.Width
PatBlt cDib.hDC,  0 ,  0 , cDib.Width, cDib.Height, WHITENESS 'красим белым
cDibPic.StretchPicture cDib.hDC,  0 ,  0 , cDibPic.Width * dblVal, cDibPic.Height * dblVal
cDib.SavePicture  "файл-результат.bmp"

Set cDib = Nothing
Set cDibPic = Nothing
End Sub

Использован класс "cDIBSection". Взят на www.vbaccelerator.com и доработан по совету Бенедикта.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205579
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шёл,

Пасиб.
Ик, и на душе сразу повеселело.
Из всего сказанного мне нужна была одна строчка:
Код: plaintext
1.
2.
3.
4.
5.
    PatBlt hdcDst,  0 ,  0 , bmiDst.bmiHeader.biWidth, bmiDst.bmiHeader.biHeight, WHITENESS 'красим белым т.к. он гад черный
    picSrc.Render CLng(hdcDst),  0 , _
       CLng(bmiDst.bmiHeader.biHeight - (bmiDst.bmiHeader.biHeight - picSrc.Height * bmiDst.bmiHeader.biWidth / picSrc.Width) /  2 ), _
       CLng(bmiDst.bmiHeader.biWidth), -CLng(picSrc.Height * bmiDst.bmiHeader.biWidth / picSrc.Width), _
        0 &,  0 &, CLng(picSrc.Width), CLng(picSrc.Height), ByVal  0 &
ну и т.д.

Ну, еще как бы вопросы остались:
Дмитрий77Доп. вопросы (сразу):
1) как развернуть "альбомную" картинку в "портрет" (А4 вертикально)
2) там используется "черно-белый" при сохранении. Если конвертировать цветную картинку, то будет "сильно намазано черным", нормальные "принтеры" делают "в градациях серого" (при этом результирующий tiff будет того же формата что и у меня, но картинка будет смотреться совершенно по-другому). Позже могу скинуть примеры таких конвертаций. Т.е. как это облагородить?
3) как сделать tiff с параметром Reversed Bit Order (желательно), если конечно винды через из фильтры это вообще умеют.
+конечно интеллект, когда переворачивать, когда нет, как лучше вписывать, но на это думаю мозгов хватит, основное это
1) и 2)
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205865
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не врубаюсь как развернуть на 90 градусов.
Вот нашел пример:
http://www.activevb.de/tipps/vb6tipps/tipp0661.html
Код: plaintext
        retStatus = Execute(GdipCreateFromHDC(Picture1.hdc, lngGraphics))
Но у меня то никаких Picture1 нету
Есть
picSrc As IPictureDisp (a x b)
по логике
надо из него сделать
picSrc2 As IPictureDisp (b x a)
и полученную picSrc2 уже рендерить на целевой битмап.
Но у picSrc нету hdc т.е. не понятно к чему привязывать lBitmap (который используется в процессе вращения), и потом у меня a не = b.
Т.е. как быть? Где взять hdc на кот. вертеть? В PictureBox вписывать picSrc и вертеть сначала??
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37205875
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

у меня пока аврал.

Касательно заливки фона - PatBlt() откопали, можно FillRect():
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Declare Function GetStockObject Lib "gdi32" ( _
   ByVal nIndex As Long) As Long
Private Const WHITE_BRUSH =  0 
Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type
Private Declare Function FillRect Lib "user32" ( _
   ByVal hDC As Long, lpRect As RECT, ByVal hBrush As Long) As BOOL

...

 Dim rcDst As RECT
 rcDst.Right = bmiDst.bmiHeader.biWidth
 rcDst.Bottom = bmiDst.bmiHeader.biHeight
 FillRect hdcDst, rcDst, GetStockObject(WHITE_BRUSH)
Касательно поворота. Если есть MS Access, то см. один из вариантов (GDI) в приложенной базе в районе вызова SetWorldTransform().
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37206670
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,

спасибо что откликнулись

Access есть, но с тем примером разобраться не сумел.
Пошел по "немецкому примеру".
Попытался все сделать в PictureBox, чтобы заранее не поганить ваш класс, продублировал GDI-декларации в форму.
Что cделал:
1) загрузил первую страницу в PictureBox с применением Zoom (чтоб было видно на мелкой картинке че происходит)
2) Применил "немецкий алгоритм"
Код: plaintext
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.
Private Sub CommandRotate_Click()
    Dim retStatus As Long
    Dim lngGraphics As Long
    Dim lBitmap As Long
    Dim sngWidth As Single
    Dim sngHeight As Single
    Dim sngAngle As Single
    Dim EncoderCLSID As GUID
    Dim uEncParams  As EncoderParameters1
    
    retStatus = Execute(GdipCreateFromHDC(PictureFax.hDC, lngGraphics))
    If retStatus = OK Then
        retStatus = Execute(GdipCreateBitmapFromHBITMAP( _
        PictureFax.Picture.Handle,  0 , lBitmap))
        If retStatus = OK Then
            Call Execute(GdipGetImageDimension(lBitmap, sngWidth, _
              sngHeight))
            sngAngle =  90 
            Call Execute(GdipRotateWorldTransform(lngGraphics, _
              sngAngle, MatrixOrderPrepend))
            Call Execute(GdipTranslateWorldTransform(lngGraphics, _
              sngWidth \  2 , sngHeight \  2 , MatrixOrderAppend))
            Call Execute(GdipDrawImageRect(lngGraphics, lBitmap, _
              sngWidth \  2 , sngHeight \  2 , -sngWidth, -sngHeight))
            Call Execute(GdipResetWorldTransform(lngGraphics))
            GetEncoderClsid "image/bmp", EncoderCLSID
            Call Execute(GdipSaveImageToFile(lBitmap, _
              StrPtr(App.Path & "\bitmap.bmp"), _
              EncoderCLSID, _
              uEncParams))
            ' Destroy the bitmap
            Call Execute(GdipDisposeImage(lBitmap))
            Call Execute(GdipDeleteGraphics(lngGraphics))
        End If
    End If
    
End Sub

Что могу сказать: повернутая картинка отрисовывается поверх PictureFax.hDC (накладывается), но при этом
lBitmap я так понимаю это исходная (горизонтальная) картинка потому как GdipSaveImageToFile сохраняет исходник (хотя и масштабированный, ну понятно, я ж с PictureBox работаю).
То же самое если делать:

Код: plaintext
1.
2.
Private Sub CommandSavePic_Click()
    SavePicture PictureFax.Picture, App.Path & "\pic.bmp"
End Sub

Т.е. посмотрели на наше произведение, и хватит, даже сохранить не получится.

Мне по сути надо что:
Public Sub SaveMultiFrameAs1bppTIFFfax(... -которая в классе
У меня есть исходный Frame(i) который As IPictureDisp так? У него размер a х b
Если я на основании анализа размеров a и b принимаю решение о его довороте на 90 градусов,
то мне нужно сделать из него другой FrameTemp As IPictureDisp b х a
т.е. нужна функция
Код: plaintext
1.
GetRotate90IPictureDisp (InFrame As IPictureDisp ) as IPictureDisp
FrameTemp = GetRotate90IPictureDisp (Frame(i)) 
А дальше уже работать с "повернутым" объектом FrameTemp
т.е. проецировать FrameTemp на целевой bitmap nBitmap(i) с его hdcDst
с форматированием/масштабированием
Код: plaintext
1.
2.
picSrc=FrameTemp  'b х a вместо a x b
...
picSrc.Render CLng(hdcDst),

Т.е. вопрос по сути сводится к:
Как написать ф-цию GetRotate90IPictureDisp, кот. очевидно должна использовать механизмы из Private Sub CommandRotate_Click (код что выше)?
Увязать все это мне пока не по зубам...
(На всякий случай текущий проект во вложении)
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37206756
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, пока понял чтоб отрисовать перевертыш в левом верхнем углу hdc надо
Код: plaintext
1.
           Call Execute(GdipTranslateWorldTransform(lngGraphics, _
              sngWidth \  2 , sngHeight \  2 , MatrixOrderAppend))
заменить на
Код: plaintext
1.
            Call Execute(GdipTranslateWorldTransform(lngGraphics, _
              sngHeight \  2 , sngWidth \  2 , MatrixOrderAppend))
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37206942
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще пример разворота:
Как повернуть растровое изображение в 90-степень изменения
но это все с одного hdc на другой hdc перекатать,
а у меня IPictureDisp на входе и мне нужен IPictureDisp на выходе,
т.е. нечего подать на вход (ну если только с PictureBox извращаться), и не за что ухватиться на выходе, потому что hdc это мыльный пузырь.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37207361
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

пока короткий комментарий:
1) пример ужасен - BitBlt для каждой точки;
2) если делать ни от чего, кроме своего параметра, не зависящую функцию GetRotate90IPictureDisp(InFrame As IPictureDisp ) As IPictureDisp, то внутри будет слегка зоопарк из-за отсутствия в GDI универсального копирования формата битмапа;
3) >Т.е. посмотрели на наше произведение, и хватит, даже сохранить не получится.
Должно лечиться
Код: plaintext
1.
PictureFax.AutoRedraw = True 'Не забывать Refresh по окончанию отрисовки
SavePicture PictureFax.Image, ...
, но рисовать на экране, конечно же, не стоит иначе чем в целях отладки;
4) что значит "мыльный пузырь"? CreateCompatibleDC(), и получается memory DC.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37207399
Дима77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт1) пример ужасен - BitBlt для каждой точки;
4) что значит "мыльный пузырь"? CreateCompatibleDC(), и получается memory DC.
Пример м.б. и ужасен, но он выводит новую картинку на другой DC
А немецкий (который видимо то же что и ваша БД) лепит на тот же DC.
В принципе у меня уже возникла идея:
Frame -> DC1 (без разворота и форматирования)
DC1->DC2 (тупой разворот без форматирования)
DC2->DC3 (подгонка/вписывание в размер)
DC3->Save
При этом параллельно с каждым DC придется еще иметь Bitmap_attached_to_DC
Ну т.е. процедуру с созданием упоминавшегося тут "черного прямоугольника" придется в общем случае утраивать.

Приду домой, попробую помучиться еще...
Но бардак у меня в голове с этими memory DC и memory Bitmap и PictureDisplay -ежли честно.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37207722
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима77А немецкий (который видимо то же что и ваша БД) лепит на тот же DC.
А ну да, можно и на другой hdc налепить.
Код: plaintext
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.
    retStatus = Execute(GdipCreateFromHDC(PictureNew.hDC, lngGraphics))
    If retStatus = OK Then
        retStatus = Execute(GdipCreateBitmapFromHBITMAP( _
        PictureFax.Picture.Handle,  0 , lBitmap))
        If retStatus = OK Then
            Call Execute(GdipGetImageDimension(lBitmap, sngWidth, _
              sngHeight))
            sngAngle =  90 
            Call Execute(GdipRotateWorldTransform(lngGraphics, _
              sngAngle, MatrixOrderPrepend))
            Call Execute(GdipTranslateWorldTransform(lngGraphics, _
              sngHeight \  2 , sngWidth \  2 , MatrixOrderAppend))
            Call Execute(GdipDrawImageRect(lngGraphics, lBitmap, _
              sngWidth \  2 , sngHeight \  2 , -sngWidth, -sngHeight))
            Call Execute(GdipResetWorldTransform(lngGraphics))
            GetEncoderClsid "image/bmp", EncoderCLSID
            Call Execute(GdipSaveImageToFile(lBitmap, _
              StrPtr(App.Path & "\bitmap.bmp"), _
              EncoderCLSID, _
              uEncParams))
            ' Destroy the bitmap
            Call Execute(GdipDisposeImage(lBitmap))
            Call Execute(GdipDeleteGraphics(lngGraphics))
            PictureNew.Refresh
        End If
    End If
Это уже лучше, будем ориентироваться на этот код.
Бенедикт3) >Т.е. посмотрели на наше произведение, и хватит, даже сохранить не получится.
Должно лечиться
Код: plaintext
1.
PictureFax.AutoRedraw = True 'Не забывать Refresh по окончанию отрисовки
SavePicture PictureFax.Image, ...

Да, правы, "лечится".
Код: plaintext
    SavePicture PictureNew.image, App.Path & "\pic.bmp"
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37208218
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,
боюсь без вас таки закопаюсь

я немного продвинулся но опять в тупике.
Что есть (в приложенном проекте):

1.Кнопка Save & Format
Вписывает (без разворота) исх. "альбом" в белый лист 1728х2340 и сохраняет в файл \out.tif
Ф-ция SaveMultiFrameAs1bppTIFFfax
Результат получается за счет проецирования исх. Frame (который As IPictureDisp) через ф-цию picSrc.Render c масштабированием (dx,dy) и заданием положения (x0,y0) на заранее заготовленном hdc-листе размера 1728х2340

2. Кнопка Save & Rotate
Просто переворачивает "альбом" (a x b) в "портрет" (b x a) и сохраняет в файл \outrotate.tif
Ф-ция SaveMultiFrameAs1bppTIFFRotateOnly
Результат получается за счет GDI-разворота исх. Frame без масштабирования и проецирования развернутой картинки на заранее заготовленном hdc-листе размера b х a

3. Кнопка Rotate
Для теста. Делает то же что и пункт 2 но рисует повернутое изображение на hdc соседней картинки PictureNew.

Проблема в следующем: мне надо эти 2 действия совместить, т.е.
1) развернуть
2) вписать в размер 1728х2340

Но чтобы вписать в размер, мне нужно применить picSrc.Render,
а объекта picSrc As IPictureDisp у меня на выходе из разворота то и нету.
Я сделал попытку намалевать ф-цию
Код: plaintext
Public Function RotateFrame90As1bppAsIPictureDisp(ByVal i As Long) As IPictureDisp
(она есть в модуле класса)
но она получилась дохлой, с учетом ваших предыдущих негативных комментариев я даже не стал пытаться ее лечить.

Мне кажется ,
что можно все сделать в одно действие

Код: plaintext
1.
            Call Execute(GdipDrawImageRect(lngGraphics, lBitmap, _
               0 ,  0 , -sngWidth, -sngHeight))

думается мне имеет 4 аргумента (x,y)-верхний левый угол; (dx,dy)-в какую ширину+высоту вписывать lngGraphics.
Но как я не игрался со всеми аргументами всех функций, ответственных за разворот,
у меня ничего не получается, т.е. картинка съезжает, изменяет размеры, но понять закономерностей не могу.
Т.е. как я по-русски понимаю
Код: plaintext
 Call Execute(GdipDrawImageRect(lngGraphics, lBitmap,  0 ,  0 ,  500 ,  1000 )
должна напр. рисовать от верхнего левого угла целевого hdc картинку шириной 500 и высотой 1000
Ничего этого не происходит, я не понимаю этой геометрии, потерял ориентацию в пространстве, абсолютно не понимаю в какой координатной системе и относит. чего я нахожусь. S O S
Предполагаю также, что "удачный разворот" удался случайно методом тыка-подбора.
...
Рейтинг: 0 / 0
Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
    #37208479
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Проблема в следующем: мне надо эти 2 действия совместить, т.е.
1) развернуть
2) вписать в размер 1728х2340
Через одно место таки решил.
Проблема в том, что при повороте с координатами чего-й то происходит, и осознать это я увы не в состоянии.
Поэтому пришлось рисовать в 2 приема (хотя сильно подозреваю что можно в один.)

2. Кнопка Save & Rotate & Format
Порачивает "альбом" (a x b) в "портрет" (b x a) и получаем hdcDst/hbmDst
Потом тупо этот hbmDst такой же процедурой (разворот на 0 градусов) проецируем на hdcDst1/hbmDst1, но уже требумого размера, но при этом уже соображаем как делать
Код: plaintext
1.
            Call GdipExec(GdipDrawImageRect(lngGraphics1, lBitmap1, _
              X0, Y0, DX, DY))
ибо координаты уже не плывут в мозгах.
Ф-ция SaveMultiFrameAs1bppTIFFRotateFax
Впрочем, если кто поможет осилить это в один прием, я стану чуть счастливее. Пока еще подожду помощи.
Теперь задумался над:
2) там используется "черно-белый" при сохранении. Если конвертировать цветную картинку, то будет "сильно намазано черным", нормальные "принтеры" делают "в градациях серого" (при этом результирующий tiff будет того же формата что и у меня, но картинка будет смотреться совершенно по-другому). Позже могу скинуть примеры таких конвертаций. Т.е. как это облагородить?
Но подозреваю что фотоэффект на 2-цветной картинке (ч/б глубина=1 а не глубина=8) делается какими-то нелинейными махинациями. Суть в чем: если уже есть такая "в сером" картинка, то мое преобразование ее не портит, а если бухаю на свой вход цветной оригинал, то на моем выходе получаю черную мазню. Хочу "в сером".
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вписать "горизонтальную" картинку в 1728х2340, черные поля, а надо чтоб были белые!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]