VB6.0を使用して在庫管理プロジェクトを開発しています。ここで、ユーザーが自分のアイテムの写真をシステムにアップロードできるようにする機能を含めたいと思います。次に、それをデータベースに保存したいと思います。また、写真のサイズを600*600に制限したいと思います。したがって、ユーザーが600 * 600 pixを超える画像をアップロードすると、システムは画像ボックスに合わせて写真のサイズを自動的に変更する必要があります。誰か助けてもらえますか?前もって感謝します。
質問する
8669 次
2 に答える
0
これを行う簡単な方法はありません。VBの標準コントロールの副作用を利用します。フォーム/UserControl/何でも取り、次のコントロールに固執します。
- 画像制御<imgPic>
- 画像コントロール<imgSize>
- PictureBoxコントロール<pctCanvas>
ファイルを開くダイアログを作成するためだけに<dlgOpen>を追加しました。
<imgPic>は、単に画像をプレビューするために使用されます。<imgSize>は、画像ファイルの幅と高さをピクセル単位で簡単に取得するために使用されます(フォームのScaleModeプロパティをvbPixelsに設定して、これを簡単に行えるようにしていることに注意してください)。<pctCanvas>は、画像のサイズを変更できるようにするためだけに使用されます。
次のコードを追加します。
Option Explicit
' Edit these if you change your mind about the photo size.
Private Const m_ksngMaxPixelsX As Single = 600!
Private Const m_ksngMaxPixelsY As Single = 600!
Private Sub cmdLoad_Click()
On Error GoTo ErrorHandler:
dlgOpen.Filter = "Picture Files|*.bmp;*.jpg;*.gif"
dlgOpen.ShowOpen
UploadPicture dlgOpen.FileName
Exit Sub
ErrorHandler:
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
Private Sub Form_Load()
Me.ScaleMode = vbPixels
pbCanvas.ScaleMode = vbPixels
imgPic.Width = m_ksngMaxPixelsX
imgPic.Height = m_ksngMaxPixelsY
imgSize.Visible = False
pbCanvas.Visible = False
pbCanvas.AutoRedraw = True
End Sub
' Get a new filename, based on the original. It will always be a BMP bitmap.
Private Function GetResizedFilename(ByRef the_sFilename As String) As String
Dim nPosDot As Long
On Error GoTo ErrorHandler
nPosDot = InStrRev(the_sFilename, ".")
GetResizedFilename = Left$(the_sFilename, nPosDot - 1) & "-resized.bmp"
Exit Function
ErrorHandler:
Err.Raise Err.Number, Err.Source, Err.Description
End Function
Private Sub ProcessPicture(ByRef the_sFilename As String, ByRef out_sProcessedFilename As String)
Dim sngPixelsX As Single
Dim sngPixelsY As Single
On Error GoTo ErrorHandler
' Get the size of our picture. Would have liked to have used a StdPicture object here, instead.
Set imgSize.Picture = LoadPicture(the_sFilename)
sngPixelsX = imgSize.Width
sngPixelsY = imgSize.Height
' If at least one of height and width is too bix, resize the biggest value down to m_ksngMaxPixels? and resize the other value proportionally.
If sngPixelsX > m_ksngMaxPixelsX Or sngPixelsY > m_ksngMaxPixelsY Then
If sngPixelsX > sngPixelsY Then
sngPixelsY = m_ksngMaxPixelsY * sngPixelsY / sngPixelsX
sngPixelsX = m_ksngMaxPixelsX
Else
sngPixelsX = m_ksngMaxPixelsX * sngPixelsX / sngPixelsY
sngPixelsY = m_ksngMaxPixelsY
End If
' Resize the canvas so that the persistent bitmap is the same size as the final picture, and then paint our picture onto that canvas, resizing down.
pbCanvas.Move 0!, 0!, sngPixelsX, sngPixelsY
pbCanvas.PaintPicture imgSize.Picture, 0!, 0!, sngPixelsX, sngPixelsY
' Get a reference to the persistent bitmap.
Set imgPic.Picture = pbCanvas.Image
out_sProcessedFilename = GetResizedFilename(the_sFilename)
SavePicture pbCanvas.Image, out_sProcessedFilename
Else
out_sProcessedFilename = the_sFilename
Set imgPic.Picture = imgSize.Picture
End If
Exit Sub
ErrorHandler:
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
Private Sub SaveToDatabase(ByRef the_sProcessedFilename As String)
Dim nFileNo As Integer
Dim abytPictureFile() As Byte
Dim nFileLen As Long
' Open the file in binary mode, resize a byte array to fit the file's contents, load it into the array, and close the array.
nFileNo = FreeFile
Open the_sProcessedFilename For Binary As #nFileNo
nFileLen = LOF(nFileNo)
ReDim abytPictureFile(1 To nFileLen)
Get #nFileNo, , abytPictureFile()
Close #nFileNo
'
' YOUR WORK INSERTED HERE
'
Exit Sub
ErrorHandler:
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
Private Sub UploadPicture(ByRef the_sFilename As String)
Dim sProcessedFilename As String
On Error GoTo ErrorHandler
ProcessPicture the_sFilename, sProcessedFilename
SaveToDatabase sProcessedFilename
Exit Sub
ErrorHandler:
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
于 2012-08-02T07:15:29.737 に答える
-1
// This will be your uploaded images folder
string target = Server.MapPath("~/ImageFolder" );
Image.GetThumbnailImageAbort thumbnailImageAbortDelegate =
new Image.GetThumbnailImageAbort(ThumbnailCallback);
foreach (UploadedFile file in RadUpload1.UploadedFiles)
{
file.SaveAs(Path.Combine(target, file.GetName()));
using (Bitmap originalImage = new Bitmap(file.InputStream))
{
// Set the resize here. You can use a constant or set a function here.
int width = 600;
int height = 600;
using (Image thumbnail = originalImage.GetThumbnailImage(width, height, thumbnailImageAbortDelegate, IntPtr.Zero))
{
string thumbnailFileName = Path.Combine(target,
string.Format("{0}_thumb{1}" , file.GetNameWithoutExtension(), file.GetExtension()));
thumbnail.Save(thumbnailFileName);
}
}
}
于 2012-08-02T06:29:18.277 に答える